原文档:
1、理解任务和数据集
下载并解压完data.zip文件后,可以看到存在train.csv和test.csv两个csv文件。打开train.csv,可以发现里面有比赛的五种电池数据和基本的序号、时间数据;打开test.csv,可以发现里面少了电炉上下部空间17个测温点的测量温度值——而这正是我们需要预测并上传到赛事方的预测目标。
2、基准模型的基本结构
我们采用的是LightGBM模型,采用MAE作为评价指标。这里我们先把库的安装及导入以及数据的引入忽略,先讨论主体的构建问题。
以上图片是datawhale官方文档里给出的步骤,不过我觉得这更接近于功能模块,而不是代码实现中的步骤,我将试图找出后者:
2.1数据管道
我们要做的操作是将数据预处理后输入一个模型,然后接受模型的输出并上传。我们先不关心数据处理的中间环节,先考虑把数据引进来并且确定数据最终如何保存:
管道的两端处理完了,现在我们来想想模型需要什么样的数据——模型需要知道预测的目标是什么、模型需要划分出训练集和验证集、模型本身的一些基本参数以及源代码带有的禁用的训练日志输出:
关注到这些数据中时间是一个很特殊的基本变量,我们要对其进行时间特征的提取,这也是特征工程的一部分,可以更好地发现数据之间的时间相关性:
# 时间特征函数
def time_feature(data: pd.DataFrame, pred_labels: list=None) -> pd.DataFrame:
"""提取数据中的时间特征。
输入:
data: Pandas.DataFrame
需要提取时间特征的数据。
pred_labels: list, 默认值: None
需要预测的标签的列表。如果是测试集,不需要填入。
输出: data: Pandas.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”,代表”是否是