此次信用卡欺诈是采用科赛数据科学社区一个项目的数据集来分析的,具体的数据集可以在这里下载 传送门
数据集有100多M,使用excel打开会有有些卡顿,所以直接在python观察
数据集解读
数据集名称 | 数据类型 | 特征数 | 实例数 | 值缺失 | 相关任务 |
---|---|---|---|---|---|
信用卡欺诈检测数据集 | 数值数据 | 31 | 284807 | 无 | 不平衡样本处理,预测分类 |
- 在284807交易记录中,有492条欺诈记录,属于样本极不平衡
- 数据集仅包含数值数据是因为做了PCA变换,特征V1到V28是通过PCA变换得到的主成分
- 其中Time以及Amount数据是没有做PCA变换的
其中数据字段解读如下表所示:
字段 | 类型 | 含义 |
---|---|---|
Time | Float | 数据集第一条记录与本条记录的时间差,秒为单位 |
V1 | Float | 主成分1 |
V2 | float | 主成分2 |
… | … | … |
V28 | Float | 主成分28 |
Amount | Float | 交易金额 |
Class | Float | 类别是否为欺诈 1:是 0:否 |
数据探索
这个数据集一共有28万多的数据,是一个非常大的数据集,在Excel中打开会卡顿,所以最好的是用pandas来操作。
data = pd.read_csv(r'C:\Users\11060\Desktop\data\creditcardfraud.csv')
plt.rcParams['font.sans-serif']=['SimHei']
data.Class.value_counts().plot(kind='bar')
print(data.Class.value_counts())
plt.xlabel('诈骗类别')
plt.ylabel('数量')
可以看到正真为欺诈类的数据非常的少,数据集是极度的不均匀,所以需要对数据集进行一定的处理
数据规范化
由于数据集并没有什么缺失数据之类的,而且28个主成分是已经由PCA进行转换的,所以28个主成分不需要做处理,只有Time还有Amount这两列需要处理,Time这一列对分类没什么作用,这里做删除处理,Amount列做标准化处理
ss = StandardScaler()
data.Amount = ss.fit_transform(data['Amount'].values.reshape(-1,1))
data1 = data.drop(['Time'],axis=1)
得到的数据集就是标准化后的数据集
数据集划分
这里将数据集按按照训练集:测试集 = 7:3来划分数据集
X = data1.iloc[:,0:29].values
y = data1.iloc[:,29].values
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,stratify=y,random_state=1)
smote = SMOTE(random_state=1) # 合成少数类过采样技术
X_train_smote,y_train_smote = smote.fit_sample(X_train,y_train)
print(sum(y_train_smote==1))
print(sum(y_train_smote==0))
# output
199020
199020
这里对少样本进行合成,具体的样本不平衡处理方法可以看这篇文章 传送门
处理后的训练集正负样本数量一致,可以进行下一步
模型创建
这里的数据集数量太大,本人尝试用SVC来分类,结果发现所需时间实在是太久了,SVM的确不适合大数据集,这里我们使用逻辑回归来进行分析建模,首先最优参数C
params = {'C':[1,2,3,4,5,6,7,8,9,10}
lr = LogisticRegression()
lr_clf = GridSearchCV(lr,params,cv=5,n_jobs=-1)
lr_clf.fit(X_train_smote,y_train_smote)
print(lr_clf.best_params_ )
# output
{'C': 3.0}
得到最优参数为3,将参数C=3重新训练测试
模型训练评估
lr = LogisticRegression(C=3, penalty='l1',verbose=5)
model = lr.fit(X_train_smote, y_train_smote)
y_predict = model.decision_function(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_predict)#计算假正率和真正率
roc_auc = auc(fpr, tpr)
print('准确率:',roc_auc)
# output
准确率: 0.9872308823273125
准确率高是预料之中的,即使使用样本分布均匀的数据集来进行训练,由于测试集的负样本数据太少,而测试的样本不能随便由SMOTE生成,这样子会使得模型的拟合和评估都在生成的数据上进行,模型没有可信度,只有在真实的数据集进行预测才有可信力
接下来画出ROC-AUC曲线:
plt.plot(fpr, tpr, 'b',label='AUC=%0.3f'%roc_auc)
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.1,1])
plt.ylim([-0.1,1])
plt.show()
如图所示
总结与不足
此次使用逻辑回归进行信用卡诈骗的二分类任务,主要的问题就是解决样本分布的不平衡
不足
- 数据集太大,SVM算法不适合
- 尝试了使用多种分类器一起进行最优化参数寻找,结果代码完全跑不动,数据集太大,跑不动