实战人品预测之一_国内大数据竞赛平台
实战人品预测之一 _ 国内大数据竞赛平台
1. 竞赛平台哪家强
Kaggle 是一个很好的竞赛平台,上面大牛很多,代码分享和思路讲解也很棒,但是它的用户信息和数据全都存在 google 服务器上,虽然网页能看到,但上传下载数据需要连外网,从当前的网络情况看来,只能用 VPN,用起来实在太麻烦了。
国内的大数据竞赛平台,DataCastle 和天池也不错,也有奖金。比赛结果后,排名靠前参加答辩的选手会将答辩 PPT 分享出来,有时也会分享代码。相对来说天池的数据包含丰富的业务场景,更粘近现实情况,有的比赛还提供在计算平台。
天池和 Kaggle 都有数据科学家的排行榜,以提供展示实力的途径。
2. 选择竞赛
从时效来看,建议一开始先选择参赛队多的往期题目,最好是获胜者提供了源代的。很多比赛在结束之后仍开放提交代码并提供线上评分(没有奖金),这样边做边学,速度更快,也不会陷入某个比赛无法自拔。
从难易来看,建议从简单的开始,如果影响因素太多,难以判别哪里出了问题。最好一开始选择纯数据的。
3. 典型问题
我觉得在实践的过程中,有几类典型问题是需要常试的:
以 xgboost 为代表的数据挖掘问题
自然语言处理相关的问题
图像处理相关的问题
关联规则相关问题
时序相关问题
本篇中的例子是 DataCastle 平台的“微额借款用户人品预测大赛”,属于 xgboost 问题,详见:
http://www.pkbigdata.com/common/cmpt/微额借款用户人品预测大赛 _ 竞赛信息.html
4. 人品预测项目
(1) 描述
比赛的主题是通过数据挖掘来分析”小额微贷“申请借款用户的信用状况。提供的特征以 x1,x2…表示,也就是说不知道各特征的具体意义。共 1400 个特征,带标签数据 15000 个,不带标签数据 50000 个,最终需要对 5000 个数据进行预测,上传预测结果,得到线上的 AUC 评分。
该题目就属于:数据不多且干净,参赛队近 3000 支,冠军使用的算法是数据大赛最常用 xgboost,他还提供了答辩报告书和源码。
(2) 比赛结果
从排行榜看,除第一名最高得分是 0.77209,第二名 0.76289 之外,前 400 名分数都在 0.7-0.735 之间。当然这也可能是由于冠军分享了他在比赛中最高得分 0.7341 的代码,一些人后期使用了他的代码得到了高分。
5. 人品预测初体验
(1) 随便找个模型
第一步下载所有数据,扫了一眼文件格式,随便找个模型,代进去,预测之后上传服务器,以熟悉基本流程。因为是个分类问题,所以随便用了逻辑回归模型。
1 | import pandas as pd |
看了一下,本地得分 0.898xxx,觉得还不错,上传之后,在线得分 0.51xxx,这得分和瞎蒙差不多。看了一下数据才发现,正反例数据比例不一致,正例占比 0.8982,汗……不过好歹跑通了。
(2) 尝试优化
- 本地得分与在线得分
得分差异主要是正反例数据比例不一致引起的,它使得本地得分没什么参考价值,因为做得再差也能得到 0.89 左右的评分,而改进一点并不明显。
面对这种情况,比较简单的方法就是使正反例个数相同,为了不损失数据,我使用了重复加反例的方法,处理之后本地评分和线上评分就比较接近了。(有的模型支持 roc_auc,直接设置也可以)
- 分开训练集和测试集
把带标签数据分成 9:1,分别用于 fit 和 score。因为之前加了反例,切分时需要先打乱顺序,避免反例都被分入了测试集。这样结果看起来,就正常多了。
- 尝试多个模型
尽管知道最终会使用 xgboost,还是尝试了几个分类模型,发现有的模型本地得分是 1.0,因为没分开训练和测试集,发生了过拟合,继续汗……
试了几种简单的树模型,得分比较高的是 ExtraTreeClassifier()。树最重要的是限制过拟合,比如用 min_samples_split 或 max_depth 限制分支条件和树深。
- 尝试降维
1400 个特征实在太多了,用 50000 个无标注数据计算 PCA 降维,观察数据降维后,前 15 维占有效数据的 0.9999 以上,所以使用 PCA 将 1400 维数据降到 15 维,再使用模型分类,效果变差很多,根本没法用。不过我觉得当特征特别多的时候,还是可以做 PCA,然后用特征值最大数据做散点图分析数据。有助于选择分类器。
估计可能是缺失数据太多影响了 PCA 效果,于是尝试了 SelectPercentile 缩减特征值,它的原理是根据自变量和因变量的相关性降维,当缩特征数减到 50% 时,线上得分差别 0.001 以下,当缩减到 10% 时,正确率只有一半。
- 缺失数据
观察了一下数据,很多 -1 值,我试用均值 mean 填充了一下,效果不好,线上得分还下降了,估计是有的列缺失值太多引起的。
(3) 第一天的尝试结果
最终使用 sklearn 自带的 gdbt 算法,简单调参的情况下,得到了 0.68*9 的线上得分,名次在 440 名左右。为节省时间,未做更多尝试,开始学习冠军代码(见下篇)。
6. 收获
(1) 保存模型
尝试 PCA 时,每计算一次 PCA 时间都很长,于是把 PCA 模型保存下来,节约了重复计算的时间,具体使用 joblib 库。
(2) 评分
不能每做一次都上传服务器,所以本地评分非常重要,一定要先把正反例比例,切分测试集和训练集这样的低级错误排查一遍。否则,根本没法评价优化是否成功。
(3) 修改前先预测
不要想当然地做降维,也不要因为数据多,开始就切数据,或者缩减实例。一定要先用基础数据做一遍后再优化。
(4) 解决正反例分布不平衡问题(假设正多负少)
把正样本分为几组,分别和负样本做模型,然后用 Bagging 集成
在负样本中有放回抽样,使正反比例一致。
负样本重复若干次,使正反比例一致。
用近邻的方法模拟负样本,使正反比例一致。
(5) 缺失值的处理
- 什么是缺失值?
很多时候,空值并不直接以 Nan 或”,,”这样的方式出现,有时是 0,有时是 -1,一定要直接看数据。
- 缺失值有哪些影响?
缺失值多的情况下,不止降低预测效果,对降维也有影响。当缺失值太多,又想降维时,可使用 SelectKBest 系工具,它是根据自变量和因变量的相关性降维的方法。
- 缺失值怎么处理?
如果缺失值太多,考虑去掉该特征,因为它可能是噪声,至于怎么界定“太多”,还要分析具体数据(具体见下篇)。
对于连续值,可用中数填充,均值,插值,随机数填充等。
对于离散值,可用一个特殊值填充缺失数据。