虎皮鹦鹉,穿透屋顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳搭配的100种方法

admin 5个月前 ( 07-18 06:16 ) 0条评论
摘要: 此外,不少居民主要生活在偏远的农村,那里实体银行基础设施建设普遍匮乏。鉴于上述问题,无数金融科技竞相涌现,旨在利用日趋升高的手机普及率与性价比来建立数字经济。...
全文共9825字,估计学习时长40分钟或更长


图片来历:me.me


在撒哈拉以南的非洲多地,银行普及率低是遍及现象。这是由(但不限于)以下要素形成:当皋比鹦鹉,穿透房顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳调配的100种办法地居民出于前史原因对银行组织的不信任、低且不安稳的居民收入和身份档案的不完善。此外,不少居民首要生活在偏僻的乡村,那里实体银行根底设施建造遍及匮乏。


鉴于上述问题,很多金融科技竞相呈现,旨在运用日趋升高的手机普及率与性价比来树立数字经济,为撒哈拉以南非洲公民面对的窘境供给良方。


人们信任,这些金融科技会带来净正面效益,特别是促进移动买卖/无现金买卖量的增加,下降带着现金的安全危险,并进步买卖的便利性,从而促进经济活动的整体增加。关于非正式买卖较多的国家而言,移动买卖会让逃税行为降至最低,增加商业运作透明度。


在津巴布韦,多亏了移动付出,政府才干向非正规企业纳税,即经过Ecocas皋比鹦鹉,穿透房顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳调配的100种办法h(津巴布韦头号移动付出渠道)对全部买卖活动纳税。税为国之本,一个国家能够在其他范畴一无可取,但绝不能疏于税收。


图片来历:9gag


做出幻想


移动骑弹飞翔付出的好处十分多,但有个问题不能疏忽:试想在一个非洲国家,比方说瓦坎达,有一家付出公司致力于促进多方付出。就在快捷无缝的移动付出开展得如火如荼时,移动付出的一个坏处暴露了出来——网络诈骗。


幻想一下,有一天你收到一封自称为尼日利亚王子的来信,并表明能够让你帮个小忙(比方给他汇一笔小钱)之后就能得到一笔巨额遗产……你该信任吗?或许你觉得是天上掉馅饼了,岂不知你早已被诈骗犯视为一块肥肉。


为了鉴别网络诈骗,人们需求树立一个算法模型来猜测给定买卖是否涉嫌诈骗。鉴于此,本文以Kaggle上的信用卡诈骗侦测数据集为根底,运用机器学习来判别既定买卖是否涉嫌诈骗。


数据集传送门:https://www.ka皋比鹦鹉,穿透房顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳调配的100种办法ggle.com/mlg-ulb/creditcardfraud


选用数据集


首要,从正常买卖与诈骗买卖的数据可视化下手,探求这些数据详细怎么呈现。


#loading the dataset
location = '/Users/emmanuels/Downloads/creditcard.csv'
dat =皋比鹦鹉,穿透房顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳调配的100种办法 pd.read_csv(location)
#visualising transactions
ax = dat.groupby('Class').size().transform(lambda x:
(x/sum(x)*100)).plot.bar()
for a in ax.patches:
ax.text(a.get_x()+.06,a.get_height()+.5,\
str('{}%'.format(round(a.get_height(),3))),fontsize=24,
color='black')
old = [0,1]
new = ['金科信运送办理体系Normal','Fraudulent']
ax.set_xticks(old)
ax.set_xticklabels(new,rotation=0,fontsize=皋比鹦鹉,穿透房顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳调配的100种办法28)


上传数据后,按类别对数据集进行分组(0为正常里弗斯驾驭战役形式买卖,1为诈骗买卖),并回来类别总数。尽管apply(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html)操作会让任何lambda函数调用于已分组的数据集,但在这个情况下,运用transform(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.transform.html)指令能确保所得回来值会与输入值规划相同。接下来在lambda函数中将其转化为占买卖总量的百分比,并制作出标有相关百分比新符号已搜集的条形图。


正常买卖与诈骗买卖的百分比


正如所料水桫,绝大多数买卖都对错诈骗性的。但这呈现了个小问题,终究衡量机器学习模型的功能好坏仅靠准确率是不行的。例如,要是猜测每桩买卖都是正常的,那准确率便是99.827%,这听上去很赞,但若真是如此,那便会因未能鉴别出诈骗买卖而形成金钱丢失。因而,不管运用何种目标来衡量算法功能,要害仍是在于衡量该算法正确鉴别诈骗买卖的才能。


时刻-买卖量可视化

接下来,依据买卖到达时刻研讨买卖量。鉴于该数据集并不显现时刻数据,因而咱们只能得到自初次成交纪录以来所记载的秒数。

plt.plot( 'Time', 'Amount', data=dat, marker='o', color='blue',
linewidth=2, linestyle='dashed')
plt.xlabel('Seconds since first transaction')
plt.ylabel('Size of transaction')
plt.rcParams["figure.figsize"] = (30,20)
plt.rcParams["font.size"] = "20"



时刻-成交量可视化


按时刻将买卖量可视化后,好像能够得出某种形式。买卖量在25000秒开端走高,约20000秒后到达峰值,之后继续下降。该周期继续约500000秒(约14个小时),相同的形式在125000秒处再次呈现。这大约便是一天的周期,买卖量先从当天的开端逐步走高,在中心某个时刻到达峰值,之后在打烊前衰减。能够欲成欢想见,关于诈骗买卖何时更易发作这个问题,或许能在该形式中找到蛛丝马迹。

dat['Hours'] = dat['Time']/3600


为了在剖析中包含上述信息,咱们能够创立一个柱状图,指出一桩买卖发作时的节点(小时)。再次声明,该估测或许会成为有用判别买卖是否涉嫌诈骗的重要特征。


时刻-诈骗买卖占比可视化


接下来,依据上一段所做的假定,咱们将按时刻可视化诈骗买卖占买卖总量的份额,以探求诈骗买卖是否集聚在某个特定时刻段内。

#visualising amount spent per hour by class
dat_grouped =
dat.groupby(['Hours','Class'])['Amount'].sum()
ax_three = dat_grouped.groupby(level=0).apply(lambda
x:round(100*x/x.sum(),3)).unstack().plot.bar(stacked=True)
for i in ax_three.patches:
width,height=i.get_width(),i.get_height()
x,y = i.get_xy()
horiz_offset=1
vert_offset=1
labels = ['Normal','Fraudulent']
ax_three.legend(bbox_to_anchor=(horiz_offset,vert_offset),labels=labels)
if height > 0:
ax_three.annotate('{:.2f} %'.format(height),
(i.get_x()+.15*width,
i.get_y()+.5*height),
rotation=90)


为了完成可视化,数据集按小时与类别予以分类,并回来每小时进行的正常买卖与诈骗买卖的总和。接着调用lambda函数将这两个类其他数量转化为百分比,创立堆积条形图并注释相关的百分比,并定位百分比以此确保图表可读性。


Data Viz 实践数据可视化专家100%致力于他们的作业


时刻-诈骗买卖占比可视化


鉴于数据仅触及48小时内所到达的买卖,任何调查得出的形式都能够解说成偶尔现象。但咱们以为,将发作特定买卖的一小时内诈骗买卖占比作为一个特征增加进来会很有意思。据估测,买卖时刻段这一特征(联合其他特征)所包含的相关信息,或许有助于判别买卖是否涉嫌诈骗。诈骗买卖在一天内某些时段或许更易发作。

a= dat.groupby(['Hours','Class'])['Amount'].sum()
b =pd.DataFrame(a.groupby(level=0).apply(lambda
x:round(100*x/x.sum(),3)).unstack())
b=b.reset_index()
b.columns = ['Hours','Normal','Fraudulent']
dat = pd.merge(dat,b[['Hours','Fraudulent']],on='Hours', how='inner')


为了做出该柱状图,首要依据小时计算出正常买卖与诈骗买卖各自占比,再将数据的行转换成列,以此将类别信息以柱状图予以展示。

接着兼并数据帧,从刚刚创立的数据帧中提取出诈骗买卖列。和用SQL相同,两个数据帧依照共有特征/键——小时数进行兼并。所以,数据帧有了一个新的数据列,约束特定买卖小时内诈骗买卖的占比。


机器学习


要想分类,首要从逻辑回归开端。扼要回忆下,该算法即logit函数履行改换操作,回归出某事情的发作概率。



统计学=机器学习


dat.columns[df.isnull().any()]
dat['Fraudulent'] = dat['Fraudulent'].fillna(0)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
#from sklearn.feature_selection import RFE
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classifi对加心cation_report
log_reg = LogisticRegression(penalty='l1')
y = dat['Class']
X = dat.drop(['Class'],axis=1)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=100)
log_reg.fit(X_train,y_train)
#predicting with models
predicts = log_reg.predict(X_test)
#f1 score is harmonic mean of recall and precision scoreconfusion_matrix(y_test,predicts)
####RESULTS####
array([[85276, 25],
[ 46, 96]])


接下来核对NAN值,并在必要情况下将全部NAN值用0替换。整理进程后导入剖析所需的数据包,将其分为练习数据与测验数据,再将前者导入逻辑回归模型。该模型专门运用l1正则化进程(套索回归-最小肯定缩短与挑选算子)(hbluecamsttps://ai.stanford.edu/~皋比鹦鹉,穿透房顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳调配的100种办法ang/papers/aaai06-l1logisticregression.pdf)。L2最小化平方和,l1则最小化目标值与预期值的肯定差值之和。该正则化进程旨在避免系数的过拟合,以此进步该模型学习概括新数据的才能。

如前文所述,准确度不千物女是衡量该模型功能好坏的有用目标。因而咱们先运用大理姜学飞混杂矩阵(差错矩阵)来测验该模型关于正常买卖与诈骗买卖的分类精度——特别考量模型能否正确鉴别出诈骗买卖。

依据混杂矩阵,该模型对正常买卖的分类准确度为99.974%,对诈骗买卖的分类准确度为67.60%。

print(classification_report(y_test,predicts))
####RESULTS####
precision recall f1-score support
0 1.00 1.00 1.00 85301
1 0.79 0.68 0.73 142
micro avg 1.00 1.00 1.00 85443
macro avg 0.90 0.84 0.86 85443
weighted avg 1.00 1.00 1.00 85443


为便于比较,能够打印出所猜测的分类陈述。该陈述回来f1-score,这对确保比较一致性来说很重要。f1-score算是个加权数,是准确率(即检索成果中真阳性样本占全部真阳性猜测的份额)与召回率(即检索成果中真阳性样本占全部实践真阳性样本的份额)的谐和均值,可显现该模型正确分类正常买卖与诈骗买卖的功能。可增加类别1(诈骗买卖)的f1_score,并经过f1_score的微观均匀值,确认该模型的功能。


递归特征消除


并非全部特征相同重要。有些特征不会为该模型功能增值,乃至会起到反作用。当然,这全部首要与所选用模型有关。某些比如决策树与随机森林之类的模型可自行选出最相关的特征,因而无须专门进行特征挑选。


特征挑选的原理在于挑选能优化某个分数的特征。首要办法有正向挑选(从一个特征开端不断增加新的特征直到得出最优解)与反向挑选(正向挑选的逆进程)。就本文而言,更倾向于递归特征消除。这是一种反向挑选,去除模型中最无关紧要的特征,该办法的要害在于衡量重要性的目标。

from sklearn.feature_selection import RFECV
sele哥哥鸟叫ctor = RFECV(log_reg,step=3,cv=5,scoring='f1_macro')
selector = selector.fit(X,y)


本文专门挑选带有穿插验证的递归特征消除,即用五倍穿插验证得出特征的最优数。关于度量目标,本模型挑选f1_macro score,它是正常买卖与诈骗买卖f1_score的均匀值。将迭代设置为3,因而每次迭代将删去3个特征。

#showing the name of the features that have been selectedcols = list(X.columns)
temp =pd.Series(selector.support_,index=cols)
selected_features = temp[temp==True].index
selected_features
#### RESULTS ####
Index(['V1', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11', 'V12',
'V13', 'V乔蓉博客14', 'V皋比鹦鹉,穿透房顶的highkick,丁香-牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳调配的100种办法15', 'V16', 'V17', 'V19', 'V20', 'V21', 'V22', 'V23',
'V24', 'V25', 'V27', 'V28', 'Fraudulent'],
dtype='object')


为了把握每次递归特征消除后所回来的特征,笔者创立了一个pandas series, 将选定特征映射于相关列标题。终究,这次进程消除了V2,V15,V18,小时,量与时刻这几列。

X_rfecv = dat[selected_features].values
X_train,X_test,y_train,y_test =
train_test_split(X_rfecv,y,test_size=0.3,random_state=100)
log_reg.f鲜艳姐妹花it(X_train,y_train)
#predicting wit安思潼h models
predicts = log_reg.predict(X_test)
#f1 score is harmonic mean of recall and precision score
confusion_matrix(y_test,predicts)
#### RESULTS ####
array([[85279, 22],
[ 48, 94]])


运用rfe进程过滤出来的特征被导入到逻辑回归模型后,发现模型猜测正常买卖的功能略有进步,而诈骗买卖的猜测功能却有所衰减。不过,宏f1_score却与全部列作为特征时毫无改变。


另觅良方


本文决议选用决策树、随机森林与随机查找穿插验证来锯末粉碎机取得最优参数的近似值,并运用随机森林将宏f1_score均匀值进步到0.88。

random_forest = RandomForestClassifier()
param_grid = {"criterion":['gini','entropy'],
'n_estimators':range(20,200,20),
'max_depth':range(20,200,20),
}
tuned_rfc =
RandomizedSearchCV(random_forest,param_grid,cv=5,scoring='f1')
tuned_rfc.fit(X_train,y_train)
tuned_preds = tuned_rfc.predict(X_test)
confusion_matrix(y_test,tuned_preds)
#### RESULTS ####
array([[85288, 13],
[ 35, 107]])


随机查找包可用来预设笔者想测验的形参(形式参数),以此得到本模型最优形参。这一原理即在全部或许的形参中找到最优组合。望文生义,与逐个查验全部指明形参的摆放不同,该办法所创立的组合是随机的,使得此类超参数调整法比其他比如网格查找的办法更为快捷。终究,后者的运转公务攻办时刻长得令人折磨,跟看一部DC电影有得一拼。


DC电影美观——个鬼


凭仗随机查找与f1衡量参数,本文将最优参数与练习数据予以拟合,得出测验成果,并将其返至混杂矩阵。如成果所示,正常买卖与诈骗买卖的准确度均有所进步。

print(classification_report(y_test,tuned_preds))
#### RESULTS ####
precision recall f1-score support
0 1.00 1.00 1.00 85301
1 0.89 0.75 0.82 142
micro avg 1.00 1.00 1.00 85443
macro avg 0.95 0.88 0.91 85443
weighted avg 1.00 1.00 1.00 85443


更棒的是,宏f1均匀值也有所升高,该模型总算可鉴别出更多的诈骗买卖了。

XGBoost! (极限梯度进步)


最终,咱们决议选用饱尝赞誉的XGBoost分类器,并经过穿插验证的随机查找予以微调。XGBoost是极限梯度进步的英文缩写。依据各项Kaggle比赛成果来看,该机器学习功能强大,功能优胜。更有人说,就钢托支架规划样品连洗过衣服后离奇失踪的袜子终究去往何方,XGBoost都能帮你做出估测。


袜子戎行集结!


据官方“白皮书”,XGBoost是在梯度进步框架下运转的梯度进步树算法。简言之,它将猜测不出(或作用欠安)抱负成果的弱学习器/树进行强化。这意味着新树可校对从前决策树猜测的残留过错(即纠错)。只需做出清晰指定,该进程将一向连续,详细由模型所用参数决议。决策树做出的每个校对都会并入模型中,只需对每次校对赋予加权,便能操控所用模型对练习数据的习惯速度。


决策树的作业原理与XGBoost有相通之处。在决策树中,数据分为多个子集/叶子,并给每一片叶子赋值(信息增益),并构建更多的枝杈(即进一步切割数据),不断挑选具有最高值的叶子,直到到达预订水平/纵深。对整体而言(如随机森林),不同决策树运转相同进程,互相互不搅扰。这与进步树相似,但两者差异在于模型的练习方法。研讨不同观念与调研后,XGBoost在练习速度方面好像比梯度进步更为优胜,乃至还逾越了随机森林,此外XGBoost的数据成果往往也更好。


from xgboost import XGBClassifier
y = dat[妒忌的暗码国语版全集'Class']
X = dat.drop(['Class'],axid5238s=1)
X_train,X_test,y_train,y_test =
train_test_split(X,y,test_size=0.3,random_state=100)
xgb = XGBClassifier()
#fine tuning XGB parameters
params = {'min_child_weight':[5,15],
'subsample':[0.6,0.8,1.0],
'gamma':[1,5,10,15],
'learning_rate': [0.01,0.05,0.1],
'colsample_bytree':[0.6,0.8,1.0],
'max_depth':[2,3,5,10],
'n-estimaors': range(50,1000,50)
}
#randomized search
random_search = RandomizedSearchCV(xgb,params,cv=5,n_iter=5,scoring='f1',random_state=100)
random_search.fit(X_train,y_train)
confusion_matrix(y_test,opt_predicts)
#### RESULTS ####
array([[85290, 11],
[ 31, 111]])


在阅读了关于gamma基准与学习率后,咱们决议再次运用随机查找得出最优参数,将模型与练习数据拟合,使模型得到细微的改善。现在,该模型对正常买卖的分类准确率为99.987%,对诈骗买卖的分类准确率为78.16%。

print(classification_report(y_test,opt_predicts))
#### RESULTS ####
precision recall f1-score support
0 1.00 1.00 1.00 85301
1 0.91 0.78 0.84 142
micro avg 1.00 1.00 1.00 85443
macro avg 0.95 0.89 0.92 85443
weighted avg 1.00 1.00 1.00 85443


更棒的是,宏F1均匀值也略有进步。在这其间,最风趣的是完成功能腾跃的功臣不是选用了不同的模型,而是特征工程。能够想见,假使对所取数据有更深的了解与感悟,模型的可行性将大幅进步。例如,作为一家付出渠道,研讨员对给定用户的数据均匀规划,量与买卖时刻会有更深的知道。与单单从原始数据中概括出不置可否的形式比较,所取得的总特征要更好。



进步虽小,但聊胜于无


穿插验证


最终一步,对XGBoost数据进行穿插验证。本文事例选用十倍分层穿插验证,其原理为每一层均能很好地表现整个数据集各层的数据,而非仅包含一类(例如仅包含0类,即正常买卖)。关于本文事例而言,这尤为重要,终究其间一个类别占多于99%。


strat = StratifiedKFold(n_splits=5, shuffle=True)
strat.get_n_splits(X)
model_score = []
for train_index, test_index in strat.split(X,y):
X_train,X_test,y_train,y_test = X.iloc[train_index],
X.iloc[test_index],y.iloc[train_index],y.iloc[test_index]
random_search.fit(X_train, y_train)
xgb_predicts=random_search.predict(X_test)
model_score.append(f1_score(y_test,xgb_predicts,average='macro',labels=np.unique(xgb_predicts)))
scores_table = pd.DataFrame({"F1 Score" :model_score})
scores_table


用穿插验证专门针对宏f1值进行验证。据开始测验显现,该值约为0,92.




接着将5个测验增加到dataframe(数据帧)中,所得成果在某种程度上对开始测验是个佐证。

留言 点赞 重视

咱们一同共享AI学习与开展的干货

欢迎重视全渠道AI垂类自媒体 “读芯术”

文章版权及转载声明:

作者:admin本文地址:http://www.mikebucks.com/articles/2538.html发布于 5个月前 ( 07-18 06:16 )
文章转载或复制请以超链接形式并注明出处牛奶咖啡,意大利咖啡精选,牛奶和咖啡最佳搭配的100种方法