技术机器学习技术阿里机器学习训练营 幸福感比赛
赵海波此笔记为阿里云天池机器学习训练营笔记,学习地址:https://tianchi.aliyun.com/s/1fc36a7e103eb9948c974f638e83a83b
感谢教程及阿里云提供平台
一、赛题说明
赛题使用公开数据的问卷调查结果,选取其中多组变量,包括个体变量(性别、年龄、地域、职业、健康、婚姻与政治面貌等等)、家庭变量(父母、配偶、子女、家庭资本等等)、社会态度(公平、信用、公共服务等等),来预测其对幸福感的评价。
二、数据说明
考虑到变量个数较多,部分变量间关系复杂,数据分为完整版和精简版两类。先从精简版入手熟悉赛题后,使用完整版挖掘更多信息。complete文件为变量完整版数据,abbr文件为变量精简版数据。index文件中包含每个变量对应的问卷题目,以及变量取值的含义。
survey文件是数据源的原版问卷,作为补充以方便理解问题背景。
总计共有6个文件,[点击查看](Happinese_survey | Kaggle)
这里我们就直接上手完整版数据集了
三、 数据预处理
将测试集连接在一起
1 2
| data = pd.concat([train,test],axis=0,ignore_index=True)
|
缺失值的处理
对于缺失值,主要的处理方法即为删除与填补
首先需要使用head查看数据大致长相
然后使用info或者describe函数查看数据分布
1 2 3 4 5
|
train.info(verbose=True,show_counts=True)
train.describe()
|
一般会发现以下两种情况
如果某个字段对于目标字段的相关性不大,那么就可以考虑把这个字段丢弃了
丢弃字段:
1 2 3 4
| data=data.drop(["happiness"], axis=1) data=data.drop(["survey_time"], axis=1) data=data.drop(["id"], axis=1)
|
处理异常值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| data.replace([-1, -2, -3, -8], np.nan, inplace=True)
data_cat = data.loc[:, list(data.max()<=5)] data_num = data.loc[:, list(data.max()>5)]
imputer_cat = SimpleImputer(strategy="most_frequent") imputer_num = SimpleImputer(strategy="median") imputer_cat.fit(data_cat) imputer_cat_trans = imputer_cat.transform(data_cat) imputer_num.fit(data_num) imputer_num_trans = imputer_num.transform(data_num) data[data_cat.columns] = imputer_cat_trans data[data_num.columns] = imputer_num_trans
|
SimpleImputer
这个类用来填充数据中的缺失值
1
| from sklearn.Imputer import SimpleImputer
|
missing_values,也就是缺失值是什么,一般情况下缺失值当然就是空值啦,也就是np.nan
strategy:也就是你采取什么样的策略去填充空值,总共有4种选择。分别是mean,median, most_frequent,以及constant,这是对于每一列来说的,如果是mean,则该列则由该列的均值填充。而median,则是中位数,most_frequent则是众数。需要注意的是,如果是constant,则可以将空值填充为自定义的值,这就要涉及到后面一个参数了,也就是fill_value。如果strategy=’constant’,则填充fill_value的值。
copy:则表示对原来没有填充的数据的拷贝。
add_indicator:如果该参数为True,则会在数据后面加入n列由0和1构成的同样大小的数据,0表示所在位置非空,1表示所在位置为空。相当于一种判断是否为空的索引。
字段处理
处理时间特征
1 2 3 4 5 6 7
| data['survey_time'] = pd.to_datetime(data['survey_time'],format='%Y/%m/%d %H:%M:%S') data["weekday"]=data["survey_time"].dt.weekday data["year"]=data["survey_time"].dt.year data["quarter"]=data["survey_time"].dt.quarter data["hour"]=data["survey_time"].dt.hour data["month"]=data["survey_time"].dt.month
|
处理字符串特征
1 2 3 4 5 6 7
| data["join_party"]=data["join_party"].map(lambda x:0 if pd.isnull(x) else 1)
data["edu_other"]=data["edu_other"].map(lambda x:0 if pd.isnull(x) else 1) data["property_other"]=data["property_other"].map(lambda x:0 if pd.isnull(x) else 1) data["invest_other"]=data["invest_other"].map(lambda x:0 if pd.isnull(x) else 1)
|
得到所有结果后再次使用info,一定要保证每一个字段计数的数量相同
独热编码转换
1 2 3
|
cat_features = data.loc[:, ['survey_type', 'province', 'city', 'county', 'gender', 'nationality', 'edu_status', 'political', 'hukou', 'hukou_loc', 'work_exper', 'work_status', 'work_type', 'work_manage', 'insur_1', 'insur_2', 'insur_3', 'insur_4', 'car', 'marital', 's_hukou', 's_work_status', 's_work_type', 'f_political', 'f_work_14', 'm_political', 'm_work_14']]
|
1 2 3 4 5
| encoder = OneHotEncoder() cat_features_1hot = encoder.fit_transform(cat_features.values)
cat_features_1hot = cat_features_1hot.toarray()
|
四、模型建立
这里我是用XGBoost进行处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| model_2 = XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=0.1, colsample_bytree=0.971, gamma=0.11, learning_rate=0.069, max_delta_step=0, max_depth=3, min_child_weight=1, n_estimators=499, n_jobs=-1, nthread=50, objective ='reg:squarederror', random_state=0, reg_alpha=0.1, reg_lambda=1, scale_pos_weight=1, seed=None, subsample=1.0) from sklearn.model_selection import cross_val_score
scores = cross_val_score(model_2, X_train, y_train, scoring="neg_mean_squared_error", cv=10) model_2.fit(X_train, y_train) X_predict = model_2.predict(X_test)
test_sub["happiness"] = X_predict test_sub.to_csv("submit_lgbm.csv", index=False)
|
最终得分是0.46950 排名不是特别靠前 参数还能够进一步进行优化
五、 总结
这是第一次使用模型参加比赛,参考了别人的kernel发现高分模型往往不会手动调参,并且在得到结果之后还会继续优化,也就是需要结合多种模型。而且不止xgboost和lightboost,还有更多例如catboost等模型需要学习,任重而道远吧。