Datawhale夏令营task2笔记

 

 

【AI夏令营】ML赛事解析 & Baseline精读

 此文将Baseline大致分为五部分来理解,首先是代码文件库的引用

# 导入所需要的库

import pandas as pd # 用于处理数据的工具

import lightgbm as lgb # 机器学习模型 LightGBM

 

from sklearn.metrics import mean_absolute_error # 评分 MAE 的计算函数

# MAE是平均绝对误差,是机器学习中评价模型的重要标尺之一

 

from sklearn.model_selection import train_test_split # 拆分训练集与验证集工具

from tqdm import tqdm # 显示循环的进度条工具

 

接着是数据的准备

# 数据准备

train_dataset = pd.read_csv("./data/data228216/train.csv") # 原始训练数据。

test_dataset = pd.read_csv("./data/data228216/test.csv") # 原始测试数据(用于提交)。

 

submit = pd.DataFrame() # 定义提交的最终数据。

submit["序号"] = test_dataset["序号"] # 对齐测试数据的序号。

 

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

 

模型参数设置

pred_labels = list(train_dataset.columns[-34:]) # 需要预测的标签。

# 因为是上部17个与下部17个温度的输出,所以取训练集后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.5,        # 学习律,控制迭代步长

        'seed': 2023,                # 随机种子,保证实验的可重复性

        'nthread' : 16,             # 线程数量,用于并行计算

        'verbose' : -1,              # 是否显示训练过程的详细信息,-1表示不显示

    }

 

no_info = lgb.callback.log_evaluation(period=-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”,代表”是否是周末“,1 代表是周末,0 代表不是周末。

 

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

 

    if pred_labels: # 如果提供了 pred_labels 参数,则执行该代码块。

        data = data.drop(columns=[*pred_labels]) # 去掉所有待预测的标签。

    

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

    

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

test_features.head(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)

    train_labels = train_set[pred_label] # 训练集的标签数据。

    # print("当前的train_labels是:", train_labels)

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

 

    valid_features = time_feature(valid_set, pred_labels=pred_labels) # 处理验证集的时间特征。

    # valid_features = enhancement(valid_features_raw)

    valid_labels = valid_set[pred_label] # 验证集的标签数据。

    # print("当前的valid_labels是:", valid_labels)

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

 

    # 训练模型,参数依次为:导入模型设定参数、导入训练集、设定模型迭代次数(200)、导入验证集、禁止输出日志

    model = lgb.train(lgb_params, train_data, 500, 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('submit_result.csv', index=False) # 保存最后的预测结果到 submit_result.csv

print(MAE_scores) # 查看各项的 MAE 值29c3c969c6b14d1ba9eef3a62d44328d.png

55519fc587584a768eca410d061a63dc.png 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值