这次挑战基于时序预测模型,助力电力需求的预测电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。
1、跑通baseline
准备工作与环境搭建
Datawhale官方有提供详细的速通文档:从零入门机器学习竞赛
按照上述文档可以速通baseline。只要会点运行就可以!
Step 1:下载相关库
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_squared_log_error, mean_absolute_error, mean_squared_error
import tqdm
import sys
import os
import gc
import argparse
import warnings
warnings.filterwarnings('ignore')
Step 2:探索性数据分析(EDA)
读取赛题数据给出的训练集和测试集
# 2. 读取训练集和测试集
# 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
train = pd.read_csv('train.csv')
# 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'test.csv'
test = pd.read_csv('test.csv')
数据简单介绍:
-
其中id为房屋id,
-
dt为日标识,训练数据dt最小为11,不同id对应序列长度不同;
-
type为房屋类型,通常而言不同类型的房屋整体消耗存在比较大的差异;
-
target为实际电力消耗,也是我们的本次比赛的预测目标。
-
不同type类型对应target的柱状图
import matplotlib.pyplot as plt
# 不同type类型对应target的柱状图
type_target_df = train.groupby('type')['target'].mean().reset_index()
plt.figure(figsize=(8, 4))
plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
plt.xlabel('Type')
plt.ylabel('Average Target Value')
plt.title('Bar Chart of Target by Type')
plt.show()
-
id为00037f39cf的按dt为序列关于target的折线图
specific_id_df = train[train['id'] == '00037f39cf']
plt.figure(figsize=(10, 5))
plt.plot(specific_id_df['dt'], specific_id_df['target'], marker='o', linestyle='-')
plt.xlabel('DateTime')
plt.ylabel('Target Value')
plt.title("Line Chart of Target for ID '00037f39cf'")
plt.show()
(4)模型训练与测试集预测
这里选择使用Lightgbm模型,也是通常作为数据挖掘比赛的基线模型,在不需要过程调参的情况的也能得到比较稳定的分数。
另外需要注意的训练集和验证集的构建:因为数据存在时序关系,所以需要严格按照时序进行切分,
-
这里选择原始给出训练数据集中dt为30之后的数据作为训练数据,之前的数据作为验证数据,
-
这样保证了数据不存在穿越问题(不使用未来数据预测历史数据)。
def time_model(lgb, train_df, test_df, cols):
# 训练集和验证集切分
trn_x, trn_y = train_df[train_df.dt>=31][cols], train_df[train_df.dt>=31]['target']
val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']
# 构建模型输入数据
train_matrix = lgb.Dataset(trn_x, label=trn_y)
valid_matrix = lgb.Dataset(val_x, label=val_y)
# lightgbm参数
lgb_params = {
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': 'mse',
'min_child_weight': 5,
'num_leaves': 2 ** 5,
'lambda_l2': 10,
'feature_fraction': 0.8,
'bagging_fraction': 0.8,
'bagging_freq': 4,
'learning_rate': 0.05,
'seed': 2024,
'nthread' : 16,
'verbose' : -1,
}
# 训练模型
model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix],
categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)
# 验证集和测试集结果预测
val_pred = model.predict(val_x, num_iteration=model.best_iteration)
test_pred = model.predict(test_df[cols], num_iteration=model.best_iteration)
# 离线分数评估
score = mean_squared_error(val_pred, val_y)
print(score)
return val_pred, test_pred
lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
# 保存结果文件到本地
test['target'] = lgb_test
test[['id','dt','target']].to_csv('submit.csv', index=None)
复盘总结
经过这次预测模型的学习与实践,我深刻体会到了机器学习,特别是LightGBM这一高效梯度提升框架在解决回归与分类问题中的强大能力。以下是我对本次学习过程的一些总结:
-
理论基础:首先,我巩固了梯度提升算法的基本原理,理解了它是如何通过迭代地构建弱学习器(通常是决策树)来逐步逼近目标函数的。LightGBM作为GBDT的一个高效实现,通过直方图算法、GOSS和EFB等优化技术,显著提升了模型的训练速度和预测性能。
-
数据处理:数据处理是机器学习项目中至关重要的一环。在准备训练数据时,我学会了如何根据业务逻辑和数据分布来合理地划分训练集和验证集(如本例中根据
dt
列的值)。同时,我也意识到特征选择、特征工程和缺失值处理对于提升模型性能的重要性。 -
参数调优:LightGBM提供了丰富的参数供用户调整,以优化模型性能。通过本次实践,我学习到了如何根据问题类型和数据集特点来设置合适的参数,如
boosting_type
、objective
、metric
等。同时,我也掌握了使用网格搜索、随机搜索等策略进行参数调优的方法。 -
模型训练与评估:在模型训练过程中,我深刻体会到了早停法(early stopping)的重要性,它可以帮助我们避免过拟合,同时节省计算资源。此外,我还学会了如何使用交叉验证来评估模型的泛化能力,以及如何通过可视化工具(如LightGBM自带的绘图功能)来监控训练过程,理解模型的学习动态。
-
模型部署与应用:最后,我将训练好的模型应用于测试集,并计算了性能指标(如均方误差MSE)。通过这一步骤,我不仅验证了模型的有效性,还学会了如何将机器学习模型集成到实际业务系统中,为业务决策提供有力支持。
总之,这次预测模型的学习让我受益匪浅。我不仅掌握了LightGBM这一强大工具的使用技巧,还加深了对机器学习流程、数据处理、模型调优等方面的理解。未来,我将继续深入学习相关知识,不断提升自己的技能水平,以应对更加复杂和具有挑战性的机器学习任务。