【实验内容】
该项目所使用的数据集包含持卡人在两天内使用信用卡的交易情况,共有284807笔交易,其中有492笔交易为盗刷。数据集中的数据是经过了PCA降维,并且出于保密原因,这些特征都进行了脱敏处理,数据以秒为单位记录。通过对这些数据的分析,建模,可以对信用卡盗刷情况进行预测。有利于银行对存在风险的交易采取措施,减小银行和持卡人的损失。并设置合理的阈值,使得银行在减小盗刷损失的前提下,更好的提升使用信用卡的体验。
【实验目的】
本项目通过利用信用卡的历史交易数据,进行机器学习,构建信用卡反欺诈预测模型,提前发现客户信用卡被盗刷的事件。
【工具清单】
Jupyter Notebook:基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。
Numpy:提供两种基本的对象:ndarray(N-dimensional Array Object)和 ufunc(Universal Function Object)。ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
Pandas:在数据分析中是非常常用的库,在数据预处理、缺失值填补、时间序列、可视化等方面都有应用。
Matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。
【实验原理/思路】
1.决策树
决策树是一个预测模型,它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。
从数据产生决策树的机器学习技术叫做决策树学习,通俗说就是决策树。
一个决策树包含三种类型的节点:
决策节点:通常用矩形框来表示
机会节点:通常用圆圈来表示
终结节点:通常用三角形来表示
决策树视图
决策树是一树状结构,它的每一个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出到达这个节点的样本所属的类。构造决策树的核心问题是在每一步如何选择适当的属性对样本做拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下,分而治之的过程。
2.随机森林
随机森林采用Bagging的思想,所谓的Bagging就是:
(1)每次有放回地从训练集中取出 n 个训练样本,组成新的训练集;
(2)利用新的训练集,训练得到M个子模型;
(3)对于分类问题,采用投票的方法,得票最多子模型的分类类别为最终的类别;对于回归问题,采用简单的平均方法得到预测值。
随机森林以决策树为基本单元,通过集成大量的决策树,就构成了随机森林。
3. XGBoost
梯度提升决策树(Gradient Boosting Decision Tree,GBDT)是一种基于boosting集成思想的加法模型,训练时采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。
【实验步骤及关键代码】
1、封装建立逻辑回归模型函数
from sklearn.model_selection import train_test_split
x_train_data,x_test_data,y_train_data,y_test_data = train_test_split(x_under_data,y_under_data,test_size=0.3,random_state =0 )
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
x_data = data.loc[:,data.columns !='Class']
y_data = data.loc[:,data.columns =='Class']
x_train_data, x_test_data, y_train_data,y_test_data = train_test_split(x_data, y_data,test_size=0.3, random_state=0)
smote = SMOTE()
x_train_smote,y_train_smote = smote.fit_resample(x_train_data, y_train_data)
y_train_smote.value_counts('Class')
2、封装K折交叉验证函数
def Get_C(x_data,y_data):
flod = KFold(n_splits=5,shuffle=True,random_state=0)
c_Params = [0.01,0.1,1,10,100]
resultTable = pd.DataFrame(index=[0,1,2,3,4],columns=['C参数难度','召回率'])
resultTable['C参数难度'] = c_Params
index = 0
for c in c_Params:
id = 0
reacll_accs = []
for train_index,valid_index in flod.split(x_data):
model = LogisticRegression(penalty='l2',C = c)
x = x_data.iloc[train_index,:]
y = y_data.iloc[train_index,:].values.ravel()
model.fit(x,y)
x1 = x_data.iloc[valid_index,:]
y1 = y_data.iloc[valid_index,:]
y_result = model.predict(x1)
recall_acc = recall_score(y1,y_result)
id +=1
print('id',id,'recall',recall_acc)
reacll_accs.append(recall_acc)
resultTable.loc[index,'reacll值'] = np.mean(reacll_accs)
print(f'当前难度:{c}',np.mean(reacll_accs))
index += 1
resultTable = resultTable.sort_values('召回率')
goodC = resultTable.iloc[-1]['C参数难度']
print('最优C值是',goodC)
return goodC
3、封装求最佳C值函数
flod = KFold(n_splits=5,shuffle=True,random_state=0)
bestC=100
id = 0
reacll_accs = []
modelList = []
x_data = x_train_data
y_data = y_train_data
for train_index,valid_index in flod.split(x_data):
model = LogisticRegression(penalty='l2',C=bestC)
x = x_data.iloc[train_index, :]
y = y_data.iloc[train_index, :].values.ravel()
model.fit(x,y)
x1 = x_data.iloc[valid_index, :]
y1 = y_data.iloc[valid_index, :]
y_result = model.predict(x1)
# recall_score(正是结果,模型得出的数据)
recall_acc = recall_score(y1,y_result)
reacll_accs.append(recall_acc)
modelList.append(model)
baseModel = modelList[4]
4、封装使用不同阈值查看结果的函数
x_data = data.loc[:,data.columns !='Class']
y_data = data.loc[:,data.columns =='Class']
#y_result = baseModel.predict(x_data)
y_result = baseModel.predict_proba(x_data)
threashold = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]
plt.rcParams['figure.figsize'] = [14,14]
plt.rcParams['figure.dpi'] = 100
j = 1
for i in threashold:
y_result_threashold = y_result[:,1] > i
# nrows,ncols,index
plt.subplot(3,3,j)
print('id:',j)
j += 1
cm = confusion_matrix(y_data,y_result_threashold)
plotConfusion(cm)
print('召回率是:',cm[1][1]/(cm[1][0]+cm[1][1]))
print('精度值是:',cm[1][1]/(cm[0][1]+cm[1][1]))
【实验记录与结果分析】
实验记录
1、封装建立逻辑回归模型函数
2、封装K折交叉验证函数
3、封装求最佳C值函数
4、封装使用不同阈值查看结果的函数
结果分析
1、在样本数量极度不均衡的情况下,在数据层面对样本进行处理时,过采样的方式比下采样的方式更好。
2、在进行预测时,更多的数据能够展现更多的特征,使得结果更加准确,从而提高模型的准确度。
3、不同的特征对模型的影响程度是不一样的,在实际情况中,把握重要特征,能提高提高决策的
4、过采样的recall值比下采样稍小,但是它的精度却大大提高了,即减少了误杀的数量,所以在出现数据不均衡的情况下,较经常使用的是生成数据而不是减少数据,但是数据一旦多起来,运行时间也变长了。