计算机系统应用  2018, Vol. 27 Issue (2): 202-206   PDF    
基于Adaboost的随机森林算法在医疗销售预测中的应用
常晓花, 熊翱     
北京邮电大学 网络技术研究院, 北京 100876
摘要:提出一种基于Adaboost方法的随机森林销售量预测方法. 首先对销售量的影响因素进行了特征分析, 确定了训练数据的特征和维度. 然后采用基于Adaboost的随机森林销量预测方法对特征数据进行训练并给出了预测算法的步骤. 最后使用python进行了仿真实验, 实验结果表明, 该方法可以有效提高随机森林的回归性能, 且预测精度高, 具有较强的泛化能力.
关键词: Adaboost 算法    随机森林    销售量预测    弱预测模型    python    
Application of Random Forest Algorithm in Medical Sales Forecast Based on Adaboost
CHANG Xiao-Hua, XIONG Ao     
Institute of Network Technology, Beijing University of Posts and Telecommunications, Beijing 100876, China
Abstract: A sales forecasting method based on random forest algorithm and Adaboost method is proposed. Firstly, by analyzing the characteristics of the sales factors, the characteristics and dimensions of the training data are determined. Then, the feature data is trained by the random forest algorithm based on Adaboost, and the steps of the prediction algorithm are presented. Finally, the experimental results show that this method can greatly enhance the performance of random forest algorithm, and has a high prediction accuracy, as well as a good performance of generalization.
Key words: Adaboost algorithm     random forest algorithm     sales forcasting method     weak prediction model     python    

1 引言

销售量是衡量一个公司销售业绩好坏的重要标志. 销售量的多少不仅影响着公司的盈利和发展, 同时也影响着整个国家的经济命脉. 因此, 销售量预测的精确性和科学性具有重要的研究价值.

销售数据是一种动态的、非线性的、不规则的时间序列数据, 受季节气候、突发事件、经销商的销售能力、下级经销商的数量等等各种因素的影响. 国内外学者对各行各业销售量预测的方法, 主要有神经网络预测法[1]、聚类预测[2]方法等. 传统的BP神经网络方法, 容易陷入局部极小值, 而达不到预测的精度; 基于聚类的销量预测方法, 初始聚类中心的选择对聚类结果的影响较大, 并且需要不断调整聚类中心, 所以数据量较大时, 算法时间开销也会非常大.

本文针对上述问题, 提出了基于改进Adaboost算法[3]的随机森林预测方法, 该方法不存在神经网络算法会陷入局部极小值的缺点, 且在数据量较大和较小时都能够维持一定的预测精度, 对不平衡数据集来说, 能够平衡误差, 同时训练速度快, 能够实现并行化. 本文利用该改进的Adaboost随机森林预测方法, 对某医疗器械销售公司的实际销售数据集进行了仿真实验, 实验结果证明了本文所提方法的有效性.

2 随机森林算法和Adaboost算法 2.1 随机森林算法原理

随机森林[4]是Bagging算法和改进的决策树算法的结合.

Bagging算法是多个个体弱学习器各自学习, 然后通过集合策略来得到最终的强学习器, 个体弱学习器之间不存在依赖关系, 个体弱学习器的训练集通过随机采样得到, 随机采样表示每次从训练集中采集固定个数的样本, 但是采集后都将样本放回; 普通的决策树算法, 会在节点所有样本特征中选择一个最优的特征来做决策树的左右子树划分. 但是, 随机森林中所用的决策树算法, 则是通过随机选择节点上的一部分样本特征, 再在其中选择一个最优的特征来做决策树的左右子树划分.

随机森林算法, 就是将改进的决策树算法作为弱学习器, 然后使用Bagging算法对弱学习器进行集成学习而得到的. 该算法结合了Bagging算法的随机采样以及决策树算法的随机特征选择, 这两个“随机”性, 因而其泛化能力强, 不容易陷入过拟合. 同时, 由于Bagging算法中弱学习器之间相互独立, 随机森林中的决策树可以并行学习, 因而, 随机森林算法的时间效率高.

随机森林的训练过程如下:

(1) 给定训练集S, 测试集T, 特征维数F. 确定参数: 使用到的CART的数量t, 每棵树的深度d, 每个节点使用到的特征数量f. 终止条件: 节点上最少样本数s, 节点上最少的信息增益m.

对于第1–t棵树, i=1–t:

(2) 从S中有放回的抽取大小和S一样的训练集S(i), 作为根节点的样本, 从根节点开始训练.

(3) 如果当前节点上达到终止条件, 则设置当前节点为叶子节点, 如果是分类问题, 该叶子节点的预测输出为当前节点样本集合中数量最多的那一类c(j), 概率pc(j)占当前样本集的比例; 如果是回归问题, 预测输出为当前节点样本集各个样本值的平均值. 然后继续训练其他节点. 如果当前节点没有达到终止条件, 则从F维特征中无放回的随机选取f维特征. 利用这f维特征, 寻找分类效果最好的一维特征k及其阈值th, 当前节点上样本第k维特征小于th的样本被划分到左节点, 其余的被划分到右节点. 继续训练其他节点.

(4) 重复(2), (3), 直到所有节点都训练过了或者被标记为叶子节点.

(5) 重复(2), (3), (4), 直到所有CART都被训练过.

利用随机森林的预测过程如下:

对于第1–t棵树, i=1–t:

(1) 从当前树的根节点开始, 根据当前节点的阈值th, 判断是进入左节点还是进入右节点, 直到到达, 某个叶子节点, 并输出预测值.

(2) 重复执行(1), 直到所有t棵树都输出了预测值. 如果是分类问题, 则输出为所有树中预测概率总和最大的那一个类, 即对每个c(j)的p进行累计; 如果是回归问题, 则输出为所有树的输出的平均值.

随机森林算法包含在python的sklearn学习包中, sklearn是一个python的科学计算库, 里面对一些常用的机器学习算法进行了封装. 随机森林在sklearn中的回归类是RandomForestRegressor, 随机森林需要调整的参数包括两部分, 第一部分是Bagging框架的参数如表1所示, 第二部分是CART决策树的参数如表2所示.

表 1 Bagging框架的参数

表 2 CART决策树的参数

2.2 Adaboost算法原理

Adaboost是一种迭代算法. 其主要过程分为三步, 首先对训练样本进行权重初始化; 然后对弱学习器进行训练, 如果某个样本点的预测值达到了所要求的精度, 那么在构造下一个训练集时, 它的权重就降低, 相反, 则权重提高, 接着权重更新过的样本集被用于训练下一个学习器, 整个训练过程如此迭代进行; 最后将各个学习器组合成强学习器[5].

Adaboost算法最终得到的强学习器, 由各个弱学习器与其权重结合而成, 弱学习器的权重由每个弱学习器的误差率决定, 误差率小的弱学习器, 其权重则大, 这使其在最终的强学习器函数中起较大的决定作用.

因此, Adaboost算法中的个体学习器之间有很强的依赖关系, 也因此导致其有预测精度高的优点. 并且, Adaboost算法[6]提供的是一个学习框架, 这使其应用非常灵活, 可以使用各种分类回归模型来构建弱学习器.

2.3 基于改进Adaboost的随机森林销售量预测模型

本文将随机森林算法与Adaboost算法框架结合, 提出了一种改进Adaboost算法的随机森林销售量预测算法, 以下称为预测算法.

算法首先对训练的数据进行了特征选取, 随后对N个训练样本做了权重的初始化, 初始化权重值为1/N, 接着将训练样本用随机森林算法进行学习, 得到N个训练样本的预测值;由预测值计算得到N个训练样本的相对误差值, 进而通过与既定误差阈值的比较, 计算出该弱学习器的预测错误率 ${\varepsilon _t}$ , 以及该预测器所有样本的平均相对误差值 ${\gamma _t}$ ; 根据Adaboost算法[7]的思想, 当样本预测正确时, 则要减小该样本在下一个弱学习器中的权重, 因而以 ${\;\beta _t} = {e^{{\varepsilon _t}^2}} + k \times \displaystyle\frac{1}{{1 + {e^{ - {\gamma _t}}}}}$ 作为样本权重系数, 其中 $k \times \displaystyle\frac{1}{{1 + {e^{ - {\gamma _t}}}}}$ 为影响因子, k为影响系数; 当预测正确率越小, 也即是错误率就越大时, 则增大下一个弱预测器的权重, 以让下一个弱预测器对上一个弱预测器错误预测的样本更重视, 即 ${\varepsilon _t}$ (即错误率)越大, ${\gamma _t}$ (平均相对误差)就越大, 最终 ${\;\beta _t}$ 就越大; 最后将所有弱学习器的预测结果加权平均, 就得到了最终的强预测器, 然而, 由于最终要让预测值更为精确, 所以要减小错误率高的弱预测器的权重, 而增大错误率低的弱预测器权重, 因此以 ${\beta _t}$ 的倒数作为弱预测器的权重.

该算法详细步骤如下:

(1) 样本数据选择及网络初始化. 根据训练数据, 选择训练样本的数据特征. 训练样本数据为 $({x_1},{y_1}),$ $({x_2},{y_2}),\cdots,({x_n},{y_n})$ , 其中, ${x_i} \in X$ , X表示某个训练数据集或者实例空间, ${y_i} \in Y$ , Y表示实际输出值. 令迭代次数 $M = 1$ 时, 样本权重初始化为 ${D_{t}}\left( {i} \right){ = }\displaystyle\frac{1}{{n}},{i} = 1,2,3,\cdots,n$ , 其中n为训练样本数据集的数量. 初始化分类器的预测率 ${\varepsilon _t}$ , 令 ${\varepsilon _t} = 0$ . 初始化随机森林的初始阈值 $\phi (0 < \phi < 1)$ .

(2) 随机森林弱预测模型[8]预测. 通过选取合适随机森林算法参数值, 构造不同的随机森林弱预测器, 对于 $t = 1,...,T$ 进行T次迭代, 在训练第t个弱预测器时, 使用随机森林回归类对数据进行训练, 建立回归模型 ${g_t}\left( x \right) \to y$ . 具体步骤如下:

1) 计算样本的相对误差 $er{r_{{t_i}}}$ , $er{r_{{t_i}}} = \left| {\displaystyle\frac{{{g_t}\left( {{x_i}} \right) - {y_i}}}{{{y_i}}}} \right|$ , 令 ${\gamma _t} = \displaystyle\frac{{\sum {\left| {{g_t}({x_i}) - {y_i}} \right|} }}{{\sum I }}$ , 表示弱预测器的样本平均误差;

2) 计算第t个弱预测器的预测错误率 ${\varepsilon _t}$ , ${\varepsilon _t} = \displaystyle\frac{{{n_{{e_{{t_i}}} > \phi }}}}{N}$ , 表示第t个弱预测器预测结果中相对误差大于 $\phi $ 的样本数量占总样本数量的百分比, 令 ${\;\beta _t} = {e^{{\varepsilon _t}^2}} + k \times$ $ \displaystyle\frac{1}{{1 + {e^{ - {\gamma _t}}}}}$ , k为调整系数;

3) 计算第t+1个预测器的训练样本权重 ${D_{t + 1}}(i)$ , ${D_{t + 1}}(i) = \left\{ \begin{array}{l}{D_t}(i) \times {e^{{\beta _t}}},er{r_{{t_i}}} < \phi \\{D_t}(i)\end{array} \right.$ , 并将下一个分类器样本权重使用公式 $\displaystyle\frac{{{D_t}(i) - \overline {{D_t}(i)} }}{{\rm{MAX}({D_t}(i)) - {\rm{MIN}}({D_t}(i))}}$ 进行归一化处理, 作为第t+1个分类器的样本权重值;

4) 计算第t个分类器权重 ${\omega _t}$ , ${\omega _t} = \displaystyle\frac{{\displaystyle\frac{1}{{{\beta _t}}}}}{\displaystyle{\sum\limits_{t = 1}^T {\displaystyle\frac{1}{{{\beta _t}}}} }}$ , 归一化权重;

5) 进行第t+1次迭代;

6) 如果迭代次数达到T, 则继续7), 否则返回1), 直到达到最大迭代次数;

7) 输出强预测器函数 $g(x) = \displaystyle\sum\limits_{t = 1}^T {{\omega _t}{g_t}(x)} $ ;

最终强预测器函数的输出公式如下:

$\displaystyle g(x) = \!\!\!\sum\limits_{t = 1}^T \!\!{{\omega _t}{g_t}(x)} =\!\!\! \sum\limits_{t = 1}^T\!\! {\displaystyle\frac{{\displaystyle\frac{1}{{{\beta _t}}}}}{{\displaystyle\sum {\displaystyle\frac{1}{{{\beta _t}}}} }}{g_t}(x) \!=\!\!\!\sum \!\!{\displaystyle\frac{{\frac{1}{{{e^{{\varepsilon _t}^2}} + \displaystyle\frac{k}{{1 + {e^{ - {\gamma _t}}}}}}}}}{{\displaystyle\sum\!\!\! {\displaystyle\frac{1}{{{e^{{\varepsilon _t}^2}} \!\!\!+\!\! \displaystyle\frac{k}{{1 \!\!\!+\!\! {e^{ - {\gamma _t}}}}}}}} }}} } {g_t}(x)$

本文提出的基于Adaboost的随机森林预测算法, 结合了随机森林算法和Adaboost算法的优点, 时间效率高, 泛化能力强, 同时由于Adaboost的迭代, 预测精度较高. 预测算法使用了弱学习器中每次学习后的预测错误率以及样本的平均相对误差作为影响弱学习器权重的因子, 使得在下一个学习器中能够更注重上一个学习器预测误差较大的样本, 从而提高了预测的精度.

3 实验与结果分析

本文的实验数据来自某医疗器械销售公司的销售数据. 共有240组样本数据, 部分数据如表3所示, tmp_max表示最高气温均值, tmp_min表示最低气温均值, prob_rain表示降雨概率(已做处理), lstwk_sales表示上周的销量, lsttwo_sales表示上上周的销量, 单位为实际销售单位EA.

表 3 实验部分数据

选取样本中的150组数据进行训练, 其余90组作为测试样本. 然后用本文提出的方法进行训练. 实验采用python [9,10]进行仿真, 实验过程中, 随机森林决策树个数设为100, 随机森林其余参数均选择默认值, 构成弱预测器. 根据本文提出的预测方法, 设置Ada- boost算法的最大迭代次数T为20, 调整系数k为1.1, 相对误差率阈值设0.1.

表4所示为部分预测值及相对误差, 图1是使用改进Adaboost方法和未使用Adaboost方法的预测结果对比图. 实验结果表明, 预测数据误差率小于0.1, 使用基于Adaboost改进后的算法能够比改进之前的预测率提高约12%, 证明了本文提出的算法的有效性.

表 4 室内光流扰动效应检测

图 1 改进前后销量预测对比图

4 结论与展望

近年来, 随着医疗技术的不断更新发展, 医疗器材的需求量也不断增加, 大量的销售数据销售信息有待挖掘, 本文利用改进的Adaboost方法, 初始化训练样本权重, 并利用随机森林算法训练得到若预测器, 后又结合多个弱预测器, 形成强预测器的方法, 对销售数据集进行了分析和研究, 同时提升了随机森林算法的回归性能, 但是本文提出的方法, 只是通过改进Adaboost算法结合随机森林算法来提高算法的回归性能, 并没有考虑通过改进随机森林算法本身来提高算法的有效性, 所以未来还有很大的提升改进空间.

参考文献
[1]
陈蓉. 基于BP神经网络的零售产品销量预测方法. 经营管理者, 2015(4): 10-11.
[2]
王建伟. 基于商品聚类的电商销量预测. 计算机系统应用, 2016, 25(10): 162-168. DOI:10.15888/j.cnki.csa.005423
[3]
曹莹, 苗启广, 刘家辰, 等. AdaBoost算法研究进展与展望. 自动化学报, 2013, 39(6): 745-758.
[4]
丁君美, 刘贵全, 李慧. 改进随机森林算法在电信业客户流失预测中的应用. 模式识别与人工智能, 2015, 28(11): 1041-1049.
[5]
李翔, 朱全银. Adaboost算法改进BP神经网络预测研究. 计算机工程与科学, 2013, 35(8): 96-102.
[6]
张禹, 马驷良, 张忠波, 等. 基于Adaboost算法与神经网络的快速虹膜检测与定位算法. 吉林大学学报(理学版), 2006, 44(2): 233-236.
[7]
李翔, 朱全银. 基于Adaboost算法和BP神经网络的税收预测. 计算机应用, 2012, 32(12): 3558-3560, 3568.
[8]
李威威, 李春青, 聂敬云, 等. 膜生物反应器膜污染的随机森林预测模型. 计算机应用, 2015, 35(SI): 135-137.
[9]
Richert W, Coelho LP. Python语言构建机器学习系统. 南京: 东南大学出版社, 2016.
[10]
Hetland ML. Python基础教程. 2版. 司维, 曾军崴, 谭颖华, 译. 北京: 人民邮电出版社, 2014.