文章简介
这是我的Coggle 30 Days of ML 活动记录博客,活动地址: https://coggle.club/blog/30days-of-ml-202207
活动内容
任务1:报名比赛
步骤1 报名比赛
步骤2 下载比赛数据(点击比赛页面的赛题数据)
下载数据集
步骤3 解压比赛数据,并使用 pandas (熊猫) 进行读取;
利用pandas读取数据
import pandas as pd
data = pd.read_csv('比赛训练集.csv', encoding='gbk')
data.head()
运行结果:
步骤4 查看训练集和测试集字段类型,并将数据读取代码写到博客;
查看训练集和测试集字段类型
traindata.dtypes
testdata.dtypes
任务2
任务2:比赛数据分析
步骤1:统计字段的缺失值,计算缺失比例;
通过缺失值统计,训练集和测试集的缺失值分布是否一致?通过缺失值统计,有没有缺失比例很高的列?
步骤2:分析字段的类型;
有多少数值类型、类别类型?
你是判断字段类型的?
在博客中通过文字写出你的判断;
利用以下代码查看表格缺失值
traindata.isna().sum()
testdata.isna().sum()
可以看出,缺失都在舒张压字段
步骤3:计算字段相关性;
通过.corr()计算字段之间的相关性;
res = traindata.corr()
f,ax = plt.subplots(figsize=(20,9))
sns.heatmap(res,vmax=0.8,square=True,vmin=-1,annot=True)
ax.set_xticklabels(ax.get_xticklabels(), rotation=30)
对于目标标签,体重指数,肱三头肌皮褶厚度与糖尿病标签呈正相关,说明体重指数越大,体脂越高,得糖尿病的可能性越大;
任务三
我们考虑利用逻辑回归线性模型预测,但在预测之前,我们需要先对数据进行预处理
步骤1 预处理
因为数据中含有缺失值,所以我们考虑使用平均填充法,对缺失值进行填充。
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
traindata['舒张压'].fillna(traindata['舒张压'].mean(),inplace=True)
testdata['舒张压'].fillna(testdata['舒张压'].mean(),inplace=True)
在逻辑回归之前,我们往往需要先对模型进行归一化处理,此处采用的是正态化处理。
ss = StandardScaler()
stdtraindata = ss.fit_transform(traindata)
stdtestdata = ss.fit_transform(testdata)
步骤2 训练与预测
在sklearn中,fit代表训练模型,predict代表预测,我们使用训练集数据进行训练,predict进行预测,并将结果保存到本地。
lr_clf = LogisticRegression()
# 用逻辑回归模型拟合构造的数据集
lr_clf = lr_clf.fit(stdtraindata, trainlabel) #其拟合方程为 y=w0+w1*x1+w2*x
res = lr_clf.predict(stdtestdata)
pd.Series(res).to_csv('结果.csv')
步骤3 提交结果
登录账号,并在比赛官网提交数据,注意要对文件的标题进行修改,否则无法返回分数。
结果如下,得分并不高。
任务4:特征工程(使用 pandas 完成)
步骤1:统计每个性别对应的【体重指数】、【舒张压】平均值
步骤2:计算每个患者与每个性别平均值的差异;
利用pandas的groupby函数得到分组的处理,完成步骤1和2
数据集操作如下
步骤3:在上述基础上将训练集20%划分为验证集,使用逻辑回归完成训练,精度是否有提高?
可以看到精度提高约8%,新的特征有利于逻辑回归效果的提升。
任务5:特征筛选
步骤1:使用树模型完成模型的训练,通过特征重要性筛选出Top5的特征;
步骤2:使用筛选出的特征和逻辑回归进行训练,在验证集精度是否有提高?
步骤3:如果有提高,为什么?如果没有提高,为什么?
可以看到利用训练集分出的0.2的验证集验证中,模型的精度提高到了0.81到0.82,模型精度提高了约百分之一,可以看到特征工剔除了相对不重要的特征,提高了模型的泛化性,简化了模型。