【Datawhale夏令营】任务二学习笔记

这篇具有很好参考价值的文章主要介绍了【Datawhale夏令营】任务二学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Datawhale夏令营】任务二学习笔记,学习,笔记,python,机器学习,matplotlib

目录

一:python语法回顾

1.1  print()

1.2  列表与字典

1.3自定义函数与return

1.4火车类(面向对象) 

实例化总结:

二:LightGBM 代码精读

2.1导入库

2.2数据准备与参数设置

 2.3时间特征函数

  2.4优化

 2.5训练与预测

三:优化讲解

3.1:

3.2优化建议:


一:python语法回顾

1.1  print()
  1. 每一个print()会默认换行,若不想换行则:print("",end=""),默认end="\t"

  2. 单行注释 使用“#”开头,只能写在一行中~

1.2  列表与字典
  1. 列表是一种序列,他是可变的:容器的唯一作用就是打包、解包、内容传递】

  2. 列表定义:p2s = []

  3. 字典是键值对的集合

  4. 定义一个集合:Dw_set = set() 用add()函数将诗句插入集合中

  5. 定义一个字典:dw_dict = {"d":"Data","w":"whale"} # key:value 键:值;

  6. 字典可以利用键去查询对应的值

  7. 字典的更新:dw_dict["w"] = "whale"

1.3自定义函数与return

【Datawhale夏令营】任务二学习笔记,学习,笔记,python,机器学习,matplotlib

     回调函数(callback)

1.4火车类(面向对象) 
  1. 发车函数里,有一个"_"意思是不赋值给任何变量,是一个黑洞

【Datawhale夏令营】任务二学习笔记,学习,笔记,python,机器学习,matplotlib

实例化总结:

 【Datawhale夏令营】任务二学习笔记,学习,笔记,python,机器学习,matplotlib

二:LightGBM 代码精读

2.1导入库
!pip install -U lightgbm
!unzip data/data227148/data.zip
#特别适合处理大规模数据集。
#当处理大规模数据集、需要高效训练和预测速度,并且希望获得较好的性能时,LightGBM通常是一个不错的选择。


# 导入所需的库
import pandas as pd # 读取和处理csv文件的数据
#用于处理数据的工具,常用于数据加载、数据清洗和数据预处理。

import lightgbm as lgb # 机器学习模型 LightGBM
#构建梯度提升树模型,是一种高效的机器学习算法。

from sklearn.metrics import mean_absolute_error # 评分 MAE 的计算函数
#从sklearn.metrics模块中导入评分函数
#平均绝对误差(MAE),是用于回归问题的一个评价指标。

from sklearn.model_selection import train_test_split # 拆分训练集与验证集工具
#用于将数据集拆分为训练集和验证集,以便进行模型训练和评估。

#sklearn.model_selection:对机器学习模型进行参数调优、数据集拆分、交叉验证和性能评估等任务。
#train_test_split函数:将数据集划分为训练集和测试集,并且可以灵活地设置拆分比例和随机种子。


from tqdm import tqdm # 显示循环的进度条工具
#循环过程中显示进度条,方便查看代码执行进度。

2.2数据准备与参数设置
# 数据准备
train_dataset = pd.read_csv("C:\\Users\\86198\\OneDrive\\桌面\\train.csv") # 原始训练数据。
test_dataset = pd.read_csv("C:\\Users\\86198\\OneDrive\\桌面\\test.csv") # 原始测试数据(用于提交)。

submit = pd.DataFrame() # 定义提交的最终数据。
submit["序号"] = test_dataset["序号"] # 对齐测试数据的序号,保持与原始测试数据的一致性。

MAE_scores = dict() # 定义评分项。

# 模型参数设置
pred_labels = list(train_dataset.columns[-34:]) #训练数据集的最后34列是需要预测的目标变量。
train_set, valid_set = train_test_split(train_dataset, test_size=0.2) # 拆分数据集。

# 设定 LightGBM 训练参,查阅参数意义:https://lightgbm.readthedocs.io/en/latest/Parameters.html
lgb_params = {
        'boosting_type': 'gbdt',     #使用的提升方法,使用梯度提升决策树gbdt。
        'objective': 'regression',   #优化目标,这里设置为'regression',表示使用回归任务进行优化。
        'metric': 'mae',             #评估指标,使用MAE,表示使用平均绝对误差作为评估指标。
        'min_child_weight': 5,       #子节点中样本权重的最小和,用于控制过拟合。
        'num_leaves': 2 ** 5,        #每棵树上的叶子节点数,影响模型的复杂度。
        'lambda_l2': 10,             #L2正则化项的权重,用于控制模型的复杂度。
        'feature_fraction': 0.8,     #随机选择特征的比例,用于防止过拟合。
        'bagging_fraction': 0.8,     #随机选择数据的比例,用于防止过拟合。
        'bagging_freq': 4,           # 随机选择数据的频率,用于防止过拟合。
        'learning_rate': 0.05,       #学习率,控制每次迭代的步长。
        'seed': 2023,                #随机种子,用于产生随机性,保持结果的可重复性。
        'nthread' : 16,              #并行线程数,用于加速模型训练。
        'verbose' : -1,              #控制训练日志输出,-1表示禁用输出。
    }
    #调整参数是优化模型性能的重要手段

no_info = lgb.callback.log_evaluation(period=-1) # 回调函数no_info:禁用训练日志输出。
#LightGBM通常会输出一些训练过程的信息,通过回调函数可以避免输出这些信息,使得训练过程更简洁。

 2.3时间特征函数
# 时间特征函数   特征提取
def time_feature(data: pd.DataFrame, pred_labels: list = None) -> pd.DataFrame:
    """提取数据中的时间特征。

    输入:
        data: Pandas.DataFrame
            需要提取时间特征的数据。

        pred_labels: list, 默认值: None
            需要预测的标签的列表。如果是测试集,不需要填入。

    输出: data: Pandas.DataFrame
            提取时间特征后的数据。
    """
    # 接收数据集DataFrame和可选参数pred_labels,返回处理后的DataFrame

    data = data.copy()  # 复制数据,避免后续影响原始数据。
    data = data.drop(columns=["序号"])  # 去掉”序号“特征。

    data["时间"] = pd.to_datetime(data["时间"])  # 将”时间“特征的文本内容转换为 Pandas 可处理的格式。
    data["month"] = data["时间"].dt.month  # 添加新特征“month”,代表”当前月份“。
    data["day"] = data["时间"].dt.day  # 添加新特征“day”,代表”当前日期“。
    data["hour"] = data["时间"].dt.hour  # 添加新特征“hour”,代表”当前小时“。
    data["minute"] = data["时间"].dt.minute  # 添加新特征“minute”,代表”当前分钟“。
    data["weekofyear"] = data["时间"].dt.isocalendar().week.astype(int)  # 添加新特征“weekofyear”,代表”当年第几周“,
    # 并转换成 int整数类型,否则 LightGBM 无法处理。
    data["dayofyear"] = data["时间"].dt.dayofyear  # 添加新特征“dayofyear”,代表”当年第几日“。
    data["dayofweek"] = data["时间"].dt.dayofweek  # 添加新特征“dayofweek”,代表”当周第几日“。
    data["is_weekend"] = data["时间"].dt.dayofweek // 6  # 添加新特征“is_weekend”,代表”是否是周末“,1 代表是周末,0 代表不是周末。

    data = data.drop(columns=["时间"])  # LightGBM 无法处理这个特征,它已体现在其他特征中,故丢弃。


  2.4优化
# 新加入特征代码展示(不必运行)

# 交叉特征
for i in range(1,18):
    train[f'流量{i}/上部温度设定{i}'] = train[f'流量{i}'] / train[f'上部温度设定{i}']
    test[f'流量{i}/上部温度设定{i}'] = test[f'流量{i}'] / test[f'上部温度设定{i}']
    
    train[f'流量{i}/下部温度设定{i}'] = train[f'流量{i}'] / train[f'下部温度设定{i}']
    test[f'流量{i}/下部温度设定{i}'] = test[f'流量{i}'] / test[f'下部温度设定{i}']
    
    train[f'上部温度设定{i}/下部温度设定{i}'] = train[f'上部温度设定{i}'] / train[f'下部温度设定{i}']
    test[f'上部温度设定{i}/下部温度设定{i}'] = test[f'上部温度设定{i}'] / test[f'下部温度设定{i}']
    
# 历史平移
for i in range(1,18):
    train[f'last1_流量{i}'] = train[f'流量{i}'].shift(1)
    train[f'last1_上部温度设定{i}'] = train[f'上部温度设定{i}'].shift(1)
    train[f'last1_下部温度设定{i}'] = train[f'下部温度设定{i}'].shift(1)
    
    test[f'last1_流量{i}'] = test[f'流量{i}'].shift(1)
    test[f'last1_上部温度设定{i}'] = test[f'上部温度设定{i}'].shift(1)
    test[f'last1_下部温度设定{i}'] = test[f'下部温度设定{i}'].shift(1)

# 差分特征
for i in range(1,18):
    train[f'last1_diff_流量{i}'] = train[f'流量{i}'].diff(1)
    train[f'last1_diff_上部温度设定{i}'] = train[f'上部温度设定{i}'].diff(1)
    train[f'last1_diff_下部温度设定{i}'] = train[f'下部温度设定{i}'].diff(1)
    
    test[f'last1_diff_流量{i}'] = test[f'流量{i}'].diff(1)
    test[f'last1_diff_上部温度设定{i}'] = test[f'上部温度设定{i}'].diff(1)
    test[f'last1_diff_下部温度设定{i}'] = test[f'下部温度设定{i}'].diff(1)
    
# 窗口统计
for i in range(1,18):
    train[f'win3_mean_流量{i}'] = (train[f'流量{i}'].shift(1) + train[f'流量{i}'].shift(2) + train[f'流量{i}'].shift(3)) / 3
    train[f'win3_mean_上部温度设定{i}'] = (train[f'上部温度设定{i}'].shift(1) + train[f'上部温度设定{i}'].shift(2) + train[f'上部温度设定{i}'].shift(3)) / 3
    train[f'win3_mean_下部温度设定{i}'] = (train[f'下部温度设定{i}'].shift(1) + train[f'下部温度设定{i}'].shift(2) + train[f'下部温度设定{i}'].shift(3)) / 3
    
    test[f'win3_mean_流量{i}'] = (test[f'流量{i}'].shift(1) + test[f'流量{i}'].shift(2) + test[f'流量{i}'].shift(3)) / 3
    test[f'win3_mean_上部温度设定{i}'] = (test[f'上部温度设定{i}'].shift(1) + test[f'上部温度设定{i}'].shift(2) + test[f'上部温度设定{i}'].shift(3)) / 3
    test[f'win3_mean_下部温度设定{i}'] = (test[f'下部温度设定{i}'].shift(1) + test[f'下部温度设定{i}'].shift(2) + test[f'下部温度设定{i}'].shift(3)) / 3

    if pred_labels:  # 如果提供了 pred_labels 参数,则执行该代码块。
        data = data.drop(columns=[*pred_labels])  # 去掉所有待预测的标签。在模型训练时不使用这些标签。

    return data  # 返回最后处理的数据。


test_features = time_feature(test_dataset)  # 处理测试集的时间特征,无需 pred_labels。

 2.5训练与预测
# 从所有待预测特征中依次取出标签进行训练与预测。
for pred_label in tqdm(pred_labels):
    # print("当前的pred_label是:", pred_label)
    train_features = time_feature(train_set, pred_labels=pred_labels)  # 处理训练集的时间特征。
    # train_features = enhancement(train_features_raw)
    # 调用time_feature函数处理训练集train_set的时间特征,并将处理后的训练集数据赋值给train_features

    train_labels = train_set[pred_label]  # 训练集的标签数据。
    # print("当前的train_labels是:", train_labels)
    # 获取当前特征标签pred_label在训练集中的真实值,并赋值给train_labels。

    train_data = lgb.Dataset(train_features, label=train_labels)  # 将训练集转换为 LightGBM 可处理的类型。
    # 将train_features和train_labels转换为LightGBM可处理的数据类型,创建训练数据集train_data。

    valid_features = time_feature(valid_set, pred_labels=pred_labels)  # 处理验证集的时间特征。
    # valid_features = enhancement(valid_features_raw)
    # 调用time_feature函数处理验证集valid_set的时间特征,并将处理后的验证集数据赋值给valid_features。

    valid_labels = valid_set[pred_label]  # 验证集的标签数据。
    # print("当前的valid_labels是:", valid_labels)
    # 获取当前特征标签pred_label在验证集中的真实值,并赋值给valid_labels。

    valid_data = lgb.Dataset(valid_features, label=valid_labels)  # 将验证集转换为 LightGBM 可处理的类型。

    # 训练模型,参数依次为:导入模型设定参数、导入训练集、设定模型迭代次数(5000)、导入验证集、禁止输出日志
    model = lgb.train(lgb_params, train_data, 5000, valid_sets=valid_data, callbacks=[no_info])

    valid_pred = model.predict(valid_features, num_iteration=model.best_iteration)  # 选择效果最好的模型进行验证集预测。
    test_pred = model.predict(test_features, num_iteration=model.best_iteration)  # 选择效果最好的模型进行测试集预测。
    MAE_score = mean_absolute_error(valid_pred, valid_labels)  # 计算验证集预测数据与真实数据的 MAE。
    MAE_scores[pred_label] = MAE_score  # 将对应标签的 MAE 值 存入评分项中。

    submit[pred_label] = test_pred  # 将测试集预测数据存入最终提交数据中。

submit.to_csv(r"C:\Users\86198\OneDrive\桌面\submit_result.csv", index=False)  # 保存最后的预测结果到 submit_result.csv

# 保存文件并查看结果
submit.to_csv(r"C:\Users\86198\OneDrive\桌面\submit_result.csv", index=False) # 保存最后的预测结果到 submit_result.csv。
print(MAE_scores) # 查看各项的 MAE 值。

三:优化讲解

3.1:

具体地,我们可以尝试提取更多特征改善最终结果,这也是数据挖掘比赛中的主要优化方向,很多情况下决定着最终的成绩。

这里主要构建了交叉特征、历史平移特征、差分特征、和窗口统计特征;每种特征都是有理可据的,具体说明如下:

(1)交叉特征:主要提取流量、上部温度设定、下部温度设定之间的关系;

(2)历史平移特征:通过历史平移获取上个阶段的信息;

(3)差分特征:可以帮助获取相邻阶段的增长差异,描述数据的涨减变化情况。在此基础上还可以构建相邻数据比值变化、二阶差分等;

(4)窗口统计特征:窗口统计可以构建不同的窗口大小,然后基于窗口范围进统计均值、最大值、最小值、中位数、方差的信息,可以反映最近阶段数据的变化情况。

3.2优化建议:

1、过拟合现象

在代码运行的时候可以将callbacks=[no_info]去除,以查看模型运行的日志,运行结束后也可以利用代码print(MAE_scores)来打印出最终的损失,观察不难看出,模型会在一定时间后进入过拟合,因此可以尝试以一些措施来缓解这种现象。

  • 利用lightgbm自带的early_stopping_rounds参数。
  • 采用多折验证的方式扩大数据量,使得模型泛化能力增强。

2、 参数设定

此次基线没有做精确的调参处理,因此可以调参的范围还是挺大的,常用的搜索参数策略有两种:

  • 网格搜索(Grid Search):这是一种传统的参数调整方法,它会测试指定参数的所有可能组合来找出最佳参数。但是,当参数空间较大时,这种方法可能会消耗大量计算资源和时间。

  • 随机搜索(Random Search):与网格搜索相比,随机搜索不会测试所有的参数组合,而是在参数空间中随机选择一定数量的参数组合进行测试。尽管随机搜索可能无法找到最优的参数组合,但在计算资源有限的情况下,它是一个有效的选择。

3、 模型设定

我们此次基线采用的是LightGBM,我们也可以试试XGBoost, Adaboost, Catboost等等传统的模型,并且也可以使用深度学习的方法构建循环神经网络来处理此次任务,因为本质是一个时序任务,在采用机器学习的同时也可以保存模型的参数配置,尝试进行模型集成的训练。

4、 特征

在特征选择方面,目前给出的特征仅仅是单独对时间处理,与对流量\上\下\部温度设定进行处理,并未结合时间与其他特征的关系,可以尝试自己构建合理的新特征。

5、 后处理

对已经给出的csv文件仍然可以分析其趋势,抓住评估的关键来调整文件内容使得结果更加精确。

6、 迭代步数 目前设置的迭代步数为200轮,其实这对于某些预测数据来说是不够的,可以尝试自己增大迭代步数

baseline进行修改优化后并跑通,结果可观如下:

【Datawhale夏令营】任务二学习笔记,学习,笔记,python,机器学习,matplotlib

调整参数后: 

【Datawhale夏令营】任务二学习笔记,学习,笔记,python,机器学习,matplotlib

参考文章:

datawhale暑期夏令营:datawhale开源项目文章来源地址https://www.toymoban.com/news/detail-621160.html

到了这里,关于【Datawhale夏令营】任务二学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用户新增预测(Datawhale机器学习AI夏令营第三期)

    内容为AI夏令营第三期 - 用户新增预测挑战赛教程的笔记,比赛链接为用户新增预测挑战赛,感觉教程比较适合新入门的小白,对新手很友好。这是我第一次参加机器学习相关的竞赛,记录小白升级打怪过程! 第一次修改时间:2023年8月18日,初步提交内容,完成教程了教程中

    2024年02月12日
    浏览(43)
  • DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录

    DataWhale 机器学习夏令营第二期 ——AI量化模型预测挑战赛 已跑通baseline,线上得分 0.51138 , 跑通修改后进阶代码,线上得分 0.34497 按照鱼佬直播分享按照以下常见思路分析机器学习竞赛: 1.1 赛事数据 数据集情况 给定数据集 : 给定训练集(含验证集), 包括10只(不公开)

    2024年02月11日
    浏览(42)
  • AI夏令营笔记——任务2

    任务要求与任务1一样: 从论文标题、摘要作者等信息,判断该论文是否属于医学领域的文献。 可以将任务看作是一个文本二分类任务。机器需要根据对论文摘要等信息的理解,将论文划分为医学领域的文献和非医学领域的文献两个类别之一。 使用预训练的大语言模型进行建

    2024年02月11日
    浏览(36)
  • 【Datawhale AI 夏令营第二期】AI 量化模型预测挑战赛

    量化金融在国外已经有数十年的历程,而在国内兴起还不到十年。这是一个极具挑战的领域。量化金融结合了数理统计、金融理论、社会学、心理学等多学科的精华,同时特别注重实践。由于市场博弈参与个体的差异性和群体效应的复杂性,量化金融极具挑战与重大的机遇的

    2024年02月14日
    浏览(48)
  • Datawhale-AI夏令营:脑PET图像分析和疾病预测挑战赛baseline解读

    这段代码是一个完整的深度学习模型训练和预测的流程。下面我会逐步解释每个步骤的作用。 首先,这段代码导入了必要的库,包括PyTorch、numpy、pandas等。接着,打印出CUDA版本和是否可用GPU,并将模型部署到GPU上(如果可用)。 接下来是数据预处理的部分。通过glob.glob函数

    2024年02月16日
    浏览(36)
  • AI夏令营第三期用户新增挑战赛学习笔记

    通过pd库的df.info()方法查看数据框属性,发现只有udmap字段为类别类型,其余皆为数值类型。 相关性热力图颜色越深代表相关性越强,所以x7和x8变量之间的关系更加密切,还有common_ts与x6也是。即存在很强的多重共线性,进行特征工程时可以考虑剔除二者中的一个变量,以免

    2024年02月11日
    浏览(38)
  • DatawhaleAI夏令营第三期机器学习用户新增预测挑战赛baseline新手教程

    本教程会带领大家项目制学习,由浅入深,逐渐进阶。从竞赛通用流程与跑通最简的Baseline,到深入各个竞赛环节,精读Baseline与进阶实践技巧的学习。 千里之行,始于足下,从这里,开启你的 AI 学习之旅吧! —— Datawhale贡献者团队 用户新增预测挑战赛: https://challenge.xf

    2024年02月12日
    浏览(45)
  • acm夏令营课后题(持续更新)

                                            米有程序题就懒得写哩           acm夏令营贪心算法选题_李卓航哇哇咔~的博客-CSDN博客  上面这个自己写的不知道为什么错哩,在网上找了下面这个。   这道题写的很顺      (这道题答案来源于网上)  网上答案写的很详细

    2024年02月13日
    浏览(43)
  • 考研保研、夏令营推免的简历模板

      本文介绍在保研夏令营、考研复试等场景中, 个人简历 的制作模板与撰写注意事项。   这里就将当初我自己的简历分享一下,供大家参考。其实我的简历是那种比较简单、质朴的,通篇就一个颜色,没有太多花里胡哨的部分。我个人感觉,对于读研、升学而言,其实

    2024年02月04日
    浏览(45)
  • 【NVIDIA CUDA】2023 CUDA夏令营编程模型(二)

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客内容主要围绕:        5G/6G协议

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包