Bootstrap

天池数据--幸福感数据分析(一)

一、题目解析

训练集是幸福度的调查数据,涵盖调查人员各维度指标,调查结果幸福度分为5级。对测试集的样本进行幸福度分级预测。

数据精度评估标准:

二、数据分析处理

1、数据导入

#导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
import seaborn as sns

#导入数据
file_input=r"D:\tianchi test\happiness\happiness_train_abbr.csv"
file_input2=r"D:\tianchi test\happiness\happiness_test_abbr.csv"
file_input3=r"D:\tianchi test\happiness\happiness_submit.csv"
output_file=r"D:\tianchi test\happiness\output_file.csv"
df_train=pd.read_csv(file_input,header=0)  #header指定第几行为列名
df_test=pd.read_csv(file_input2,header=0)
df_in=pd.read_csv(file_input3,header=0)
y_train=df_train["happiness"]#将df_train中happiness这一栏的数据赋给y_train

2、数据探索

查看数据分布情况,重点是测试集的y值呈偏态分布。

print(df_train.info())
#关于work属性存在大量的数据缺失。
print(df_test.info())
#同样存在大量数据缺失。
dat=df_train.describe(percentiles=[],include='all').T
dat=dat[['min','max','mean','std']]

null_all = pd.DataFrame(df_train.isnull().sum())  #

print(dat)
print(null_all)   #空值行的数目

print(y_train.value_counts())       #统计y_train中各个数值的数目,查看得到数据呈偏态分布

 4    4818
 5    1410
 3    1159
 2     497
 1     104
-8      12
print(df_in['happiness'].value_counts())   #统计测试集的各个数值的数目,查看得到数据的值都为5

5    2968

3、作图查看数据

构造一个通用的画图函数,用于图表分析。

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负
#数据观察存在大量的负数,非正常情况,需要对负数进行处理。

def plot_cm(x):
  fig,axes=plt.subplots(2,2,figsize=(7,7))
  ax1 = plt.subplot(2,2,1)
  ax2 = plt.subplot(2,2,2)
  ax3 = plt.subplot(2,2,3)
  ax4 = plt.subplot(2,2,4)
  plt.sca(ax1)    #hist图
  sns.distplot(x, hist=True,rug=True,kde=True,color="b")  
  sns.kdeplot(x,shade=True,color='r')  
  plt.sca(ax2)    #箱线图
  sns.boxplot(x)
  plt.sca(ax3)    #饼图
  x.value_counts().plot.pie(autopct='%1.1f%%')
  plt.sca(ax4)
  sns.countplot(x)  #柱状图
  plt.show() 
#选择需要作图分析的列
x=df_train['happiness']   #data数据
plot_cm(x)

 

4、数据处理

(1)缺失值处理

(2)异常值处理

(3)无用的列删除

(4)均一化处理

from sklearn.impute import SimpleImputer
ind1 = ['id','happiness','survey_time','inc_ability']
ind2= ['id','survey_time','inc_ability']
# 训练集样本中删除指定列数据
X = df_train.drop(ind1, axis=1)
df_train1 = SimpleImputer(fill_value=-1).fit_transform(X)   #空值都设为-1
df_train1[df_train1 < 0] = -1     #小于0的数都设为-1
print(df_train1)
X_test=df_test.drop(ind2,axis=1)
df_test = SimpleImputer(fill_value=-1).fit_transform(X_test)   #空值都设为-1
df_test[df_test<0]=-1     #小于0的数都设为-1
#均一化处理
from sklearn.preprocessing import StandardScaler
std = StandardScaler().fit(df_train1)
df_train_std = std.transform(df_train1)
print(df_train_std)
std = StandardScaler().fit(df_test)
df_test_std = std.transform(df_test)
print(df_test_std)

(5)样本均衡处理

训练集第4类占比最高。为保障数据拟合的正确性,对不均衡性进行处理。

# 导入第三方包
from imblearn.over_sampling import SMOTE
#运用SMOTE算法实现训练数据集的平衡
over_samples = SMOTE(random_state=0)
over_samples_X,over_samples_y = over_samples.fit_sample(df_train_std,y_train)
#over_samples_X, over_samples_y = over_samples.fit_sample(df_train_std.values,y_train.values.ravel())
#重抽样前的类别比例
print(y_train.value_counts()/len(y_train))
# 重抽样后的类别比例
print(pd.Series(over_samples_y).value_counts()/len(over_samples_y))

5、模型训练及预测

(1)随机森林拟合分析

#采用随机决策树进行预测
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, GradientBoostingRegressor
rfr = RandomForestRegressor()
rfr.fit(over_samples_X,over_samples_y)   #用均衡后的样本进行数据回归
print(y_train)
y_predict = rfr.predict(df_train_std)    #对数据进行回归计算
print(y_predict)
#模型评估
#原函数拟合情况
print("随机森林回归的默认评估值为:", rfr.score(df_train_std, y_train))
print("随机森林回归的R_squared值为:", r2_score(y_train, y_predict))
print("随机森林回归的均方误差为:", mean_squared_error(y_train, y_predict))
print("随机森林回归的平均绝对误差为:", mean_absolute_error(y_train, y_predict))

y_predict2 = rfr.predict(df_test_std)
print(y_predict2)
#建立评分公式score
score=sum(((y_predict2-df_in['happiness']))**2)/len(df_in['happiness'])
print(“score”,score)

分析结果:

随机森林回归的默认评估值为: 0.8851814141072505
随机森林回归的R_squared值为: 0.8851814141072505
随机森林回归的均方误差为: 0.07695292939409112
随机森林回归的平均绝对误差为: 0.18918377566349523
[3.8 2.8 3.2 ... 4.1 3.1 3.8]
score: 2.860010107816703

(2)xgboost预测与k折交叉验证

这块之前有错误,我对k折交叉验证这块理解不对,导致代码错误。

 

 分析结果:2.91,xgboost预测结果一般。参数调优中。

6、提交结果

 

 

三、学习总结

1、对数据样本相关性的分析,需考虑样本的筛选。这块内容可考虑增加。

2、xgboost预测结果还可以,原理还不大明白;随机森林预测结果偏差较大。

3、对不均衡样本的处理,处理后可提高预测精度。

4、通用绘图函数的制作

5、几个预测期的组合。这块内容还需要继续学习。具体可参照https://blog.csdn.net/NUDTDING2019/article/details/92561488

 

 

;