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) 随便找个模型

 第一步下载所有数据,扫了一眼文件格式,随便找个模型,代进去,预测之后上传服务器,以熟悉基本流程。因为是个分类问题,所以随便用了逻辑回归模型。

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) 尝试优化

i. 本地得分与在线得分
 得分差异主要是正反例数据比例不一致引起的,它使得本地得分没什么参考价值,因为做得再差也能得到0.89左右的评分,而改进一点并不明显。
 面对这种情况,比较简单的方法就是使正反例个数相同,为了不损失数据,我使用了重复加反例的方法,处理之后本地评分和线上评分就比较接近了。(有的模型支持roc_auc,直接设置也可以)

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

iii. 尝试多个模型
 尽管知道最终会使用xgboost,还是尝试了几个分类模型,发现有的模型本地得分是1.0,因为没分开训练和测试集,发生了过拟合,继续汗……
 试了几种简单的树模型,得分比较高的是ExtraTreeClassifier()。树最重要的是限制过拟合,比如用min_samples_split或max_depth限制分支条件和树深。

iv. 尝试降维
 1400个特征实在太多了,用50000个无标注数据计算PCA降维,观察数据降维后,前15维占有效数据的0.9999以上,所以使用PCA将1400维数据降到15维,再使用模型分类,效果变差很多,根本没法用。不过我觉得当特征特别多的时候,还是可以做PCA,然后用特征值最大数据做散点图分析数据。有助于选择分类器。
 估计可能是缺失数据太多影响了PCA效果,于是尝试了SelectPercentile缩减特征值,它的原理是根据自变量和因变量的相关性降维,当缩特征数减到50%时,线上得分差别0.001以下,当缩减到10%时,正确率只有一半。

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

(3) 第一天的尝试结果

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

6. 收获

(1) 保存模型

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

(2) 评分

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

(3) 修改前先预测

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

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

i. 把正样本分为几组,分别和负样本做模型,然后用Bagging集成
ii. 在负样本中有放回抽样,使正反比例一致。
iii. 负样本重复若干次,使正反比例一致。
iv. 用近邻的方法模拟负样本,使正反比例一致。

(5) 缺失值的处理

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

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

iii. 缺失值怎么处理?
如果缺失值太多,考虑去掉该特征,因为它可能是噪声,至于怎么界定“太多”,还要分析具体数据(具体见下篇)。
对于连续值,可用中数填充,均值,插值,随机数填充等。
对于离散值,可用一个特殊值填充缺失数据。


技术文章定时推送
请关注公众号:算法学习分享

posted on 2017-12-05 19:56  xieyan0811  阅读(28)  评论(0编辑  收藏  举报