预测信用卡欺诈
来源:互联网 发布:linux强行关闭程序 编辑:程序博客网 时间:2024/04/28 18:37
预测信用卡欺诈
一、项目简介
Credit Card Fraud Detection是一个典型的分类问题,欺诈分类的比例比较小,直接使用分类模型容易忽略。在实际应用场景下往往是保证一定准确率的情况下尽量提高召回率。一个典型案例是汽车制造行业,一旦发生一例汽车安全故障,同批次的车辆需要全部召回,造成了巨大的经济损失。
二、数据印象
详细分析过程见在线脚本。
2.1. 简单数据分析
数据规模:中度规模(对于mac而言)。数据共284807条,后期算法选择需要注意复杂度。
数据特征:V1~V28是PCA的结果,而且进行了规范化,可以做一些统计上的特征学习;Amount字段和Time字段可以进行额外的统计学和bucket统计。
数据质量:无缺失值,数据规整,享受啊。
经验:时间字段最好可以处理为月份、小时和日期,直接的秒数字段往往无意义。
2.2. 探索性数据分析
三、数据预处理
数据已经十分规整了,所以先直接使用基础模型来预测下数据。
from sklearn.linear_model import LogisticRegressionfrom sklearn.cross_validation import cross_val_scorefrom sklearn.model_selection import StratifiedShuffleSplitfrom sklearn import metricsdef train_lr(X, y, plot_roc=False): sss = StratifiedShuffleSplit(n_splits=10, test_size=0.2, random_state=10) lr = None for train_index, test_index in sss.split(X, y): X_train, X_test = X.iloc[train_index], X.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] lr = LogisticRegression(C=0.01, penalty='l1') lr.fit(X_train, y_train) y_predict = lr.predict(X_test) print "roc_auc:", metrics.roc_auc_score(y_test, y_predict) print "f1score:", metrics.f1_score(y_test, y_predict) print "precision:", metrics.precision_score(y_test, y_predict) print "recall:", metrics.precision_score(y_test, y_predict) print "" if plot_roc: fpr, tpr, thresholds = metrics.roc_curve(y_test, y_predict) roc_auc = metrics.auc(fpr,tpr) # Plot ROC plt.title('Receiver Operating Characteristic') plt.plot(fpr, tpr, 'b',label='AUC = %0.2f'% roc_auc) plt.legend(loc='lower right') plt.plot([0,1],[0,1],'r--') plt.xlim([-0.1,1.0]) plt.ylim([-0.1,1.01]) return lrlr = train_lr(X, y, plot_roc=False)
L1规划化
L2规范化
Baseline基础模型:采用线性模型,利用L1
的稀疏性,precision
和recall
均可以达到0.85左右,roc_auc可以达到0.79左右。
由上图可见:
- precision较大时波动波动比较大。recall大于0.8后,准确率下滑严重。
- AUC面积是0.97,后来根据参考文献3知,AUC大于0.92时之后比较难修正。
Baseline模型的评价metric:
1. 收集更多的数据,不适合这个场景。
2. 改变评价标准:
- 使用混淆矩阵计算准确度和回收度。
- F1score
- Kappa
- ROC curves - sensitivity/specificity ratio
数据采样处理
- 收集等多数据:不适合这个场景。
- 过采样Over-sampling:当数据集较少时,主动添加少类别的数据;SMOT算法通过插值来实现。不适合本数据集。容易过拟合,运算时间长。
- 欠采样Under-sampling:当数据集足够大时,删除大类别的数据;集成方法EasyEnsemble/BalanceCascade
通过将反例放在不同学习器中使用,从全局看不会丢失重要信息。
本案例数据量中等:选用欠采样+EasyEnsemble的方式进行数据处理。
使用im-balanced生成测试数据。
from imblearn.ensemble import EasyEnsemblen_subsets = X.size * 2 / (us_X.size) - 1ee = EasyEnsemble(n_subsets=n_subsets)sample_X, sample_y = ee.fit_sample(X, y)
四、模型印象
模型:
选用easy_ensemble
模型来优化。
具体实现代码见在线脚本
核心adboost代码如下:
def boost_data(X, y, weight): size = y.shape[0] index_list = np.linspace(0, size-1, size).astype(int) train_index = np.random.choice(index_list, size, p=weight) train_X = X[train_index, :] train_y = y[train_index] return train_X, train_ydef adboost(X, y, rounds): ensemble = EnsembleModel(rounds) # 初始化weight size = y.shape[0] weight = np.zeros(size) weight[y == 1] = float(1) / sum(y == 1) weight[y == 0] = float(1) / sum(y == 0) weight /= sum(weight) result = np.zeros(size) for i in xrange(rounds): train_X, train_y = boost_data(X, y, weight) dt = DecisionTreeClassifier() ensemble.trees[i] = dt dt.fit(train_X, train_y) y_predict = dt.predict(X)# print "sum:", sum(y_predict != y) train_error = sum(weight * (y_predict != y))# print "train:", train_error beta = (1 - train_error) / float(train_error) ensemble.alpha[i] = 0.5 * np.log(beta) weight *= np.exp(-ensemble.alpha[i] * (y -0.5) * (y - 0.5) * 4) weight /= sum(weight) ensemble.thresh = sum(ensemble.alpha) / 2 return ensemble
结果如下:
对比普通的adboost数据
由上图可知,easy_ensemble提升了平滑度,但是AUC未有提升。
五、特征选择和特征学习
- L1模型进行了嵌入式的特征选择,效果优于L2模型。在寻找解释性时会有帮助。
根据数据的统计特征,可以学习一些统计变量。
增加如下的特征。
new_X = X_train.copy()new_X['V1_'] = new_X.V1.map(lambda x: 1 if x < -3 else 0)new_X['V2_'] = new_X.V2.map(lambda x: 1 if x > 2.5 else 0)new_X['V3_'] = new_X.V3.map(lambda x: 1 if x < -4 else 0)new_X['V4_'] = new_X.V4.map(lambda x: 1 if x > 2.5 else 0)
六、分析结果
使用SNE分析(常用于非线性可视化分析)来观看一次under_sample的结果。如下图所示
由上图可知两种类别的数据是可以区分的,但是部分数据融合在一起,当追求recall较大时,将会误判大量数据。
七、迭代问题
可以优化的方向:
- 可以通过学习新的特征,将数据在新维度上拉开距离
- 在计算机能力允许的情况下,设置合适的round轮次来调参。
八、表述模型
- 根据模型的SNE图和数据性可知,数据质量是比较好的。
- easy_ensemble模型本身使用了adboost和bagging,每棵tree的复杂度不高,降低了bias;通过bagging,降低了variance。最终得到了较好的P-R图和AUC值。
- 通过LR模型的稀疏性特征值,可以制作出一个解释性报告。
参考
- GBM vs xgboost vs lightGBM
- imbalanced-learn
- Exploratory Undersampling for Class-Imbalance Learning
- 预测信用卡欺诈
- 用机器学习构建模型,进行信用卡反欺诈预测
- 信用卡欺诈案例
- 机器学习案例实战-信用卡欺诈检测
- 机器学习案例实战-信用卡欺诈检测
- 机器学习实战(1)信用卡欺诈
- 机器学习案例实战-信用卡欺诈检测
- 基于卷积神经网络的信用卡欺诈侦测
- 逻辑回归进行信用卡欺诈检测
- 如何避免PayPal投诉和信用卡欺诈的纠纷
- 联播大业王恒:五招防止信用卡欺诈
- 回归算法的应用——信用卡欺诈检测案例
- 机器学习案例实战之信用卡欺诈检测
- 机器学习(4)-实例:信用卡欺诈检测
- 干货 | 人工智能如何帮助银行反欺诈:来看看关于银行智能欺诈风险预测模型的研究
- 信用卡
- 信用卡
- 信用卡
- Java在字符串中查找匹配的子字符串
- 数据压缩实验四——DPCM压缩系统的实现和分析
- 爱管闲事的小明
- ubuntu16.04apache下去掉CI的index.php
- Java实现二叉树建立以及三种遍历
- 预测信用卡欺诈
- 补作业 第五次实验 项目5
- 图的存储结构
- Java多线程/并发26、阻塞队列BlockingQueue
- 时间复杂度
- (回溯法)LeetCode#39. Combination Sum
- 多线程并发容器
- 计算天数
- 解决org.hibernate.HibernateException: JDBC Driver class not found: com.mysql.jdbc.Driver