一、前言
上一个任务中我们初步了解了基于经验模型的baseline,并对电力进行了预测。这次任务采用了进阶的机器学习模型lightgbm解决本次问题。
二、基本概念及进阶代码解析
1、LightGBm的简单介绍
LightGBM 是一个实现 GBDT 算法的框架,具有训练速度快、内存消耗低、准确率高、分布式支持等优点,主要通过Histogram 算法、带深度限制的 Leaf-wise 叶子生长策略和直方图做差加速等技术进行优化。
Histogram 算法通过将连续的浮点特征值离散化为整数,并构建宽度为 k 的直方图,来降低内存消耗和计算代价。该算法在遍历数据时累积统计量,并根据直方图离散值寻找最优分割点。
带深度限制的 Leaf-wise 叶子生长策略每次从当前所有叶子中找到分裂增益最大的一个叶子进行分裂,从而降低误差并提高精度,但可能导致过拟合,因此需要增加最大深度限制。
直方图做差加速则通过利用叶子节点的直方图与其父节点和兄弟节点的直方图做差,进一步提高训练速度。
此外,LightGBM 还支持类别特征、Cache 命中率优化和多线程优化等功能。它在处理大规模数据时表现出色,常用于点击率预测、搜索排序等任务。
2、code
还是按照task1的说明步骤,先配置好飞桨AI studio环境,修改文件中原本的代码,构建lightgbm模型,下面是根据我运行过程中遇到的一些问题对task2中的代码进行部分探讨。
首先要调用python内置库,在调用lightgbm库之前要先在代码最开头写一行指令来下载lightgbm库。注意最开头有一个‘!’,另外‘==’要紧挨着lightgbm (python代码写多了习惯性的在符号之前和之后打一个空格)。
!pip install lightgbm==3.3.0
然后就是根据task2中的说明调用相关库。
接着就是进行训练集和测试集的划分,其实两个集合已经划分好了,就在飞桨环境左侧一栏中的data文件中,只需输入task2文件中该部分代码即可(训练集后续会进行切分后续再进行探讨),需要注意的是这两行代码的地址有可能和文件所在地址不对应,在飞桨环境中data文件夹下还有一个data283931文件夹,再然后才是训练集和测试集的数据。所以此处将task2中的代码改为以下代码。
train = pd.read_csv('./data/data283931/train.csv') # 训练集
test = pd.read_csv('./data/data283931/test.csv') # 测试集
然后,为了让我们更加直观的感受到所涉及的数据,这里我们采用了两种方式进行了可视化处理,(1)不同房屋类型对应的用电量的柱状分布图:这个图能够比较清晰的将不同类型该房屋的用电量进行对比,为了看起来不那么混乱,我们可以将图像的柱用多个颜色标识,这里就用了蓝色和绿色。在图中我们能够比较清楚地看出房屋类型为17的房屋的用电量是最多的(2)同一个房屋不同时间用电量所构成的折线图:这个图能够反映出同一个房屋一段时间内用电量的变化趋势。这里调用了图像处理中经常用到的plt来勾画图像。在这个图中,有几个时间点的房屋用电量明显低于大部分数据。这里可以将时间间隔放大一些,否则就会像task2中给出的图像,数据之间较为拥挤,不能较为明显的看出用电量的变化。
然后是特征工程部分,分为历史平移特征和窗口统计特征。历史平移特征得到的预测值比较偏向于用附近已知值对未知值进行预测,类似于今天下雨我就会预测明天也下雨,昨天和今天都是晴天我就会预测明天也是晴天;窗口统计特征,更加能够偏向于趋势的统计对未知值进行预测。由于要对测试集进行预测,所以先将测试集和训练集合并,通过训练集的训练然后运用特征工程来预测测试集的结果并和真实结果相比对。历史平移特征测用了暴力手段求解,将最近的11-30个数据依次平移;窗口统计特征是对最近三个特征进行求均值处理,可以增加特征数量比如增加到最近十个数据,同时计算这些数据的最值、方差、趋势来达成更好的预测。
最后进行模型训练,第一步将训练集进行划分,化为训练集和验证集,训练集训练好后,验证集进行调参选取最优模型,这里我们选择31以后为训练集,11-30为验证集,最终训练得到最优模型,然后对测试集进行预测,同时在训练模型时要注意避免穿越问题否则会严重影响预测结果。将训练集和验证集的数据传入,然后再设置lightgbm的参数,训练期间我们可以进行调参,从而达到最优效果。最后得到离线状态下的预测数据,在提交后的得分会比离线状态下低一些。
三、结语
通过对机器学习模型lightgbm进行设计调参最终达到预测效果,我们将分数提到了259左右,相比于最开始的373有了较明显的提升,期待后续的进一步上分优化!