首页 > 代码库 > 用户人品预测大赛--不得直视本王--冠军分享

用户人品预测大赛--不得直视本王--冠军分享

http://bbs.pkbigdata.com//static/348_detail.html

我是bryan,来自重庆邮电大学的X-Data项目组研二学生。

本次分享活动由我和wepon(来自北大)来做解答。

首先简单介绍下我们的比赛解决方案:

1.  预处理

2.  特征工程

3.  算法模型

4.  总结

5.  Q&A

 

1. 预处理

我们主要对缺失值做了处理,没有使用常用的填充方法,而是最大程度保留缺失值所带来的信息。首先统计了样本的缺失值数量,作为新的特征。然后将缺失数量做了一个排序,发现3份数据都呈阶梯状,于是我们根据缺失数量将数据划分为5部分,作为新的特征。并将缺失值数量大于194的去掉,也就是第5部分数据。

 技术分享

【图1】

 技术分享

【图2】

 

2 特征工程

2.1我们将原始数值特征进行升序排序,将得到的rank作为新的特征。比如特征是15,10,2,100 ,排序后的新特征就是3,2,1,4。

2.2将原始特征等量划分到10个区间作为离散特征,每个新特征的取值就是1-10(可以等量或者等值,我们选择等量划分)

 技术分享

【图3】

2.3计算每个样本离散特征1-10的数量,生成10个新的特征

2.4将特征进行两两交叉x*y  x^2+y^2  1/x+1/y 等等,在生成特征的同时计算与标签列的皮尔逊相关系数保留topK特征(我们保留了1500个)

2.5类别特征进行one-hot处理 (哑变量)

2.6使用xgboost输出的特征重要性对特征进行选择

 技术分享

【图4】

 技术分享

【图5】

 

3 算法模型

    3.1不同算法得到的单模型,Py_xgb,R_xgb,Java_xgb,svm

 技术分享

【图6】

3.2利用特征、参数多样性和差异性进行xgb多个单模型融合

 技术分享

【图7】

3.3计算模型之间MIC,选择相关性小的模型进行多模型加权融合。其中MIC是最大信息系数

 技术分享

【图8】

3.4一种TopK(Max(10*score))的半监督模型。

 技术分享

【图9】

每次从无标签样本中选择,10 个样本,有1024 种打标签方式。使用单模型Py_717(多模型融合复杂度太高)训练1024 次并在测试集上测试,选择线下(train:test 为1:9 的比例)性能提升最多的那组标签。

这里选择10个样本和1:9的划分是因为:如果添加少量样本不能引起模型性能的明显改变,如果11个样本计算时间又成倍增加。所以就选择了一次10个样本(比如10折交叉验证,也不一定非要选10折的,但是经验来说10折靠谱)

训练集和测试集1:9划分是因为:少量训练集可以迭代更快,大量测试集可以更好的验证新添加的样本带来的性能

 

3.5一种rank_avg的融合方式: 

 技术分享

【图10】

这个方法是小江发明的,更能适应模型之间的差异性融合。也就是利用排名来进行融合。

 

4.总结

        我们对数据缺失值做了特殊处理,生成了大量特征,利用xgboost进行特征选择,利用半监督代替了过采样来增加新样本,进行了单模型融合,多模型融合,rank_avg融合。

 技术分享

【图11】

 

 

提问环节

1:加入无用的特征会对模型产生坏的影响,怎么确定计数特征是有用的?又或者说有没有快速高效的方法确定新加入的特征是有效的?

bryan:我们单独使用那10个计数特征线上能达到0.58。

wepon:特征确实不是越多越好,在我们的文档里面也有提到,是有做特征选择的。

bryan:快速判断特征是否有效的话这个没有一个确定的答案,更多的是需要自己做实验去解答。以前天猫推荐的第10名就没做特征选择,因为他生成了几十万的特征。模型也有对特征做一定的处理,比如自带的特征选择,正则化等等。现在比较靠谱的方法就是对特征排序,也不能说排在后面的特征就不好。

 

2:在交叉特征这块,生成特征的同时计算与标签列的皮尔逊相关系数   可是皮尔逊相关系数不是只能衡量两个连续变量间的相关性嘛  跟标签列(类变量)怎么找相关性呀?

bryan:还是一个排序的问题,我们计算每个特征和label相关性之后,选择排序后top500。至于相关性度量有很多方法,我们选择了一个计算方便的方法。

 

3:对于一个代码能力很弱初学者,身边也没有代码能力很强的人,想提高代码能力,也想多学一些机器学习的知识。但感觉要学的知识很多,请问有没有好的学习路径值得推荐,有什么好的建议吗?谢谢

wepon:提高代码能力没什么捷径啊,多写,多参考别人写的代码,特别是Kaggle比赛上一些冠军分享的代码,http://www.chioka.in/kaggle-competition-solutions/ 

 

4:求问 正负标签不平衡处理的经验

bryan:一般解决方法是过采样,但是一般的过采样具有盲目性。第二名就是gan团队分享了一种邻域粗糙集的采样方法。但是本次比赛我们没有使用过采样,而是将半监督结合了过采样,也就是半监督得到的样本其实接近一半是0

5:rang_avg融合时  排名第一的rank不就为1嘛  倒数也是1  第二倒数是1/2  在乘以score是这样的吗?  那排名第一的岂不是没变

wepon:对某个样本,多份单模型的预测结果的rank不一定都是1。 之所以先把预测的score转化为rank再融合,是因为原始的score(0~1之间的概率值)的数值差异可能很小,而rank后的差异就会相对大一些。

 

6:我的问题是svm是没有概率输出的,svm您这是怎么使用的?svm sklearn自己接口转化的吗?

bryan:我们用的是sklearn里的svm,sklearn用的其实也是libsvm,可以转化为概率输出的。第二问:有的。

 

7:线上auc后来做到0.77,能否介绍下是做了怎样处理?听说是跟第二名融合,想详细了解下,谢谢

wepon:比赛结束后,第二名(赛后的)在DC平台刷了一天,刷到了0.76,然后我们用0.74的结果rank_avg融合后就是0。77

 

8:2.1我们将原始数值特征进行升序排序,将得到的rank作为新的特征。比如特征是15,10,2,100 ,排序后的新特征就是3,2,1,4。

请问这是某列的排序还是某行的排序?

wepon:对属性进行排序,列。

bryan:前面wepon回答过,是对每一列排序,得到新的一列排序特征。原始1045列特征,排序后新增1045列数值特征。数值型的特征才排序。

 

9:2.2将原始特征等量划分到10个区间作为离散特征,每个新特征的取值就是1-10(可以等量或者等值,我们选择等量划分)

请问等量划分成10个区间,实际上做不到怎么办,比如说,每个特征90%都是某个数,如何等量十区间呢

wepon:确实有很多特征排序后的rank是相同的,这个时候没办法做到等量划分,我们就按等区间(等值)去划分了

 

10:特征确实不是越多越好,在我们的文档里面也有提到,是有做特征选择的

除了相关系数还可以用哪些参数筛选这些特征。感觉交互特征是原特征的变换,会不会存在共线性

wepon:计算的是单模型结果的MIC,python里面有minepy,其实也不一定要用MIC,其他度量变量之间相关性的一些方法都可以用。另外,做模型融合,更合理的方法可能是做stack learning,但是这次比赛数据量小,我们没有预留数据来做二次学习,所以才想出了这个方法来选单模型。

bryan:可能会存在共线性,但是我们做了一个topK筛选,后面又利用模型对特征排序,然后在M2里面随机选择特征和参数,来减弱特征共线性带来的影响。

 

11:本王自学数据挖掘的经验?

wepon:多参加比赛,多看别人的代码和思路,多和大神交流。DC群里很多隐藏的高手。

bryan:最开始是老板给我800块让我写一个数据挖掘的程序,然后我就把weka里面的常用代码跑了一遍,后来开始参加天池的比赛,跟随大神的脚步。

12:每次从无标签样本中选择10个样本,有1024种打标签方式,这具体指怎么打标签?

bryan:10个无标签样本,有01两种打标方式。所以就是2^10=1024 。具体打标是利用一个位移。比如0位移9次就是000000000,1023位移9次就是1111111111这种

 

13:多模型rank排序是否需要归一化?如果不归一化的话如何计算测试集输出概率?

bryan:其实可以不用归一化,auc本质就是排序。score多少没关系,排名是固定的

wepon:测试集的样本数量是固定的,不需要归一。最终的输出也不一定要用概率值,因为AUC看的是相对的大小

 

14:模型融合阶段M3  各个模型的系数怎么确定的

wepon:系数我没怎么调,单模型效果比较好的给的权重大一点,效果差一点的给的权重小一点。

 

15:求问这个图,坐标轴x,y什么意思,单位是?

 技术分享

【图1】

wepon:统计确实值个数,然后按缺失值个数从小到大排序,横坐标就是这个序号。纵坐标就是缺失值个数。图里面黑色散点图就是对应缺失值个数的。蓝色的曲线是累计的负样本个数

 

16:处理缺失值的时候为什么统计每行数据的缺失值个数而不是统计每列数据的缺失个数,这两者有什么区别吗?还有在统计缺失值个数时你们是不是对数据进行了排序?

bryan:模型输入是以样本为单位,所以统计每个样本,也就是每个人的缺失值,一定程度上也能反映这个人的信用。对缺失值个数进行排序可以进一步观察样本空间分布。

wepon:每行的缺失值个数可以作为该样本的特征,因为在征信领域,一个用户的缺失值越多,代表信息越少,风险可能就相应地大一点。这是我们设计这个特征的初衷。另外,统计完缺失值个数后,可以顺便将缺失多的样本去掉,因为这部分样本可能带入噪声

 

17:想问一下,xgboost做bagging时选择36个模型求平均,N1,N2,N3范围的选取,这些都怎么选择的?

wepon:先线下通过CV选取一组相对比较好的参数,然后再在这组参数左右随机取值

 技术分享

【图12】

wepon:这个方法还是挺不错的,在几个比赛试过,以前天池比赛也有大神做过类似的,效果都不错,大家可以试试。

 

18:问题,是否存在交叉验证的过拟合,就是交叉验证结果很好,但线上成绩很差?这是否说明每一折都出现集体幻觉了?

bryan:一般过拟合很可能是有数据穿越造成,也就是使用了未来的数据。一定要确保训练集里面的数据都是正确的,不能对训练集过采样之后直接交叉验证。

 

19:什么是过采样?

bryan:合成一部分少类样本,来改变样本分布。上采样跟过采样是一个意思。

 

20:请问一下“问题4:一般解决方法是过采样,但是一般的过采样具有盲目性。第二名就是gan团队分享了一种邻域粗糙集的采样方法。但是本次比赛我们没有使用过采样,而是将半监督结合了过采样,也就是半监督得到的样本其实接近一半是0”这是把无标签中识别出的0加到训练集里吗?

bryan:大家有兴趣可以去实现我们的半监督方法,会得到比较有趣的结果。并不是9:1的分布,也不是1:9的分布。我们是将得到的结果全部加到训练集

 

21:想问一下无标签样本的具体利用情况,看分享说的是要看分布,能否说详细一点

bryan:无标签样本我们试过传统半监督方法,效果一般。后来多次实验发现这部分样本不能按常理来利用。也就是这部分样本就是一个不确定值,不如给他们乱打标签,反正他们也没在预测集里出现过。至于分布,需要自己做实验来调整,还有代码里面有个scale_pos_weight 需要调整。

22:问题:数据存在不同位置的特征缺失,你是如何补充这些点的值的?

bryan:-1填充

 

23:您觉得这样的赛制,也就是大量的线上提交并反馈,是否会造成对test的过拟合。也就是说,最终的模型不是一个特别稳健的模型,而只是为了在排行榜不断靠前?

wepon:确实存在这样的问题,其实可以从赛制上去改进,比如把测试数据分为public和private的,另外,这次比赛数据量还是略小了一点。这些都是客观存在的因素,这次比赛答辩,和其他队伍的大神也交流了,大多数都有通过线上反馈来调整模型的做法。

bryan:这个道理就和大家每天提交一样的,会选结果较好的模型进行融合一样。我们的无标签样本经过了两次筛选,第一次是线下筛选,第二次是线上筛选。如果没有线上筛选环节的话,可以使用另一种方式来解决,就是把无标签样本均匀分到多个模型,然后做模型融合。

 

24:经过特征筛选后,最后进入模型的特征大概有多少个?

bryan:1000+

 

25:暴力方法里面有个将一组10个样本与多少个有标签样本一起训练?是否使用了交叉验证?

bryan:这个模型时间复杂度有点大,所以我们使用了大量的测试集来做验证,如果用交叉验证的话又是成倍的时间增加。但是交叉验证确实是更靠谱的一种做法。

 

26:rank_avg问题,假设三个模型auc分别为0.9 0.8 0.7,那么rank相应为1 2 3  然后融合时,用1*score1+1/2score2+1/3*score3  是这样理解吗

bryan:rank_avg是对score做排序,不是auc ,是多个模型对应样本来相加

wepon:是对模型预测的值进行rank

 

27:问题,是否存在两组xgboost的参数,单看每个参数都差异很大,但预测的成绩不相上下?

wepon:肯定有的,参数空间辣么大,我也不敢保证自己找到的参数是最优的。但是参数不同,模型就会有多样性(即使auc一样),对后面得模型融合会有很大帮助

 

28:数据挖掘比赛组队,你们是怎么分工的。每个人都能写模型,然后融合在一起呢。还是有人负责理论查资料,有人负责代码实现?

bryan:我和wepon是主代码手 ,其他同学负责找资料,提供思路,文档,ppt等等

 

29:问题:用-1填充训练数据和测试数据缺失值,然后再计算排序特征,离散特征,计数特征会不会导致特征的噪音太多,对后续的分类算法性能有很大影响?

bryan:排序特征可以很好的克服噪音。特征太多在后面可以进行特征选择。特征确实是决定模型的上限,特征工程没做好,参数调到老。。。

wepon:排序特征和离散特征相对来说更加稳定一些,单独用排序特征的效果比单独用原始特征的效果要好(我所尝试过的结果是这样的)。而把它们简单地堆在一起却不一定能达到更好的效果,所以要做特征选择,选取Top k特征

 

30:怎么平衡搞科研发论文的压力跟比赛的压力呢?

bryan:做比赛可以让你搞科研更熟练,搞科研可以让做比赛更有理论支撑。

wepon:大家读硕士,如果不是想继续读博的话,相信都是冲着工作去的。参加比赛,如果只是抱着学习的态度,花的时间可能相对少一点,但是如果想要取得好成绩,还是需要花费大量时间个精力的,我只能说量力而行。还有就是,找靠谱的队友,会分担不少工作量

 

31:请问你们电脑的配置?做数据挖掘,电脑性能瓶颈在哪儿?

bryan:我的电脑是拯救者-14  i7 120G固态 16G内存   另外实验室有集群可供使用。

wepon:我是i7 8核,基本够跑,不够的话上服务器

 

32:关于数据挖掘模型的解释性。如果判定一个人的违约可能性为0.9,你怎么去向这个人解释你为什么可能性是这么大?如何从模型的角度抽出信息,向他做一番解释?

wepon:可解释性必须建立在理解了业务的基础上啊,这次比赛并没有给特征的意义。如果说知道特征的含义,那么基于tree的算法,可解释性还是比较强的

 

33:wepon学数据挖掘多久了呢?bryan学数据挖掘多久了呢?

bryan:wepon现在是研一小鲜肉哦~

wepon:大四无聊的时候开始学的,其实我是对机器学习感兴趣多一些。业余时间玩比赛

bryan:我研一开始学的,现在研二,建议大家多认识一些大腿,我推荐天音,wepon,小江,苍老师,还有很多大神我也不认识~

 

34:大神能推荐一些机器学习的入门资料吗

bryan:http://blog.csdn.net/bryan_

 

35:bryan的技能栈?

bryan:java,sql,mapreduce,会点点调模型的Python代码,目前还在学Python。

 

36:终极问题,代码是否可分享给菜鸟学习?数据是否可用于科研、学术论文?

bryan:代码将分享到github上,链接为:https://github.com/wepe/DataCastle-Solution

小运营:竞赛数据可以用于科研和论文发表,但请务必注明数据来源,“数据来源于CashBUS现金巴士赞助的微额借款用户人品预测大赛,经CashBUS授权使用”。

 
 

用户人品预测大赛--不得直视本王--冠军分享