天池-新人赛-快来一起挖掘幸福感-pipline

本文介绍了一次天池新人赛的参赛过程,参赛者基于ChenglongChen公开的项目代码进行简化,使用二阶stacking集成模型。尽管泛化能力有待提升,但项目展示了数据预处理、模型训练、参数优化和集成学习的流程。参赛者使用了hyperopt进行参数优化,通过preprocessing.py、model_library.py、generate_best_single_model.py和ensemble.py四个文件实现了数据处理和模型构建。
摘要由CSDN通过智能技术生成


比赛链接

https://tianchi.aliyun.com/competition/entrance/231702/introduction


记录

特别感谢 ChenglongChen 公开的项目代码 : https://github.com/ChenglongChen/Kaggle_CrowdFlower

  • 这是一个简化版,在集成的时候没有使用 bagging,而是使用了二阶stacking。所以其泛化能力相对较差,也就是说线下得分和线上得分会有较大差别。
  • 为了提高泛化能力,可以考虑加入 bagging;相当于对不同的训练集训练不同参数的模型进行集成。
  • 本来还有一个 keras_dnn 模型,由于机器性能限制,调参时间过长,故暂时不考虑。
  • 参数优化采用 贝叶斯优化以及其对应的 python 模块: hyperopt。

项目结构

1、文件

代码部分
preprocessing.py 数据预处理,生成 x_test.csv ;x_train.csv ;y_train.csv数据集文件
– model_library.py 定义了一些模型以及对应的优化参数
– model_param_opt.py 定义了参数优化的逻辑
– generate_best_single_model.py 得到每一个模型的最优参数,存入model_log_best_params.txt文件
ensemble.py 对最优模型实现一个简单的集成,并产生提交结果
数据部分
– happiness_test_complete.csv
– happiness_train_complete.csv
– happiness_submit.csv

2、运行顺序
进入项目文件夹

python preprocessing.py
进行数据预处理,得到训练数据

python generate_best_single_model.py
得到每一个候选模型的最优参数,存入model_log_best_params.txt文件

python ensemble.py
实现模型集成,生成最终结果


代码文件

preprocessing.py

进行数据预处理的文件

import pandas as pd
import numpy as np

datatrain = pd.read_csv('happiness_train_complete.csv',encoding="gb2312")
datatest = pd.read_csv('happiness_test_complete.csv',encoding="gb2312")
dataplot = datatrain.copy()

datatrain = datatrain[datatrain["happiness"]!=-8].reset_index(drop=True)
dataplot = dataplot[dataplot["happiness"]!=-8].reset_index(drop=True)

target_col = "happiness"
target = datatrain[target_col]

del datatrain['id']
del datatest['id']

label = datatrain['happiness']

del datatrain['happiness']
dataproc = pd.concat([datatrain,datatest],ignore_index=True)

dataproc['survey_type'] = dataproc['survey_type'].map(lambda x:x-1) #变0-1

count = []
for i in range(1,32):
    count.append(dataplot.loc[dataplot['province']==i,'happiness'].mean())
count = [i if (1-pd.isnull(i)) else 3 for i in count]
#plt.scatter(range(1,32),count)
reg1 = [i for i in range(1,32) if count[i-1]<3.2]
reg2 = [i for i in range(1,32) if 3.2<count[i-1]<3.9]
reg3 = [i for i in range(1,32) if count[i-1]>=3.9]
def spl(x):
    if x in [2,3,8,13,14,20,23,25,26,30]:
        return 0
    else:
        return 1
def spl1(x):
    if x in reg1:
        return 0
    elif x in reg2:
        return 1
    elif x in reg3:
        return 2
dataproc['province_1'] = dataproc['province'].map(spl) #新增两个变量
dataproc['province_2'] = dataproc['province'].map(spl1)
dataproc['gender'] = dataproc['gender'].map(lambda x:x-1) #变0-1
dataproc['age'] = dataproc['survey_time'].map(lambda x:int(x[:4]))-dataproc['birth']

dataproc.loc[dataproc['nationality']<0,'nationality'] = 1
dataproc = dataproc.join(pd.get_dummies(dataproc["nationality"],prefix="nationality"))

def nation(x):
    if x==1:
        return 1
    else:
        return 0
dataproc['nationality1'] = dataproc['nationality'].map(nation)#新特征,是否为汉族
del dataproc['nationality']

def relfreq(x):
    if x<2:
        return 0
    elif x<5:
        return 1
    else:
        return 2
dataproc['religion_freq'] = dataproc['religion_freq'].map(relfreq)

from scipy import stats
dataproc.loc[dataproc['edu']<0,'edu'] = stats.mode(dataproc['edu'])[0][0]

del dataproc['edu_other']

dataproc = dataproc.join(pd.get_dummies(dataproc["edu_status"],prefix="edu_status"))
del dataproc["edu_status"]

def eduyr(x):
    if (x>0) and (not pd.isnull(x)):
        return x
    else:
        return 0
dataproc['edu_yr'] = dataproc['edu_yr'].map(eduyr)
dataproc['edu_yr'] = dataproc['edu_yr']-dataproc['birth']
def eduyr1(x):
    if x>0:
        return x
    else:
        return 0
dataproc['edu_yr'] = dataproc['edu_yr'].map(eduyr1)

dataproc.loc[dataproc['income']<0,'income'] = stats.mode(dataproc['income'])[0][0]
dataproc['income'] = dataproc['income'].map(lambda x:np.log(x+1))

dataproc.loc[dataproc['political']<0,'political'] = 1
dataproc = dataproc.join(pd.get_dummies(dataproc["political"],prefix="political"))
del dataproc['political']

def joinparty(x):
    if pd.isnull(x):
        return 0
    if x<0:
        return 0
    else:
        return x
dataproc['join_party'] = (dataproc['join_party']-dataproc['birth']).map(joinparty)

del dataproc['property_other']

dataproc.loc[(dataproc['weight_jin']<=80)&(dataproc['height_cm']>=160),'weight_jin']= dataproc['weight_jin']*2 #对体重修正
dataproc.loc[dataproc['weight_jin']<=60,'weight_jin']= dataproc['weight_jin']*2
dataproc['bmi'] = dataproc['weight_jin'].map(lambda x:x/2)/dataproc['height_cm'].map(lambda x:(x/100)**2)
dataproc.loc[dataproc['health']<0,'health'] = stats.mode(dataproc['health'])[0][0]
dataproc.loc[dataproc['health_problem']<0,'health_problem'] = stats.mode(dataproc['health_problem'])[0][0]
dataproc.loc[dataproc['depression']<0,'depression'] = stats.mode(dataproc['depression'])[0][0]
dataproc.loc[dataproc['media_1']<0,'media_1'] = stats.mode(dataproc['media_1'])[0][0]
dataproc.loc[dataproc['media_2']<0,'media_2'] = stats.mode(dataproc['media_2'])[0][0]
dataproc.loc[dataproc['media_3']<0,'media_3'] = stats.mode(dataproc['media_3'])[0][0]
dataproc
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值