1、赛题回顾
1.1 赛题背景
电力需求预测赛题是关于时间序列预测的问题。时间序列预测问题是通过对历史数据中按时间排列的数据进行分析,捕捉数据中的规律和趋势,构建预测模型,预测未来某一时刻或某一段时间内的数值或趋势。这种方法在气象、金融、工业、经济、生物医学等多个领域都有广泛应用。在电力需求预测中,实时或近实时的精确电力需求预测,为电力系统的调度和运维提供了有力支持。
1.2 赛题任务
赛题中给定多个房屋对应历史N天的电力消耗数据信息,数据集字段为房屋id、日标识dt、房屋类型type、电力消耗target。预测房屋对应电力的消耗,预测结果以 mean square error 作为评判标准。
2、数据预处理
2.1 数据读取
2.2 数据集基本信息
DataFrame.shape属性可以帮助了解DataFrame的结构信息,从而评估数据处理的计算需求,根据特征的数量选择合适的模型类型和参数。以上输出表示train数据集具有2877305行观测值,4列特征,test数据集具有58320行观测值,3列特征。
train.info()主要用于快速查看DataFrame的基本信息,以上输出信息中id 列的数据类型是 object,dt 和 type 列的数据类型是 int64,target 列的数据类型是 float64。
test.isnull().sum()的输出信息表明train及test数据集中不存在缺失数据。
train.describe()方法输出的统计信息为:target列的平均值为32.22,标准偏差值50.36,最小值-0.61,最大值1191.68,中位数22.35。可以看出target列的数据分布范围从-0.61到1191.68,分布较广,平均值(32.22)低于中位数(22.35),标准偏差(50.36)相对较大,表明数据点在其平均值周围有较大的离散度。
2.3 合并数据并排序
train和test数据集合并是为了后续特征工程的统一处理。
3、特征工程
3.1 时间序列问题的特征工程
时间序列问题的特征工程是将原始数据转换为更能反映问题本质的特征的过程,涉及特征提取、选择和降维等多个环节。其处理方法包括统计分析均值、标准差、极值、分位数等简单特征,以及自相关性、周期性、趋势等高级特征;提取持续时间、时间间隔等时间维度上的信息;统计分析在时间轴上划分的每个窗口内的数据获取窗口内的特征;通过主成分分析(PCA)和张量分解等降维转换特征。 在神经网络模型中,如RNN、自编码器、LSTM等,能够自动提取原始时间序列数据的特征,这些特征能显著提高模型的预测性能。
3.2 历史平移
3.3 窗口特征
3.4 特征选择
4、模型构建及调优
4.1 基于lightgbm的模型构建及调优
4.1.1 lightgbm基础模型
lightgbm模型是基于梯度提升决策树GBDT(Gradient Boosting Decision Tree)优化改善的一个算法框架,不需要处理缺失值。GBDT是一种迭代的决策树算法,通过构造一组弱的学习器(决策树),并将多棵决策树的结果累加起来作为最终的预测结果。在这个过程中,GBDT利用了梯度提升的思想,梯度提升是一种集成学习方法,通过不断拟合前一轮模型的残差(即真实值与预测值之间的差异)来优化模型,以此来逐步改进模型的预测性能。lightgbm最基本的是决策树被用作基学习器来拟合残差,这些决策树被用来逐步逼近真实的函数关系,从而实现对复杂数据的建模。
在基线baseline的lightgbm模型中,构建训练集和验证集的策略是:基于给定的原始数据集,选择dt大于或等于30天后的数据点的所有记录作为训练数据。所有日期早于特定值30天之前的记录则构成验证数据集,用于评估模型在未来时间段上的泛化能力。此基线lightgbm模型提交结果评分为260.66183。
4.1.2 参数调优策略
参数调优通常需要多次试验和调整才能找到最佳配置。此外,使用交叉验证(如k-fold交叉验证)可以更准确地评估模型性能,并帮助找到更稳健的参数组合。以下为部分lightgbm模型参数:
参数 | 描述 | 调优建议 |
boosting_type | 指定提升类型 | 对于大多数回归问题,'gbdt' 是个不错的选择 |
objective | 指定学习任务和相应的损失函数 | 'regression' 表示回归任务 |
metric | 评估模型性能的指标 | 对于回归问题,MSE 是一个常用的评估指标 |
min_child_weight | 叶子节点上所需的最小样本权重和 | 可以从默认值开始,然后逐步增加(如10, 20, 50等),直到观察到验证集上的性能开始下降 |
num_leaves | 树中的叶子节点数 | 可以从较小的值(如32)开始,并根据验证集的性能逐步增加(如64, 128等) |
lambda_l2 | L2正则化项的系数 | 可以从较小的值开始(如0.1, 1),然后根据验证集的性能逐步增加 |
feature_fraction | 在每次迭代中随机选择特征的比例 | 通常设置为0.5到1之间的值,如0.8、0.9,较小的值有助于防止过拟合 |
bagging_fraction | 在每次迭代中随机选择样本的比例 | 常见的值包括0.5到1之间的数,如0.8、0.9,较小的值有助于防止过拟合 |
bagging_freq | 执行bagging的频率 | 可以设置为1或更大的值(如3, 5, 10) |
learning_rate | 学习率 | 常见的值包括0.01到0.3之间,较小的值意味着更慢的学习过程,通常可以获得更好的性能 |
seed | 随机数种子 | 用于保证结果的可重复性 |
nthread | 线程数 | 根据机器配置设置,通常为CPU的核心数或更少(以避免资源争用) |
verbose | 打印日志的详细程度 | 根据需要设置,设置为1000,意味着每1000次迭代打印一次日志 |
early_stopping_round | 提前停止训练 | 可防止过拟合并节省时间,可根据数据集的大小和复杂度设置 |
参考以上参数调优建议策略,对learning_rate、max_depth、num_leaves等参数进行了微调整,提交结果评分256.53847,起到了一定的效果,但不是特别明显,特征工程的处理及模型的选择与融合有待进一步尝试。
4.2 基于xgboost的模型构建与调优
4.2.1 xgboost基础模型
xgboost和lightgbm都是基于梯度提升框架的机器学习算法,lightgbm采用直方图算法进行特征选择,xgboost采用预排序算法进行特征选择。lightgbm采用深度优先搜索,xgboost每次迭代都同时分裂同一层所有叶子节点,开销可能会大,在目标函数中加入了正则化项。在决定使用哪个算法时,需根据具体的问题需求、数据集及计算资源等综合考虑。
此基础xgboost模型提交结果评分为319.93635。
4.2.2 参数调优策略
参数 | 描述 | 调优建议 |
n_estimators | 生成树的数量 | 200到1000之间的值对于大多数数据集是一个合理的范围 |
max_depth | 树的最大深度 | 通常可以从3到10开始尝试,具体取决于数据的复杂度和特征的数量 |
subsample | 训练时的采样比例 | 常用的值包括0.5, 0.7, 0.8和0.9,较小的值有助于防止过拟合,可根据验证集上的表现进行调整 |
eta | 学习率 | 较小的eta值(如0.01到0.3)通常会导致更稳健的模型,但需要更多的迭代次数 |
scale_pos_weight | 样本权重,用于处理样本不均衡的情况 | 其值通常设置为多数类样本数与少数类样本数之比。例如,如果多数类与少数类的比例为10:1,则设置为10 |
reg_alpha | L1正则化项的系数,用于减轻过拟合 | 可以尝试0.1, 1, 10等量级递增,直到观察到验证集上的性能开始下降 |
gamma | 叶子节点分裂时的损失减少量下限 | 可以从0开始,然后根据需要增加,如0.1, 0.5, 1等。 |
reg_lambda | L2正则化项的系数,用于减轻过拟合 | 通常从0开始,逐步增加这些值,直到观察到验证集上的性能开始下降。开始时可以尝试0.1, 1, 10等量级递增 |
min_child_weight | 最小叶子节点样本权重和,用于控制每个节点上的样本数量 | 可以从1开始,然后根据需要增加,如5, 10等 |
objective | 目标函数 | 对于回归问题,常用的有reg:squarederror (平方损失)和reg:squaredlogerror (平方对数损失) |
verbosity | 控制训练过程中日志的详细程度 | 可设置为0(静默)、1(警告)、2(信息)、3(调试) |
eval_metric | 评估指标 | 对于回归任务,常用的选择有rmse、mse |
参考以上参数调优建议策略,对学习率、树的数量、树的最大深度等参数进行了初步调整,提交结果评分为265.4253,特征工程价值信息提取及模型的选择与融合有待进一步尝试。
4.3 模型融合
在模型融合这块,主要是运用Stacking的思想,融合lightgbm、xgboost及catboost模型。