DataWhale暑期夏令营学习笔记 二

一、夏令营实践赛题解读

赛题链接: 锂离子电池生产参数调控及生产温度预测挑战赛
通过电炉空间温度推测产品内部温度,设计烧结过程的温度场和浓度场的最优控制律:

  • 任务输入:电炉对应17个温区的实际生产数据,分别是电炉上部17组加热棒设定温度T1-1 ~ T1-17,电炉下部17组加热棒设定温度T2-1 ~ T2-17,底部17组进气口的设定进气流量V1-V17;

  • 任务输出:电炉对应17个温区上部空间和下部空间17个测温点的测量温度值。

    预测目标为34个,所以需要进行34次模型训练和预测。

通过对赛题数据进行观察发现数据规模比较小,包含电炉烧结每个时间段的流量、上下部设定温度,以及预测目标上下部测量温度值,因此此问题是一个典型的回归预测类问题,可以使用机器学习,如各种树模型LightGBM、XGBoost等,也可以利用神经网络等深度学习模型。

二、Baseline学习

1. 导入所需库

在运行进阶代码时,pandas会有很多性能警告,这里比baseline多加了warnings包,用来忽略警告的输出,让代码结果输出更清爽、舒服。

import pandas as pd # 用于处理数据的工具
import lightgbm as lgb # 机器学习模型 LightGBM
from sklearn.metrics import mean_absolute_error # 评分 MAE 的计算函数
from sklearn.model_selection import train_test_split # 拆分训练集与验证集工具
from tqdm import tqdm # 显示循环的进度条工具
import warnings  # 处理警告相关
warnings.filterwarnings("ignore")  # 忽略警告输出

2. 读取数据

# 文件地址有三种形式的写法可以参考。
"./data/data228216/train.csv"
".\\data\\data228216\\train.csv"
r".\data\data228216\train.csv"
train_dataset = pd.read_csv("./data/data228216/train.csv") # 原始训练数据。
test_dataset = pd.read_csv("./data/data228216/test.csv") # 原始测试数据(用于提交)。

submit = pd.DataFrame() # 定义提交的最终数据,DataFrame类型。
submit["序号"] = test_dataset["序号"] # 对齐测试数据的序号。

MAE_scores = dict() # 定义评分项,以字典的形式。

3. 特征处理

3.1 时间特征处理

以下代码为Baseline中对时间特征进行处理的部分,原数据中时间特征是string类型,通过以下处理,可将年月日等进行拆分,便于构造新的特征,充分利用题目中所给的时间信息,代码内容可以保存记忆,便于以后遇到类似问题时使用。

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 代表不是周末。

3.2 其他进阶特征构建

整理的鱼佬分享的竞赛上分技巧: DataWhale暑期夏令营学习笔记 番外篇之竞赛上分技巧

4. 训练数据集划分及模型参数设置

pred_labels = list(train_dataset.columns[-34:]) # 需要预测的标签。
train_set, valid_set = train_test_split(train_dataset, test_size=0.2) # 拆分数据集,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,              # 控制训练日志输出的详细程度,<0表示严重错误,=0表示一般错误(警告),>0表示普通日志信息。
    }

no_info = lgb.callback.log_evaluation(period=-1) # period=-1禁用训练日志输出,period=1启用输出训练日志。

5. 模型训练、预测及结果保存

5.1 LGBM模型学习链接:

LightGBM简介
LightGBM优缺点分析
LightGBM模型参数解读

5.2 模型训练及预测:

# 从所有待预测特征中依次取出标签进行训练与预测。
for pred_label in tqdm(pred_labels):
    train_features = time_feature(train_set, pred_labels=pred_labels) # 处理训练集的时间特征。
    train_labels = train_set[pred_label] # 训练集的标签数据。
    train_data = lgb.Dataset(train_features, label=train_labels) # 将训练集转换为 LightGBM 可处理的类型。

    valid_features = time_feature(valid_set, pred_labels=pred_labels) # 处理验证集的时间特征。
    valid_labels = valid_set[pred_label] # 验证集的标签数据。
    valid_data = lgb.Dataset(valid_features, label=valid_labels) # 将验证集转换为 LightGBM 可处理的类型。

    # 训练模型,参数依次为:导入模型设定参数、导入训练集、设定模型迭代次数(1000)、导入验证集、禁止输出日志
    # 若想优化模型训练结果,可将模型迭代次数设置为(5000),但所需时间较长
    model = lgb.train(lgb_params, train_data, 1000, 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 # 将测试集预测数据存入最终提交数据中。

关于模型过拟合,过拟合是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。如下图所示,蓝色虚线代表训练结果的误差值,红色实线代表测试结果的误差值,而我们需要寻找的就是图中黑色虚线所示的最优容量。
图片描述

5.3 结果保存

# 运行完成后,在本项目的文件目录中找到submit_result.csv文件,下载提交即可。
submit.to_csv('submit_result.csv', index=False) # 保存最后的预测结果到 submit_result.csv。

print(MAE_scores) # 查看各项的 MAE 值。

这里的 index=False 表示不保存索引列,避免结果文件序号列重复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码不跑那我跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值