集成学习案例一 (幸福感预测)
这里做了大量的调查,中国综合社会调查(CGSS)2015 年度调查问卷(居民问卷),调查来自于中国人民大学。
共计有 90 个问题,基本为选择题。
B 部分 十年回顾 共计有 20 个问题
C 部分 EASS 模块 共计有 25 个问题
C1. 从以下几个方面来看,您觉得单位给您的待遇是否合理?【出示示卡 14】
非常合理 比较合理
无所谓合
理不合理
比较不合理 非常不合理
1. 您的工作技能 1 2 3 4 5
2. 您工作的努力程度 1 2 3 4 5
3. 您的工作资历 1 2 3 4 5
4. 您的工作业绩 1 2 3 4 5
5. 您在工作中所承担的责任 1 2 3 4 5
注明:当 A58=1 时回答 C1-C3
C2. 关于您单位薪酬和升职等人事方面决策过程的如下说法,您觉得是否与实际情况相符?【出
示示卡 15】
非常符合 比较符合
无所谓符
合不符合
比较不
符合
非常不
符合
1. 我们单位不会听取与这项决策有关的大多数职
工的意见 1 2 3 4 5
2. 我们单位在进行考评时没有收集充分的信息 1 2 3 4 5
3. 我们单位的人事决策会受到像校友、老乡、亲
戚等各种社会关系的影响 1 2 3 4 5
4. 我们单位的人事决策会受到决策者们偏见或者
个人感情的影响 1 2 3 4 5
5. 我们单位做人事决策会受到单位外部的权力和
人际关系的影响 1 2 3 4 5
D 部分 ISSP 模块 共计有 44 个问题
D1. 下列关于工作的说法,您是否同意?【出示示卡 16】
非常同意 比较同意
无所谓同
意不同意
比较不同意 非常不同意
1.工作只是一种挣钱的方式而已 1 2 3 4 5
2.即使我不需要钱,我也希望能有一份
有报酬的工作 1 2 3 4 5
D2. 对于一份工作,您认为以下因素是否重要?【出示示卡 18】
非常重要 比较重要
无所谓重要
不重要
比较不重要 非常不重要
1.工作稳定 1 2 3 4 5
2.收入高 1 2 3 4 5
3.好的升职机会 1 2 3 4 5
4.工作有趣 1 2 3 4 5
5.可以让人独立工作 1 2 3 4 5
6.可以让大家互相帮助 1 2 3 4 5
7.对社会有益 1 2 3 4 5
8.可以让人自由决定工作
时间或天数 1 2 3 4 5
9.能够与他人打交道 1 2 3 4 5
E 部分 能源模块 共计有 115 个问题
E1. 您家迁入该住房的时间是:
[____|____|____|____]年
E2. 您家 2014 年平均每周在该住房居住时长是:
[____________]天
E3. 该住房的建筑年代是:
1950 年以前......................................................................................1
1950-1959 .........................................................................................2
1960-1969 .........................................................................................3
1970-1979 .........................................................................................4
1980-1989 .........................................................................................5
1990-1999 .........................................................................................6
2000-2009 .........................................................................................7
2010-至今 .........................................................................................8
F 部分 法制模块 共计有 29 个问题
1. 法律规范体系
F1.对于我国现行的法律,您认为下列问题突不突出?【出示示卡 23】
完全不
存在
不太
突出
一般
比较
突出
非常
突出
1.法律该管的不管 1 2 3 4 5
2.法律管得太宽 1 2 3 4 5
3.法律规定不符合实际 1 2 3 4 5
4.法律规定不公正、不合理 1 2 3 4 5
5. 社会形势变化很快,法律法规的制定
和修改总是赶不上趟 1 2 3 4 5
Z 部分 联系方式 共 8 个问题
这个调查内容特别丰富,感觉调研工作要花费较多时间。
我们需要使用包括个体变量(性别、年龄、地域、职业、健康、婚姻与政治面貌等等)、家庭变量(父母、配偶、子女、家庭资本等等)、社会态度(公平、信用、公共服务等等)等 139 维度的信息来预测其对幸福感的影响。
赛题要求使用以上 139 维的特征,使用 8000 余组数据进行对于个人幸福感的预测(预测值为 1,2,3,4,5,其中 1 代表幸福感最低,5 代表幸福感最高)。
最终的评价指标为均方误差 MSE
导入包
import os
import time
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
from datetime import datetime
import matplotlib.pyplot as plt
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
from sklearn.ensemble import RandomForestRegressor as rfr
from sklearn.ensemble import ExtraTreesRegressor as etr
from sklearn.linear_model import BayesianRidge as br
from sklearn.ensemble import GradientBoostingRegressor as gbr
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.linear_model import LinearRegression as lr
from sklearn.linear_model import ElasticNet as en
from sklearn.kernel_ridge import KernelRidge as kr
from sklearn.model_selection import KFold, StratifiedKFold,GroupKFold, RepeatedKFold
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn import preprocessing
import logging
import warnings
warnings.filterwarnings('ignore') #消除 warning
导入数据集查看数据的基本信息
数据预处理
首先需要对于数据中的连续出现的负数值进行处理。由于数据中的负数值只有-1,-2,-3,-8 这几种数值,所以它们进行分别的操作,实现
代码如下:
填充缺失值,在这里我采取的方式是将缺失值补全,使用 fillna(value),其中 value 的数值根据具体的情况来确定。例如将大部分缺失信息认
为是零,将家庭成员数认为是 1,将家庭收入这个特征认为是 66365,即所有家庭的收入平均值。部分实现代码如下:
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 向下兼容 ASCII
train = train[train["happiness"]!=-8].reset_index(drop=True)
train_data_copy = train.copy() #删去"happiness" 为-8 的行
target_col = "happiness" #目标列
target = train_data_copy[target_col]
del train_data_copy[target_col] #去除目标列
data = pd.concat([train_data_copy,test],axis=0,ignore_index=True)
train.happiness.describe() #数据的基本信息
#make feature +5
#csv 中有复数值:-1、-2、-3、-8,将他们视为有问题的特征,但是不删去
def getres1(row):
return len([x for x in row.values if type(x)==int and x<0])
def getres2(row):
return len([x for x in row.values if type(x)==int and x==-8])
def getres3(row):
return len([x for x in row.values if type(x)==int and x==-1])
def getres4(row):
return len([x for x in row.values if type(x)==int and x==-2])
def getres5(row):
return len([x for x in row.values if type(x)==int and x==-3])
#检查数据
data['neg1'] = data[data.columns].apply(lambda row:getres1(row),axis=1)
data.loc[data['neg1']>20,'neg1'] = 20 #平滑处理,最多出现 20 次
data['neg2'] = data[data.columns].apply(lambda row:getres2(row),axis=1)
data['neg3'] = data[data.columns].apply(lambda row:getres3(row),axis=1)
data['neg4'] = data[data.columns].apply(lambda row:getres4(row),axis=1)
data['neg5'] = data[data.columns].apply(lambda row:getres5(row),axis=1)
#填充缺失值 共 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) #删除问题值后的平均值
#144+1 =145
#继续进行特殊的列进行数据处理
#读 happiness_index.xlsx
data['survey_time'] = pd.to_datetime(data['survey_time'], format='%Y-%m-%d',errors='coerce')#防止时间格式不同的报
错 errors='coerce‘
data['survey_time'] = data['survey_time'].dt.year #仅仅是 year,方便计算年龄
data['age'] = data['survey_time']-data['birth']
# print(data['age'],data['survey_time'],data['birth'])
#年龄分层 145+1=146
bins = [0,17,26,34,50,63,100]
data['age_bin'] = pd.cut(data['age'], bins, labels=[0,1,2,3,4,5])
#对‘宗教’处理
data.loc[data['religion']<0,'religion'] = 1 #1 为不信仰宗教
data.loc[data['religion_freq']<0,'religion_freq'] = 1 #1 为从来没有参加过
#对‘教育程度’处理
data.loc[data['edu']<0,'edu'] = 4 #初中
data.loc[data['edu_status']<0,'edu_status'] = 0
data.loc[data['edu_yr']<0,'edu_yr'] = 0
#对‘个人收入’处理
data.loc[data['income']<0,'income'] = 0 #认为无收入
#对‘政治面貌’处理
data.loc[data['political']<0,'political'] = 1 #认为是群众
#对体重处理
data.loc[(data['weight_jin']<=80)&(data['height_cm']>=160),'weight_jin']= data['weight_jin']*2
data.loc[data['weight_jin']<=60,'weight_jin']= data['weight_jin']*2 #个人的想法,哈哈哈,没有 60 斤的成年人吧
#对身高处理
data.loc[data['height_cm']<150,'height_cm'] = 150 #成年人的实际情况
#对‘健康’处理
data.loc[data['health']<0,'health'] = 4 #认为是比较健康
data.loc[data['health_problem']<0,'health_problem'] = 4
#对‘沮丧’处理
data.loc[data['depression']<0,'depression'] = 4 #一般人都是很少吧
#对‘媒体’处理
data.loc[data['media_1']<0,'media_1'] = 1 #都是从不
data.loc[data['media_2']<0,'media_2'] = 1
data.loc[data['media_3']<0,'media_3'] = 1
data.loc[data['media_4']<0,'media_4'] = 1
data.loc[data['media_5']<0,'media_5'] = 1
data.loc[data['media_6']<0,'media_6'] = 1
#对‘空闲活动’处理
data.loc[data['leisure_1']<0,'leisure_1'] = 1 #都是根据自己的想法
data.loc[data['leisure_2']<0,'leisure_2'] = 5
data.loc[data['leisure_3']<0,'leisure_3'] = 3
。。。
这里内容很多,需要花时间认真分析!
评论