科大讯飞AI夏令营第三期笔记--Day2

书接上回:

任务一带我们了解了我们要做的目标任务,以及初步体验了通过机器学习操作,特征分类,训练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()

  • 箱形图(Box-plot):

  • 又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。它能显示出一组数据的最大值、最小值、中位数及上下四分位数

 

如上图,可以进行很多优化但是我因为时间问题,简单处理了,其上我们可以通过调节属性,达到更加简洁美观的效果哦!

参数如下:

#箱线图参数如下:
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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值