书接上回:
任务一带我们了解了我们要做的目标任务,以及初步体验了通过机器学习操作,特征分类,训练ai(使用了决策树模型),处理测试数据等等流程,这次内容来到了数据可视化,模型交叉验证与特征工程的内容,但是因为时间问题,只能完成部分,非常遗憾。
---------------------------------------------------------------------------------------------------------------------------------
任务2.1:数据分析与可视化
数据探索性分析,是通过了解数据集,了解变量间的相互关系以及变量与预测值之间的关系,对已有数据在尽量少的先验假设下通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法,从而帮助我们后期更好地进行特征工程和建立模型,是机器学习中十分重要的一步。
实践步骤:(注意关键词)
1.导入必要的库,特别是画图库。(Matplotlib 使用语法import xxx as xxx 简化代码,一般简称为plt即
from matplotlib import pyplot as plt
或者(.表示从属关系,小小的也很可爱)
import matplotlib.pyplot as plt
2.计算特征与标签之间的相关性,展示热力图。(这里可以使用的图一很多,学习群也有很多人用的不同的图,总之图像是为了更加直观的体现出一种或者多种数据之间的相关性)
3.展示特征与标签分组统计图。
实践代码:
# 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 读取训练集和测试集文件
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
test_data = pd.read_csv('用户新增预测挑战赛公开数据/test.csv')
# 相关性热力图
sns.heatmap(train_data.corr().abs(), cmap='YlOrRd')
# x7分组下标签均值
sns.barplot(x='x7', y='target', data=train_data)
运行结果:
编写代码回答下面的问题:
1.字段X1至x8为用户相关的属性,为匿名处理字段。添加代码对这些数据字段的取值分析,那些字段为数值类型?那些字段为类别类型?
使用 .dtypes 解决问题,直接查看数据类型(用法见:python中dtype什么意思_NumPy Python中的数据类型对象(dtype)_weixin_39946364的博客-CSDN博客)
2.对于数值类型的字段,考虑绘制在标签分组下的箱线图 (.boxplot)
for r in range(1,8):
sns.boxplot(
x='x'+str(r),
y='target',
data=train_data
)
plt.show()
这里对 箱线图 进行简单介绍:
sns.boxplot()
如上图,可以进行很多优化但是我因为时间问题,简单处理了,其上我们可以通过调节属性,达到更加简洁美观的效果哦!
参数如下:
#箱线图参数如下:
seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)
详见:sns.boxplot()简单用法_DDxuexi的博客-CSDN博客
3.从common_ts中提取小时,绘制每小时下标签分布的变化。(参考来源:2023.8夏令营“用户新增预测”学习笔记(二)_dandellion_的博客-CSDN博客)
# 获取指定时间和日期
train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
# 从common_ts中提取小时
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
# 绘制每小时下标签分布变化
sns.barplot(x='common_ts_hour', y='target', data=train_data)
plt.show()
4.对udmap进行onehot,统计每个key对应的标签均值,绘制直方图
# 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 读取训练集和测试集文件
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
test_data = pd.read_csv('用户新增预测挑战赛公开数据/test.csv')
# 提取udmap特征,人工进行onehot
def udmap_onethot(d):
v = np.zeros(9)
if d == 'unknown':
return v
d = eval(d)
for i in range(1, 10):
if 'key' + str(i) in d:
v[i-1] = d['key' + str(i)]
return v
train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
test_udmap_df = pd.DataFrame(np.vstack(test_data['udmap'].apply(udmap_onethot)))
train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
test_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
# 编码udmap是否为空
train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)
# udmap特征和原始数据拼接
train_data = pd.concat([train_data, train_udmap_df], axis=1)
test_data = pd.concat([test_data, test_udmap_df], axis=1)
for i in range(1, 9):
sns.barplot(x = 'x' + str(i), y='target', data=train_data)
plt.show()
结果如下图:
后续省略......
任务2.2:模型交叉验证
交叉验证(Cross-Validation)是机器学习中常用的一种模型评估方法,用于评估模型的性能和泛化能力。它的主要目的是在有限的数据集上,尽可能充分地利用数据来评估模型,避免过拟合或欠拟合,并提供对模型性能的更稳健的估计。
交叉验证的基本思想是将原始的训练数据划分为多个子集(也称为折叠),然后将模型训练和验证进行多次循环。在每一次循环中,使用其中一个子集作为验证集,其他子集作为训练集。这样可以多次计算模型的性能指标,并取这些指标的平均值作为最终的模型性能评估结果。
实操步骤
1.加载数据集,并对数据进行编码
2.导入多个模型进行交叉验证
3,比较模型的F1精度
# 导入模型
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.ensemble import RandomForestClassifier
# 导入交叉验证和评价指标
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import classification_report
# 训练并验证SGDClassifier
pred = cross_val_predict(
SGDClassifier(max_iter=10),
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))
# 训练并验证DecisionTreeClassifier
pred = cross_val_predict(
DecisionTreeClassifier(),
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))
# 训练并验证MultinomialNB
pred = cross_val_predict(
MultinomialNB(),
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))
# 训练并验证RandomForestClassifier
pred = cross_val_predict(
RandomForestClassifier(n_estimators=5),
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))
代码运行结果:
precision recall f1-score support 0 0.870 0.968 0.916 533155 1 0.369 0.116 0.176 87201 accuracy 0.848 620356 macro avg 0.619 0.542 0.546 620356 weighted avg 0.800 0.848 0.812 620356 precision recall f1-score support 0 0.905 0.943 0.924 533155 1 0.532 0.393 0.452 87201 accuracy 0.866 620356 macro avg 0.718 0.668 0.688 620356 weighted avg 0.852 0.866 0.857 620356 precision recall f1-score support 0 0.903 0.419 0.572 533155 1 0.169 0.724 0.274 87201 accuracy 0.462 620356 macro avg 0.536 0.571 0.423 620356 weighted avg 0.799 0.462 0.530 620356 precision recall f1-score support 0 0.903 0.952 0.927 533155 1 0.561 0.375 0.450 87201 accuracy 0.871 620356 macro avg 0.732 0.664 0.688 620356 weighted avg 0.855 0.871 0.860 620356
编写代码回答下面的问题:
在上面模型中哪一个模型的macro F1效果最好,为什么这个模型效果最好?
这里通过运行结果比较容易得出:0.927的RandomForestClassifier最好
使用树模型训练,然后对特征重要性进行可视化;
再加入3个模型训练,对比模型精度;
后续任务因为时间问题,暂不深究,我们最后做一点数据可视化方向的拓展
2.学习收获:
复习了一下数据可视化的内容,快开学了事情有点多,但是能完成的内容还是尽量完成吧。
3.目前的疑问:
交叉检验问题还需要深入学习,有些确实地方一点都不懂。
4.内容拓展:
我的学习材料已经打包上传(python可视化包的使用,基础到入门,包含课程与习题等等,需要在jupyter环境下使用,代码拿到python环境下都一样,不过是anaconda环境编写代码,支持md(markdown)格式编辑,写教案等等,十分方便,初学的朋友们可以多练习一下:
下载链接:https://download.csdn.net/download/weixin_62439683/88245925)