实战人品预测之一 _ 国内大数据竞赛平台

1. 竞赛平台哪家强

 Kaggle 是一个很好的竞赛平台,上面大牛很多,代码分享和思路讲解也很棒,但是它的用户信息和数据全都存在 google 服务器上,虽然网页能看到,但上传下载数据需要连外网,从当前的网络情况看来,只能用 VPN,用起来实在太麻烦了。

  国内的大数据竞赛平台,DataCastle 和天池也不错,也有奖金。比赛结果后,排名靠前参加答辩的选手会将答辩 PPT 分享出来,有时也会分享代码。相对来说天池的数据包含丰富的业务场景,更粘近现实情况,有的比赛还提供在计算平台。

  天池和 Kaggle 都有数据科学家的排行榜,以提供展示实力的途径。

2. 选择竞赛

  从时效来看,建议一开始先选择参赛队多的往期题目,最好是获胜者提供了源代的。很多比赛在结束之后仍开放提交代码并提供线上评分(没有奖金),这样边做边学,速度更快,也不会陷入某个比赛无法自拔。

  从难易来看,建议从简单的开始,如果影响因素太多,难以判别哪里出了问题。最好一开始选择纯数据的。

3. 典型问题

  我觉得在实践的过程中,有几类典型问题是需要常试的:

  1. 以 xgboost 为代表的数据挖掘问题

  2. 自然语言处理相关的问题

  3. 图像处理相关的问题

  4. 关联规则相关问题

  5. 时序相关问题

  本篇中的例子是 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd
from sklearn.linear_model import LogisticRegression

train_x = pd.read_csv("train_x.csv")
train_y = pd.read_csv("train_y.csv")

train_x = train_x.drop('uid', axis=1)
train_y = train_y.drop('uid', axis=1)
print(len(train_x), len(train_y))

logreg = LogisticRegression()
logreg.fit(train_x, train_y)
print(logreg.score(train_x, train_y))

test_output = pd.DataFrame()
test_x = pd.read_csv("input/test_x.csv")
test_output["uid"] = test_x['uid']
test_x = test_x.drop('uid', axis=1)
test_y = logreg.predict_proba(test_x)
test_output["score"] = test_y[:,1]
print(test_output[:10])

test_output.to_csv('input/test_y.csv', index=False)

  看了一下,本地得分 0.898xxx,觉得还不错,上传之后,在线得分 0.51xxx,这得分和瞎蒙差不多。看了一下数据才发现,正反例数据比例不一致,正例占比 0.8982,汗……不过好歹跑通了。

(2) 尝试优化

  1. 本地得分与在线得分

  得分差异主要是正反例数据比例不一致引起的,它使得本地得分没什么参考价值,因为做得再差也能得到 0.89 左右的评分,而改进一点并不明显。

  面对这种情况,比较简单的方法就是使正反例个数相同,为了不损失数据,我使用了重复加反例的方法,处理之后本地评分和线上评分就比较接近了。(有的模型支持 roc_auc,直接设置也可以)

  1. 分开训练集和测试集

  把带标签数据分成 9:1,分别用于 fit 和 score。因为之前加了反例,切分时需要先打乱顺序,避免反例都被分入了测试集。这样结果看起来,就正常多了。

  1. 尝试多个模型

  尽管知道最终会使用 xgboost,还是尝试了几个分类模型,发现有的模型本地得分是 1.0,因为没分开训练和测试集,发生了过拟合,继续汗……

  试了几种简单的树模型,得分比较高的是 ExtraTreeClassifier()。树最重要的是限制过拟合,比如用 min_samples_split 或 max_depth 限制分支条件和树深。

  1. 尝试降维

 1400 个特征实在太多了,用 50000 个无标注数据计算 PCA 降维,观察数据降维后,前 15 维占有效数据的 0.9999 以上,所以使用 PCA 将 1400 维数据降到 15 维,再使用模型分类,效果变差很多,根本没法用。不过我觉得当特征特别多的时候,还是可以做 PCA,然后用特征值最大数据做散点图分析数据。有助于选择分类器。

  估计可能是缺失数据太多影响了 PCA 效果,于是尝试了 SelectPercentile 缩减特征值,它的原理是根据自变量和因变量的相关性降维,当缩特征数减到 50% 时,线上得分差别 0.001 以下,当缩减到 10% 时,正确率只有一半。

  1. 缺失数据

  观察了一下数据,很多 -1 值,我试用均值 mean 填充了一下,效果不好,线上得分还下降了,估计是有的列缺失值太多引起的。

(3) 第一天的尝试结果

  最终使用 sklearn 自带的 gdbt 算法,简单调参的情况下,得到了 0.68*9 的线上得分,名次在 440 名左右。为节省时间,未做更多尝试,开始学习冠军代码(见下篇)。

6. 收获

(1) 保存模型

  尝试 PCA 时,每计算一次 PCA 时间都很长,于是把 PCA 模型保存下来,节约了重复计算的时间,具体使用 joblib 库。

(2) 评分

  不能每做一次都上传服务器,所以本地评分非常重要,一定要先把正反例比例,切分测试集和训练集这样的低级错误排查一遍。否则,根本没法评价优化是否成功。

(3) 修改前先预测

  不要想当然地做降维,也不要因为数据多,开始就切数据,或者缩减实例。一定要先用基础数据做一遍后再优化。

(4) 解决正反例分布不平衡问题(假设正多负少)

  1. 把正样本分为几组,分别和负样本做模型,然后用 Bagging 集成

  2. 在负样本中有放回抽样,使正反比例一致。

  3. 负样本重复若干次,使正反比例一致。

  4. 用近邻的方法模拟负样本,使正反比例一致。

(5) 缺失值的处理

  1. 什么是缺失值?

很多时候,空值并不直接以 Nan 或”,,”这样的方式出现,有时是 0,有时是 -1,一定要直接看数据。

  1. 缺失值有哪些影响?

缺失值多的情况下,不止降低预测效果,对降维也有影响。当缺失值太多,又想降维时,可使用 SelectKBest 系工具,它是根据自变量和因变量的相关性降维的方法。

  1. 缺失值怎么处理?

如果缺失值太多,考虑去掉该特征,因为它可能是噪声,至于怎么界定“太多”,还要分析具体数据(具体见下篇)。

对于连续值,可用中数填充,均值,插值,随机数填充等。

对于离散值,可用一个特殊值填充缺失数据。