美文网首页
天池挖掘幸福感新人赛——个人赛后总结

天池挖掘幸福感新人赛——个人赛后总结

作者: ban_a695 | 来源:发表于2019-07-27 11:36 被阅读0次

    一、参赛背景

    一条通信专业的闲鱼突然对AI产生了浓厚的兴趣,天天看着各种新闻报导AI相关的东西,只是知道它的相关应用,但具体是怎么回事一直困扰着我,求知欲迫使自己开始了这段艰难的学习历程。一开始是在朋友推荐下先看了吴恩达老师关于机器学习的视频,后来又在朋友推荐下学习了李航老师的《统计学习方法》、周志华老师的《机器学习》,然后就是实现所需的计算机语言,也就是python了,因为自己也算了“科班出身”,对C比较熟悉,用的非常多,一些编程思想还是有的,再加上python比较简单,所以学起来也是比较快,再然后便是学习了《利用python进行数据挖掘》这本书。学了这么多,是骡子是马,当然要拉出来练练,和数学题一样,看得懂和做得出是两回事,于是在朋友推荐下参加了这个比赛,也是感谢天池提供了一个这么好的平台让我练手。

    二、赛题说明

    赛题使用公开数据的问卷调查结果,选取其中多组变量,包括个体变量(性别、年龄、地域、职业、健康、婚姻与政治面貌等等)、家庭变量(父母、配偶、子女、家庭资本等等)、社会态度(公平、信用、公共服务等等),来预测其对幸福感的评价。赛事训练集提供了8000条训练数据,139个特征、测试集是有2968条数据,数据量偏小。得分计算公式为:

                                                  score = \frac{1}{n} \sum_{1}^n(y_{i}- y^*)^2

    其中n代表测试集样本数,y_{i} 代表第i个样本的预测值,y^*代表真实值。

    比赛地址:【新人赛】快来一起挖掘幸福感!-天池大赛-阿里云天池

    三、数据预处理

    首先是对label的整体观测:如图,60.3%满意度为4,然后是17.7%为5,3占比是14.5%,2为6.2%,其余为1。关于happiness的解释是:1 = 非常不幸福; 2 = 比较不幸福; 3 = 说不上幸福不幸福; 4 = 比较幸福; 5 = 非常幸福。通过对饼状图和柱形图的观察,发现label“happiness”值为4和5的样本占比高达80%以上,这是很明显的数据不均衡,这可能导致我们训练出来的模型对3、4、5的预测相对于对1、2的预测会更加准确,甚至很大概率对1和2的预测发生很大偏差。

    happiness分布

    然后是对异常值、缺失值的处理:对于label值“happiness”存在8个异常值-8,占比较小,自己也是选择果断丢弃了这八个样本。“survey_time”与“出生日期”这两项的数据,因为数据类型的原因不好处理,所以选择用调查时间减去出生日期得到年龄“age”这一列作为新的特征,同时舍弃其他两个特征。关于家庭年总收入与个人年总收入这两列,数据跨度较大,选择使用简单sigmoid函数将其映射至(0,1)区间使数据更加平滑,模型更好处理。另外其他的一些分数类数据比如:public_service等,则是选择将其离散化,划分为六个等级。0至5,这里切分点的选择是关键,我这里是参照describe打印的数据进行的切分点选择,不是很理想,建议参考卡方,信息增益,基尼指数或者WOE(要求目标变量是两元变量)等。另外发现有三列数据类型为object,而且是大量缺失,缺失比例高达90%以上,然后描述的问题差不多,只是文字不同,所以我这里选择的是对缺失值填0,其他填1:

    data_train["property_other"] = data_train["property_other"].map(lambda x: 0 if pd.isnull(x) else 1)

    再如其他缺失值,通过.describe观测其数据基本符合正态分布,这里采用最简单常用的均值填充。

    四、数据初步分析

    (1)相关性分析: 

    使用了皮尔逊相关系数(取值是(-1,1)),分析了各个特征与label的相关系数,其中排名前五的特征分别为:depression(0.32),family_status(0.30),equity(0.28),class(0.25),health(0.24),这说明这些特征在之后的建模中会拥有更高的权重,也说明实际生活中,一个人幸不幸福,与之相关的前五项因素分别是:沮丧成度、家庭经济状况、社会公平性、本人所处等级和目前身体状况。这也符合当今社会的社会现实,有一项不是很理想,都会严重影响一个人的幸福感!最后选择了相关性大于0.01的作为建模所需特征。

    (2)depression分布

    depression的解释是:在过去的四周中您感到心情抑郁或沮丧的频繁程度,1 = 总是; 2 = 经常; 3 = 有时; 4 = 很少; 5 = 从不;在相关系数里排名最高达0.32,最大值为5,最小值为-8,有18个,均值为3.81。1/4与3/4中位数分别为3和5,中位数为4,符合正态分布。与happiness的关系分布如图:

    幸福感与沮丧程度关系图

    可以发现18个异常值-8的幸福指数均为3,所以我做的是提取所有幸福指数为3的样本然后用这些样本的depression的平均值填充这18个异常值。

    五、算法选择

    关于算法的选取自己其实是模糊的,不是很清楚对于这种问题什么算法最好,只是知道xgboost是kaggle比赛大杀器,再基于前辈们的经验,一开始使用的是xgboost作为第一个算法模型,用了sklearn里的cv作为验证集调参,发现训练误差还可以,但是上传.csv文件后发现排名140多,测试误差让人不是很满意,于是陆续用了lightgbm和cat boost结果也不是很让人满意,最后选择了使用stacking模型融合,将三种强大的算法融合在一起。效果还是很明显的,排名瞬间上身100多。

    六、初步成绩

    通过数据预处理、数据分析,选择了三种强大算法的stacking融合,最后成绩是0.4687(四舍五入为0.469),排在第31名。这个结果也只能是差强人意,自己也有信心如果继续往下做下去应该是可以进前十(第十名成绩0.466,只差0.003),但因为新人赛,自己也走了一个完整的流程,还需要很多时间去完善各个方面的知识并朝着神经网络进发,也是打算这个比赛到此为止了。

    最终成绩排名

    虽然现在mse的值与整体排名相对靠前,但是模型对幸福度1、2的预测还是相对不准的,在实际业务中,对于1、2的区分相比3、4、5弱了很多,这里只是计算均方差不高,但实际对每个程度的幸福感的区分不是特别理想的。而且,个人感觉这个0.469的误差大部分是来自对1、2的预测,原因上面也提到了,这两项的训练数据太少,生成的模型对这两项的预测能力相对是低的。关于如何提高整体排名,个人觉得还是要回到数据中去,因为数据和特征才是决定机器学习上限的地方,算法与模型只能逼近这个上限,通过对数据的观察,某些特征是存在联系的,去找出这些联系,提取出特征,成绩应该还能再往上提一提。

    七、模型分析

    关于自己的这个模型,感觉是存在over-fitting现象的,训练误差要比测试误差大一些,虽然差的不多。关于对数据的处理也做得不是很理想,可惜数据量不够,不然可以将训练数据采样出一部分作为验证集,让自己的模型在验证集上表现好一些,这样不至于每天只有两次机会(每天中午12点和晚上八点更新排名)测试自己模型的表现,关于处理over-fitting也可以:早停止,数据集扩增,正则化,交叉验证等方法防止。最后讲讲对stacking模型融合的分析,这里stacking是将三种强大的分类器(xgboost、lightgbm、catboost)作为弱分类器,将他们得出的结果作为第一阶段的预测,然后作为下一阶段的特征,比起相互独立的预测模型能够有更强的非线性表述能力,降低泛化误差。

    相关文章

      网友评论

          本文标题:天池挖掘幸福感新人赛——个人赛后总结

          本文链接:https://www.haomeiwen.com/subject/pfssrctx.html