天池大赛—一起挖掘幸福感笔记1
数据来源:https://tianchi.aliyun.com/competition/entrance/231702/information
选用的数据是精简版的训练集happiness_train_abbr.csv
思路:
1、打开数据表,大概理解每一个特征的含义
2、导入数据表,对数据进行预处理,处理的方式有删除某些无关的特征,例如调查时间与省份城市等,对缺失值进行填充,对含义模糊的变量均用众数进行填充,对数据进行去极值,标准化。等出初步的处理完的数据。
3、分好特征值与标签值,Y= happiness 。将特征值与标签值进行分割,分7分为训练集,3份为测试集。
4、运用机器学习等算法,调整算法中各种超参数对数据进行训练与评估,最后得出结果,保存最好的训练模型。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.ensemble import RandomForestClassifier as RFC
pd.set_option('expand_frame_repr', False) # 当列太多时不换行
def filter_extreme_3sigma(series, n=3): # 3 sigma 去极值
mean = series.mean()
std = series.std()
max_range = mean + n * std
min_range = mean - n * std
return np.clip(series, min_range, max_range)
def standardize_series(series): # 标准化
std = series.std()
mean = series.mean()
return (series - mean) / std
# 读取数据
data = pd.read_csv(r"D:\机器学习挖掘幸福感\data\happiness_train_abbr.csv", encoding="gbk")
# 查看数据的信息
# print(data.info())
# 删除除调查日期,删除缺失值很多的列
dele_list = ['work_status', 'work_yr', 'work_type', 'work_manage', 'survey_time']
data.drop(dele_list, axis=1, inplace=True)
# 删除自认为无关的特征
dro_list = ['birth', 'province', 'city', 'county']
data.drop(dro_list, axis=1, inplace=True)
# 删除所有为空值的行
data = data.dropna()
# print(data.info())
# print(data.describe())
# 获取可以给出明确回答幸福感指数的样本,最后还有7987个样本
data = data[data["happiness"] > 0]
# 对不确定的数据全部都用中位数进行处理
for column in data.columns:
data[column][data[column] < 0] = data[column].median()
# 删除ID列,重新建立索引
data.set_index('id', inplace=True)
# 对以下特征进行标准化
stand_list = ['income', 'floor_area', 'family_income']
for stand in stand_list:
data[stand] = standardize_series(data[stand])
# print(data.describe())
# 划分标签与特征
Y = data["happiness"]
X = data.drop("happiness", axis=1)
# print(X.head())
# 划分训练集与测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, test_size=0.3, random_state=200)
clf = DTC(random_state=0)
rfc = RFC(random_state=0)
clf = clf.fit(Xtrain, Ytrain)
rfc = rfc.fit(Xtrain, Ytrain)
score_c = clf.score(Xtest, Ytest)
score_r = rfc.score(Xtest, Ytest)
print("single Tree:{}\n".format(score_c)
, "Random Forest:{}".format(score_r)
)
最好输出结果:
single Tree:0.47768043387567793
Random Forest:0.6166040884438881
总结:暂时就先用精简版的数据进行训练,明天再去优化模型与调用更多的机器学习方法,再添加评价指标,将指标进行可视化。