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

一、参赛背景

一条通信专业的闲鱼突然对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 = 非常幸福。


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.4698(四舍五入为0.470),排在第45名。这个结果也只能是差强人意,自己也有信心如果继续往下做下去应该是可以进前十(第十名成绩0.046,只差0.001),但因为新人赛,自己也走了一个完整的流程,还需要很多时间去完善各个方面的知识并朝着神经网络进发,也是打算这个比赛到此为止了。


天池最终排名

七、模型分析

关于自己的这个模型,感觉是存在over-fitting现象的,训练误差要比测试误差大一些,虽然差的不多。关于对数据的处理也做得不是很理想,可惜数据量不够,不然可以将训练数据采样出一部分作为验证集,让自己的模型在验证集上表现好一些,这样不至于每天只有两次机会(每天中午12点和晚上八点更新排名)测试自己模型的表现,关于处理over-fitting也可以:早停止,数据集扩增,正则化,交叉验证等方法防止。

https://www.jianshu.com/p/3c2c52a091d3

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论