注:这篇博客只是我的一些思路,仅供大家参考
数字支付正在发展,但网络犯罪也在发展。电信诈骗案件持续高发,消费者受损比例持续走高。报告显示,64%的被调查者曾使用手机号码同时注册多个账 户,包括金融类账户、社交类账户和消费类账户等,其中遭遇过电信诈骗并发生损失的比例过半。用手机同时注册金融类账户及其他账户,如发生信息泄露,犯罪分子更易接管金融支付账户盗取资金。
随着移动支付产品创新加快,各类移动支付在消费群体中呈现分化趋势,第三方支付的手机应用丰富的场景受到年轻人群偏爱,支付方式变多也导致个人信息也极易被不法分子盗取。根据数据泄露指数,每天有超过 500 万条记录被盗,这一令人担忧的统计数据表明 - 对于有卡支付和无卡支付类型的支付,欺诈仍然非常普遍。
在今天的数字世界,每天有数万亿的银行卡交易发生,检测欺诈行为的发生 是一个严峻挑战。
该数据来自一些匿名的数据采集机构,数据共有七个特征和一列类标签。下面对数据特征进行一些简单的解释(每列的含义对我们来说并不重要,但对于机 器学习来说,它可以很容易地发现含义。它有点抽象,但并不需要真正了解每个功能的真正含义。只需了解如何使用它以便您的模型可以学习。许多数据集,尤 其是金融领域的数据集,通常会隐藏一条数据所代表的内容,因为它是敏感信息。 数据所有者不想让他人知道,并且数据开发人员从法律上讲也无权知道)
属性 | 描述 |
---|---|
distance_from_home | 银行卡交易地点与家的距离; |
distance_from_last_transaction | 与上次交易发生的距离; |
ratio_to_median_purchase_price | 近一次交易与以往交易价格中位数的比率; |
repeat_retailer | 交易是否发生在同一个商户; |
used_chip | 是通过芯片(银行卡)进行的交易; |
used_pin_number | 交易时是否使用了 PIN 码; |
online_order | 是否是在线交易订单; |
fraud | 诈骗行为(分类标签); |
import pandas as pd
data=pd.read_csv('card_transdata.csv')
data.head(10)
# 列数据类型和缺失值汇总
data.info()
data.describe() # 查看数据整体描述
data.isnull().sum()
根据以上输出可以看到,没有缺失值
对诈骗行为做类别分析:0和1分别表示一种欺诈行为,属于二分类。
data.fraud.value_counts()
(data.fraud.value_counts()/len(data))*100
df.corr() 计算列的成对相关性。相关性显示两个变量如何相互关联。正值显示一个变量增加,其他变量也增加。 负值表示一个变量增加另一个变量减少。值越大,两个变量的相关性越强,反之亦然。
使用皮尔逊系数计算列与列的相关性:
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=40)
sns.set(font=myfont.get_name(), color_codes=True)
#corr = df.corr(method='pearson') # 使用皮尔逊系数计算列与列的相关性
#corr = df.corr(method='kendall') # 肯德尔秩相关系数
#corr = df.corr(method='spearman') # 斯皮尔曼秩相关系数
data_corr = data.corr(method='pearson') # 使用皮尔逊系数计算列与列的相关性
plt.figure(figsize=(20,15))#figsize可以规定热力图大小
fig=sns.heatmap(data_corr,annot=True,fmt='.2g')#annot为热力图上显示数据;fmt='.2g'为数据保留两位有效数字
fig
fig.get_figure().savefig('dingding_corr.png')#保留图片
分析:交易到家里的距离(distance_from_home)与近一次交易与以往交易价格中位数的比率(ratio_to_median_purchase_price)关系最大为0.19,几乎可以说没啥关系了。其它的甚至都有负数。
所以分析出这些变量之间是没有相互影响关系。
问题如下:
(1) 使用多种用于数据挖掘的机器学习模型对给定数据集进行建模;
(2) 对样本数据进一步挖掘分析,通过交叉验证、网格调优对不同模型的参数进行调整,寻找最优解,将多个最优模型进行进一步比较;
(3) 通过对 precision(预测精度)、recall(召回率)、f1-score(F1 分 数值)进行计算,给出选择某一种预测模型的理由;
(4) 将模型性能评价通过多种作图方式进行可视化
from sklearn.model_selection import train_test_split # 将数据拆分为训练/测试
X = data.drop('fraud', axis=1)
y = data['fraud']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20) #8:2的比例
X_train
数据的80%作为训练集,20%作为测试集。
建立模型:
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
# 只需要对输入的值x缩放
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
#导入决策树算法
from sklearn.tree import DecisionTreeClassifier
# entropy参数表示信息增益。使用信息增益方法从数据集中构建一棵树。
model = DecisionTreeClassifier(criterion='entropy', random_state=0)
# 训练
model.fit(X_train,y_train)
y_pred = model.predict(X_test)# 预测
y_pred
# 导入准确度分数方法
from sklearn.metrics import accuracy_score
# 计算准确度
accuracy_score(y_pred,y_test)
由于要使用多种模型,这里再试试其他的模型:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 正常显示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示符号
from matplotlib import rcParams
rcParams['axes.unicode_minus']=False
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
#Linear Regression
from sklearn import linear_model
model_LinearRegression = linear_model.LinearRegression()
#Decision Tree Regressor
from sklearn import tree
model_DecisionTreeRegressor = tree.DecisionTreeRegressor()
#SVM Regressor
from sklearn import svm
model_SVR = svm.SVR()
#K Neighbors Regressor
from sklearn import neighbors
model_KNeighborsRegressor = neighbors.KNeighborsRegressor()
#Random Forest Regressor
from sklearn import ensemble
model_RandomForestRegressor = ensemble.RandomForestRegressor(n_estimators=20)
#Adaboost Regressor
from sklearn import ensemble
model_AdaBoostRegressor = ensemble.AdaBoostRegressor(n_estimators=50)
#Gradient Boosting Random Forest Regressor
from sklearn import ensemble
model_GradientBoostingRegressor = ensemble.GradientBoostingRegressor(n_estimators=100)
#bagging Regressor
from sklearn.ensemble import BaggingRegressor
model_BaggingRegressor = BaggingRegressor()
#ExtraTree Regressor
from sklearn.tree import ExtraTreeRegressor
model_ExtraTreeRegressor = ExtraTreeRegressor()
#线性回归
model = LinearRegression()
model.fit(X_train, y_train)
print('线性回归')
print(model.score(X_test,y_test))
# 决策树回归
model = model_DecisionTreeRegressor
model.fit(X_train, y_train)
print('决策树回归')
print(model.score(X_test,y_test))
# k近邻回归
model = model_KNeighborsRegressor
model.fit(X_train, y_train)
print('k近邻回归')
print(model.score(X_test,y_test))
# Adaboost 回归
model = model_AdaBoostRegressor
model.fit(X_train, y_train)
print('Adaboost回归')
print(model.score(X_test,y_test))
# Randomforest回归
model =model_RandomForestRegressor
model.fit(X_train, y_train)
print('Randomforest回归')
print(model.score(X_test,y_test))
综上:决策树和随机森林的模型正确率最好,还可以试试其他的模型。
第二问:这里使用决策树
model.feature_importances_
[*zip(features,model.feature_importances_)]
查看所有参数的重要程度表:
利用学习曲线观察深度是多少的时候能得到最好的:
应该是由于数据量比较大,所以使用决策树训练出来的模型很好~
这里还是以决策树训练的模型为例:
# 导入准确度分数方法
from sklearn.metrics import accuracy_score
# 计算准确度
accuracy_score(y_pred,y_test)
来解释一下上面这张图怎么看:这是sklearn提供的分类报告功能。
sklearn中的classification_report函数用于显示主要分类指标的文本报告。在报告中显示每个类的精确度,召回率,F1值等信息。
1、precision:精确率,意思是预测为x的样本中,有多少被正确预测为x。
2、recall:召回率,意思是实际为x的类别中,有多少预测为x。
3、f1-score: F1值,是精确度和召回率的调和平均值。
4、support:支持,也就是说真实结果中有多少是该类别。可以看到有91279个样本是0类别,8721个样本是1类别。
没有调整参数的情况下,画的图有很多层:
from sklearn import tree
# 画树
features=['distance_from_home', 'distance_from_last_transaction',
'ratio_to_median_purchase_price', 'repeat_retailer', 'used_chip',
'used_pin_number', 'online_order',]
import graphviz
dot_data=tree.export_graphviz(model,feature_names=features
,class_names=["nofraud","fraud"]
,filled=True
,rounded=True)
graph=graphviz.Source(dot_data)
graph
图片太大了,这里放一个缩略图:
由第二问可知,树的层数不重要,因为准确率都是100%,因此选取前三层绘图:
clf=tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30
,splitter="random"
,max_depth=3 # 树只留3层
)
clf=clf.fit(X_train,y_train)
dot_data=tree.export_graphviz(clf
,feature_names=features
,class_names=["yes","no"]
,filled=True
,rounded=True)
graph=graphviz.Source(dot_data)
graph
#同样,我们也可以可视化测试数据集形成的决策树。
from sklearn.tree import DecisionTreeClassifier, plot_tree
clf = DecisionTreeClassifier()
plt.figure(figsize=(40,20))
# 提供测试集训练
clf = clf.fit(X_test, y_test)
plot_tree(clf, filled=True)
plt.title("测试集训练决策树可视化")
plt.show()