写点什么

集成学习案例一 (幸福感预测)

用户头像
容光
关注
发布于: 2021 年 05 月 19 日

这里做了大量的调查,中国综合社会调查(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

。。。

这里内容很多,需要花时间认真分析!


用户头像

容光

关注

恰到好处 2021.02.28 加入

还未添加个人简介

评论

发布
暂无评论
集成学习案例一 (幸福感预测)