幸福感预测 Task14:集成学习案例一

1. 背景介绍
幸福感是一个古老而深刻的话题 , 是人类世代追求的方向 。与幸福感相关的因素成千上万、因人而异 , 大如国计民生 , 小如路边烤红薯 , 都会对幸福感产生影响 。这些错综复杂的因素中 , 我们能找到其中的共性 , 一窥幸福感的要义吗?
该案例为幸福感预测这一经典课题 , 希望在现有社会科学研究外有其他维度的算法尝试 , 结合多学科各自优势 , 挖掘潜在的影响因素 , 发现更多可解释、可理解的相关关系 。
具体来说 , 该案例就是一个数据挖掘类型的比赛——幸福感预测的 。具体来说 , 我们需要使用包括个体变量(性别、年龄、地域、职业、健康、婚姻与政治面貌等等)、家庭变量(父母、配偶、子女、家庭资本等等)、社会态度(公平、信用、公共服务等等)等139维度的信息来预测其对幸福感的影响 。
数据来源于国家官方的《中国综合社会调查(CGSS)》文件中的调查结果中的数据 , 数据来源可靠可依赖 。
这也是集成学习三个月以来完成的第一个较为完整的项目 , 从零到一体验一次数据分析和建模的过程 。
2. 数据信息
赛题要求使用以上 139 维的特征 , 使用 8000 余组数据进行对于个人幸福感的预测(预测值为1 , 2 , 3 , 4 , 5 , 其中1代表幸福感最低 , 5代表幸福感最高) 。
3. 评价指标
最终的评价指标为均方误差MSE , 即:
S c o r e = 1 n ∑ 1 n ( y i ? y ? ) 2 Score = \frac{1}{n} \sum_1 ^n (y_i - y ^*)^2 Score=n1?1∑n?(yi??y?)2
4. 数据预处理
数据预处理包括很多个方面 , 也是非常耗费时间的一件事情 。首先 , 要对数据进行读取 , 查看数据的基本情况 。
train = pd.read_csv("train.csv", parse_dates=['survey_time'],encoding='latin-1') test = pd.read_csv("test.csv", parse_dates=['survey_time'],encoding='latin-1') #latin-1向下兼容ASCIIprint(train.head())print(test.head())print(train.columns)print(train.columns)
之后呢 , 要查看数据的说明表 , 理解数据的每一列的意思 , 查看缺失值和异常值 , 对缺失值和异常值进行处理 , 如将值为负数的值变为0 , 以众数或平均数来填补缺失值等等方法 , 针对不同的属性还有不同的处理方法 , 这里先列举一部分 。
缺失值处理
#填充缺失值 共25列 去掉4列 填充21列#以下的列都是缺省的 , 视情况填补data['work_status'] = data['work_status'].fillna(0)data['work_yr'] = data['work_yr'].fillna(0)data['work_manage'] = data['work_manage'].fillna(0)data['work_type'] = data['work_type'].fillna(0)data['edu_yr'] = data['edu_yr'].fillna(0)data['edu_status'] = data['edu_status'].fillna(0)data['s_work_type'] = data['s_work_type'].fillna(0)data['s_work_status'] = data['s_work_status'].fillna(0)data['s_political'] = data['s_political'].fillna(0)data['s_hukou'] = data['s_hukou'].fillna(0)data['s_income'] = data['s_income'].fillna(0)data['s_birth'] = data['s_birth'].fillna(0)data['s_edu'] = data['s_edu'].fillna(0)data['s_work_exper'] = data['s_work_exper'].fillna(0)data['minor_child'] = data['minor_child'].fillna(0)data['marital_now'] = data['marital_now'].fillna(0)data['marital_1st'] = data['marital_1st'].fillna(0)data['social_neighbor']=data['social_neighbor'].fillna(0)data['social_friend']=data['social_friend'].fillna(0)data['hukou_loc']=data['hukou_loc'].fillna(1) #最少为1 , 表示户口data['family_income']=data['family_income'].fillna(66365) #删除问题值后的平均值