信用卡欺诈预测
Link: https://www.kaggle.com/mlg-ulb/creditcardfraud
题目描述
信用卡公司需要能够识别虚假的信用卡交易,以避免用户被骗。本题就是利用欧洲某段时间的信用卡交易记录,来判断某条交易是否属于信用卡欺诈。
数据描述
数据集为2013年9月里某两天欧元区的信用卡交易记录。在这两天中共有284807笔交易,其中的492笔是欺诈。把欺诈交易的类(class) 认为是1,非欺诈交易的类认为是0. 那么这个二元问题中,class为1的样本概率只有0.172%。可见在这个二元问题中,两个类所占的比重相差特别大。也就是说我们的数据集是特别不平衡的。因此同学们在本题中要思考如何处理这种失衡的数据。失衡数据很可能导致train出来的模型是无效模型,具体会在下面“小提示”部分详细说明。
数据集里面有从PCA转换得到的28个features。在下方我放了一点关于PCA转换的阅读材料,感兴趣的同学可以阅读了解一下。但是不了解不影响答题,不建议过多把时间花在上面。之所以进行了PCA转换是因为不能把原始的消费者信用卡记录暴露给公众,这样触犯了用户的隐私。所以做PCA转换处理。可以简单理解为加密。
Features V1, V2, ..., V28都是经过PCA转换后获得的features。没有被PCA转换的,保留了原始数据的是"Time"和"Amount"。"Time"记录了每笔交易和第一笔交易之间的时间间隔,以秒为单位。"Amount"是交易数额。"Class"就是这笔交易的最终分类。如果为1说明这是一笔欺诈交易,为0说明这不是一笔欺诈交易。
- PCA Transformation
小提示
本题数据是非常不平衡的,只有0.172%的交易为欺诈交易。所以如果模型什么也不做,直接把所有的交易预测为非欺诈,也会有超过90%的准确率。因此准确率在本题中不是衡量模型好坏的有效指标。而且对于银行来说,检验到欺诈交易远比检验到非欺诈交易重要。因此本题用来衡量模型好坏的指标是F1值。F1值有既考虑precision,又考虑recall的优点。
可以尝试使用Resampling,包括oversampling, undersampling来处理unbalance数据。参考资料:
Classification问题,可以从Naive Bayes, Logistic Regression, Decision Tree入手
尝试用Cross Validation提高模型效果
先修知识
- F1 score: https://en.wikipedia.org/wiki/F1_score
输入格式
数据集共包含284807条数据。每条记录的第一列Id用作索引。你可能注意到索引并不是连续的。这是因为原始数据并没有区分训练集和测试集。在出题时,这个数据集被认为按照0.8, 0.2的比例分成了训练集和测试集。第二列为“时间”,是这条记录和第一笔记录之间的时间间隔。“时间”后面跟着V1-V28共28个由PCA转换得到features。PCA features后面是amount,代表本次交易的金额。最后的class是要预测的值。如果为0代表这条交易不是欺诈,为1则为欺诈。
如前所述,数据集已经按照0.8, 0.2的比例分成了训练集和测试集。
输出格式
- 提交的csv文件应采用以下格式:一共包含两列,第一列Id代表测试集中对应的数列Id,第二列Class则代表预测出的该笔交易的分类。具体可看提供的sample_submission.csv
衡量标准
一般classification问题可能考虑准确率就够了。但是本题由于超过90%的分类都为非欺诈,即使直接“预测”成非欺诈也会有90%以上的正确率。因此precision在本题并不是最重要的指标。应当注意到,银行更关注的是欺诈交易有没有被都筛选出来,也是recall这个指标所表示的含义。因此本题为了兼顾precision和recall,选择F1 score作为模型好坏的衡量指标,计算方式为2/(1/P+1/R)。
代码与数据
- 训练集creditcard_train.csv:
- 测试集creditcard_test.csv:
- 正确答案correct_class.csv:
- 提交格式样例sample_submission.csv:
- 测试代码
均已上传到OneDrive,地址https://1drv.ms/f/s!AptZ75iiJPpMgxpZjafOeNHBMQ45
如果打不开地址先下载OneDrive Mac/Window客户端
测评配置环境
python
pip install -U scikit-learn
pip install -U numpy
pip install -U pandas
从上面的github地址获得代码测试文件。命令行里跑
python3 scorer.py --predicted_file <predicted_file_path> --true_file <true_file_path>