幸福感是一个古老而深刻的话题,是人类世代追求的方向。与幸福感相关的因素成千上万、因人而异,大如国计民生,小如路边烤红薯,都会对幸福感产生影响。这些错综复杂的因素中,我们能找到其中的共性,一窥幸福感的要义吗?
在社会科学领域,幸福感的研究占有重要的位置。这个涉及了哲学、心理学、社会学、经济学等多方学科的话题复杂而有趣;同时与大家生活息息相关,每个人对幸福感都有自己的衡量标准。如果能发现影响幸福感的共性,生活中是不是将多一些乐趣;如果能找到影响幸福感的政策因素,便能优化资源配置来提升国民的幸福感。目前社会科学研究注重变量的可解释性和未来政策的落地,主要采用了线性回归和逻辑回归的方法,在收入、健康、职业、社交关系、休闲方式等经济人口因素;以及政府公共服务、宏观经济环境、税负等宏观因素上有了一系列的推测和发现。
使用文件请在快来一起挖掘幸福感!赛题与数据-天池大赛-阿里云天池 下载。
【机器学习|使用机器学习一起挖掘幸福感】1、导入包
# 引入包
##基础函数库
import numpy as np
import pandas as pd## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns
2、我们利用Pandas自带的read_csv函数读取并转化为DataFrame格式,利用.info()查看数据的整体信息
df = pd.read_csv('./happiness_train_abbr.csv')
df.info()
3、分析并清理数据
#删除缺失数据28work_status,work_yr,work_type,work_manage
drop_cols=['work_status','work_yr','work_type','work_manage']
df.drop(drop_cols, axis=1,inplace=True)# family_income 缺失数据补足
df.fillna(method='ffill',inplace=True)y = df.happiness
y.value_counts()dft=df.copy()
# 删除时间列:survey_time
drop_cols=['happiness','survey_time']
dft.drop(drop_cols, axis=1,inplace=True)
dft.info()# nationality,religion,religion_freq 数值变化不大,删除
drop_cols=['learn','relax','hukou','weight_jin','political','edu','gender','survey_type','province','county']
dft.drop(drop_cols, axis=1,inplace=True)
4、分析特征
data = https://www.it610.com/article/dft
data_std = (data - data.mean()) / data.std()
data = pd.concat([y, data_std.iloc[:, 0:9]], axis=1)
data = pd.melt(data, id_vars='happiness', var_name='Features', value_name='Values')fig, ax = plt.subplots(1,2,figsize=(30,15))# 绘制小提琴图
sns.violinplot(x='Features', y='Values', hue='happiness', data=https://www.it610.com/article/data,inner='quart', ax=ax[0], palette='Blues')
fig.autofmt_xdate(rotation=45)data = https://www.it610.com/article/dft
data_std = (data - data.mean()) / data.std()
data = pd.concat([y, data_std.iloc[:, 9:18]], axis=1)
data = pd.melt(data, id_vars='happiness', var_name='Features', value_name='Values')# 绘制小提琴图
sns.violinplot(x='Features', y='Values', hue='happiness', data=https://www.it610.com/article/data, inner='quart', ax=ax[1], palette='Blues')
fig.autofmt_xdate(rotation=45)plt.show()# learn,relax,hukou,weight_jin,political,edu,gender,suney_type差别不大,删除
plt.figure(figsize=(18,14))
sns.heatmap(round(dft.corr(),2), cmap='Blues', annot=True)
plt.show()dfx=df.copy()
y=dfx.happiness
drop_cols=['happiness','survey_time']
dfx.drop(drop_cols, axis=1,inplace=True)
dfx.info()
5、训练数据
## 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。
from sklearn.model_selection import train_test_split
x=dfx
## 选择其类别为0和1的样本 (不包括类别为2的样本)
data_target_part = y
data_features_part = x## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data_features_part, data_target_part, test_size = 0.2, random_state = 2020)## 导入XGBoost模型
from xgboost.sklearn import XGBClassifier
## 定义 XGBoost模型
clf = XGBClassifier()
# 在训练集上训练XGBoost模型
clf.fit(x_train, y_train)## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
from sklearn import metrics## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The train of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The test of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()
得到预测结果:
The train of the Logistic Regression is: 0.66546875 The test of the Logistic Regression is: 0.6275
6、优化特征值
? sns.barplot
sns.barplot(y=data_features_part.columns, x=clf.feature_importances_)## 从sklearn库中导入网格调参函数
from sklearn.model_selection import GridSearchCV## 定义参数取值范围
learning_rate = [0.1, 0.3, 0.6]
subsample = [0.8, 0.9]
colsample_bytree = [0.6, 0.8]
max_depth = [3,5,8]parameters = { 'learning_rate': learning_rate,
'subsample': subsample,
'colsample_bytree':colsample_bytree,
'max_depth': max_depth}
model = XGBClassifier(n_estimators = 50)## 进行网格搜索
clf = GridSearchCV(model, parameters, cv=3, scoring='accuracy',verbose=1,n_jobs=-1)
clf = clf.fit(x_train, y_train)## 网格搜索后的最好参数为
clf.best_params_
得到优化结果:
{'colsample_bytree': 0.6, 'learning_rate': 0.1, 'max_depth': 5, 'subsample': 0.8}
7、使用新的特征参数进行训练
## 在训练集和测试集上分布利用最好的模型参数进行预测## 定义带参数的 XGBoost模型
clf = XGBClassifier(colsample_bytree = 0.6, learning_rate = 0.1, max_depth= 5, subsample = 0.8)
# 在训练集上训练XGBoost模型
clf.fit(x_train, y_train)train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the test Regression is:',metrics.accuracy_score(y_test,test_predict))## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()
得到预测值:
The accuracy of the train Regression is: 0.7765625 The accuracy of the test Regression is: 0.63375
8、预测数据,得到预测结果
# 预测数据
dfn = pd.read_csv('./happiness_test_abbr.csv')
drop_clo=['survey_time','work_status','work_yr','work_type','work_manage']
dfn.drop(drop_clo,axis=1,inplace=True)clf = XGBClassifier(colsample_bytree = 0.6, learning_rate = 0.1, max_depth= 5, subsample = 0.8)
# 在训练集上训练XGBoost模型
clf.fit(x_train, y_train)new_predict = clf.predict(dfn)
9、导出数据
dfy=pd.DataFrame(new_predict)dfy['id']=dfn['id']
dfy.info()dfy.set_index('id')dfy.to_csv('./happiness_test_result_wangrain.csv')
10、结束分析。
本次分析使用了XGBoost系统进行分类训练,整个过程中发现对数据的分析和处理部分有很大的主观性,还需要不断的学习、练习并掌握如何去除不必要的特征,如何合并特征。
路漫漫其修远兮,吾将上下而求索!
推荐阅读
- 人工智能|名校硕士苦攻5年AI无论文痛苦吐槽,导师放养怎么办()
- 项目|python之逻辑回归项目实战——信用卡欺诈检测
- 复习|基于逻辑回归的信用卡欺诈检测
- PyTorch|PyTorch: hook机制
- 动手学习深度学习|《动手学深度学习》Task04(机器翻译及相关技术+注意力机制与Seq2seq模型+Transformer)
- 机器学习|残差块及ResNet残差网络
- 深度学习|基于深度学习的视觉三维重建研究总结2进阶
- Python|用反向传播学习识别mnist手写数字(mini-batch版)
- Machine|Paper Notes: Cross-Domain Image Translation Based on GAN