快来一起挖掘幸福感--新人实战--阿里云天池

学习内容概括:

本赛题尝试了幸福感预测这一经典课题,希望在现有社会科学研究外有其他维度的算法尝试,结合多学科各自优势,挖掘潜在的影响因素,发现更多可解释、可理解的相关关系。跟着赛事论坛中的baseline完成比赛。


学习内容:

特征工程
模型训练
模型融合

特征工程:

数据来源:数据来自中国人民大学中国调查与数据中心主持之《中国综合社会调查(CGSS)》项目。感谢此机构及其人员提供数据协助。中国综合社会调查为多阶分层抽样的截面面访调查。
考虑到变量个数较多,部分变量间关系复杂,数据分为完整版和精简版两类。可从精简版入手熟悉赛题后,使用完整版挖掘更多信息。complete文件为变量完整版数据,abbr文件为变量精简版数据。
本次特征工程采用的是完整版数据。
在这里插入图片描述
对如下的变量,数据清洗和处理,如果值小于0的,进行填充0处理。
在这里插入图片描述
对如下变量,根据含义,如果值小于0的进行填充1处理。
在这里插入图片描述
对如下变量,根据含义,如果值小于0的进行填充2处理。
在这里插入图片描述
对如下变量,根据含义,如果值小于0的统一进行填充nan处理。
在这里插入图片描述
新增特征处理这里需要注意的是,调查问卷是2015年出的,计算出年龄,并且根据年龄分组计算个人、家庭等的平均收入作为新特征。

在这里插入图片描述

#调查年龄
data['survey_age'] = 2015-data['birth']

根据年龄分组如下:

data['age_income_mean'] = data.groupby(['survey_age'])['income'].transform('mean').values
data['age_family_income_mean'] = data.groupby(['survey_age'])['family_income'].transform('mean').values
data['age_equity_mean'] = data.groupby(['survey_age'])['equity'].transform('mean').values
data['age_depression_mean'] = data.groupby(['survey_age'])['depression'].transform('mean').values
data['age_floor_area_mean'] = data.groupby(['survey_age'])['floor_area'].transform('mean').values
data['age_edu_mean'] = data.groupby(['survey_age'])['edu'].transform('mean').values
data['age_health_mean'] = data.groupby(['survey_age'])['health'].transform('mean').values

根据年龄和性别同时分组取平均的个人、家庭等收入新增的特征如下:

data['age_gender_income_mean'] = data.groupby(['survey_age','gender'])['income'].transform('mean').values
data['age_gender_family_income_mean'] = data.groupby(['survey_age','gender'])['family_income'].transform('mean').values
data['age_gender_equity_mean'] = data.groupby(['survey_age','gender'])['equity'].transform('mean').values
data['age_gender_depression_mean'] = data.groupby(['survey_age','gender'])['depression'].transform('mean').values
data['age_gender_floor_area_mean'] = data.groupby(['survey_age','gender'])['floor_area'].transform('mean').values
data['age_gender_health_mean'] = data.groupby(['survey_age','gender'])['health'].transform('mean').values
data['age_gender_edu_mean'] = data.groupby(['survey_age','gender'])['edu'].transform('mean').values

模型训练:

本竞赛是连续性变量的预测,评测指标如下,测试值与真实值的偏差大小作为衡量标准。
在这里插入图片描述
尝试使用LigthGBM模型和xgboost模型。
LigthGBM是boosting集合模型中的新进成员,由微软提供,它和XGBoost一样是对GBDT的高效实现,原理上它和GBDT及XGBoost类似,都采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。

from sklearn.metrics import roc_auc_score, roc_curve, mean_squared_error,mean_absolute_error, f1_score
import lightgbm as lgb
import xgboost as xgb
import os
from sklearn.linear_model import BayesianRidge
from sklearn.model_selection import  KFold, StratifiedKFold,GroupKFold, RepeatedKFold

在进行模型训练之前,需要对nan数据进行处理。

data.fillna(-1,inplace=True)
data.head()

采用了10折叠的交叉验证

folds = KFold(n_splits=10, shuffle=True, random_state=1016)   #StratifiedKFold?   KFold

verbose_eval:verbose 表示冗长的意思,很多模块都有类似名字的参数,eval是英文评估的缩写;所以在在这里就是表达是否要详细显示评估信息的参数。举个栗子,我将这个参数设置为10,那就则每隔10次迭代输出一次评估结果——评估结果就是正确率召回率这些指标。也可以给这个参数传True or False,比如,False,则评估结果不会输出。
early_stopping_rounds提供了一种自动查找n_estimators(num_round)最佳值的方法。当验证分数停止改进时,过早地停止会导致模型还没达到n_estimators就停止迭代。明智的做法是为n_estimators(num_round)设置一个较大的值,然后使用early_stopping_rounds来找到停止迭代的最佳时间。

clf = lgb.train(param, trn_data, num_round, valid_sets = [trn_data, val_data], verbose_eval=200, early_stopping_rounds = 200)
clf = xgb.train(dtrain=trn_data, num_boost_round=20000, evals=watchlist, early_stopping_rounds=200, verbose_eval=100, params=xgb_params)

问题记录:

问题1.编程时遇到这样的问题,dropna().mode().values意思是剔除该列中含缺失值的行,并将该列中出现次数最多的值赋予大于6的那行,mode()函数就是取出现次数最多的元素。就是用众数替换。但是报错了。
在这里插入图片描述
查看dropna().mode().values返回的值,都是只有一个数的数组。所以按说不会出现length than the value的问题。可能是此python版本的原因。
在这里插入图片描述
改为如下,返回众数的第一个元素值,不再是返回一个元素的数组,问题解决。

data.loc[data['public_service_'+str(i)]<0,'public_service_'+str(i)] = data['public_service_'+str(i)].dropna().mode()[0]

问题2.对于悠闲指数,满意指数,信任指数等特征,个人理解应该使用均值(mean)衡量而不是和(sum)衡量。
问题3.数据集中包含了受访者的身高与体重。只凭体重的名义数值是不能够判断一个人的胖瘦程度的。国际上常用BMI指数衡量人的胖瘦和健康程度,我们可以将数据集中的体重转换为BMI指数再做分析。


学习总结:

经过对特征的部分改动,分数稍高于baseline的分数,但是仍有提升空间,包括特征的筛选后再训练。特征也有再进行处理的空间。也可尝试其他模型比如XGBT等训练尝试,再进行模型融合看是否还有提高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值