什么是集成学习?
定义:本身并不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务,以达到获得比单个学习器更好的学习效果的一种机器学习方法。高端点的说叫“博彩众长”,庸俗的说叫“三个臭皮匠,顶个诸葛亮”。
思路:在对新的实例进行分类的时候,把若干个单个分类器集成起来,通过对多个分类器的分类结果进行某种组合来决定最终的分类,以取得比单个分类器更好的性能。如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。
原理:生成一组个体学习器,然后采用某种策略将他们结合起来。个体学习器可以由不同的学习算法生成,之间也可以按照不同的规律生成。
就像上图所示
集成(ensemble)是合并多个机器学习模型来构建更强大模型的方法。在机器学习文献中有许多模型都属于这一类,但已证明有两种集成模型对大量分类和回归的数据集都是有效的,二者都以决策树为基础,分别是随机森林(random forest)和梯度提升决策树(gradient boosted decision tree)。
随机森林
决策树的一个主要缺点在于经常对训练数据过拟合。随机森林是解决这个问题的一种方法。随机森林本质上是许多决策树的集合,其中每棵树都和其他树略有不同。随机森林背后的思想是,每棵树的预测可能都相对较好,但可能对部分数据过拟合。如果构造很多树,并且每棵树的预测都很好,但都以不同的方式过拟合,那么我们可以对这些树的结果取平均值来降低过拟合。既能减少过拟合又能保持树的预测能力,这可以在数学上严格证明。
为了实现这一策略,我们需要构造许多决策树。每棵树都应该对目标值做出可以接受的预
测,还应该与其他树不同。随机森林的名字来自于将随机性添加到树的构造过程中,以确
保每棵树都各不相同。随机森林中树的随机化方法有两种:一种是通过选择用于构造树的
数据点,另一种是通过选择每次划分测试的特征。
想 要 构 造 一 个 随 机 森 林 模 型, 你 需 要 确 定 用 于 构 造 的 树 的 个 数
(RandomForestRegressor 或 RandomForestClassifier 的 n_estimators 参数)。比如我们想要构造 10 棵树。
这些树在构造时彼此完全独立,算法对每棵树进行不同的随机选择,以确保树和树之间是有区别的。想要构造一棵树,首先要对数据进行自助采样(bootstrapsample)。也就是说,从 n_samples 个数据点中有放回地(即同一样本可以被多次抽取)重复随机抽取一个样本,共抽取 n_samples 次。这样会创建一个与原数据集大小相同的数据集,但有些数据点会缺失(大约三分之一),有些会重复。
举例说明:
比如我们想要创建列表 ['a', 'b', 'c', 'd'] 的自助采样。一种可能的自主采样是 ['b', 'd', 'd', 'c'],另一种可能的采样为 ['d', 'a', 'd', 'a']。
接下来,基于这个新创建的数据集来构造决策树。但是,要对我们在介绍决策树时描述的算法稍作修改。在每个结点处,算法随机选择特征的一个子集,并对其中一个特征寻找最佳测试,而不是对每个结点都寻找最佳测试。选择的特征个数由 max_features 参数来控制。每个结点中特征子集的选择是相互独立的,这样树的每个结点可以使用特征的不同子集来做出决策。
由于使用了自助采样,随机森林中构造每棵决策树的数据集都是略有不同的。由于每个结点的特征选择,每棵树中的每次划分都是基于特征的不同子集。这两种方法共同保证随机森林中所有树都不相同。
在这个过程中的一个关键参数是 max_features。如果我们设置 max_features 等于n_features,那么每次划分都要考虑数据集的所有特征,在特征选择的过程中没有添加随机性(不过自助采样依然存在随机性)。如果设置 max_features 等于 1,那么在划分时将无法选择对哪个特征进行测试,只能对随机选择的某个特征搜索不同的阈值。
因此,如果 max_features 较大,那么随机森林中的树将会十分相似,利用最独特的特征可以轻松拟合数据。如果 max_features 较小,那么随机森林中的树将会差异很大,为了很好地拟合数据,每棵树的深度都要很大。
随机森林的生成算法
1.从样本集中通过重采样的方式产生n个样本
2.假设样本特征数目为a,对n个样本选择a中的k个特征,用建立决策树的方式获得最佳分割点
3.重复m次,产生m棵决策树
4.多数投票机制来进行预测
(需要注意的一点是,这里m是指循环的次数,n是指样本的数目,n个样本构成训练的样本集,而m次循环中又会产生m个这样的样本集)
随机森林的随机性
集合中的每一棵树都是从训练集替换出来的样本中构建的。在树构建期间分割节点时,所选择的分割不再是所有特征之间最好的分割。相反,被选中的分割是特征的随机子集之间最好的分割。由于随机性,森林的偏向通常略有增加。但是,由于平均值,它的方差也减小,从而产生一个整体更好的模型
随机森林的优势
随机森林算法几乎不需要输入的准备。它们不需要测算就能够处理二分特征、分类特征、数值特征的数据。随机森林算法能完成隐含特征的选择,并且提供一个很好的特征重要度的选择指标。
随机森林算法训练速度快。性能优化过程刚好又提高了模型的准确性
通用性:随机森林可以应用于很多类别的模型任务。它们可以很好的处理回归问题,也能对分类问题应付自如(甚至可以产生合适的标准概率值),它们还可以用于聚类分析问题。
简洁性:对于随机森林来说,如果不是结论模型很简洁,就是学习算法本身很简洁。基本的随机森林学习算法仅用几行代码就可以写出来了。
1. 由于采用了集成算法,本身精度比大多数单个算法要好,所以准确性高。
2. 在测试集上表现良好,由于两个随机性的引入,使得随机森林不容易陷入过拟合(样本随机,特征随机)。
3. 在工业上,由于两个随机性的引入,使得随机森林具有一定的抗噪声能力,对比其他算法具有一定优势。
4. 由于树的组合,使得随机森林可以处理非线性数据,本身属于非线性分类(拟合)模型。
5. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化。
6. 训练速度快,可以运用在大规模数据集上。
7. 可以处理缺省值(单独作为一类),不用额外处理。
8. 由于有袋外数据(OOB),可以在模型生成过程中取得真实误差的无偏估计,且不损失训练数据量。
9. 在训练过程中,能够检测到feature间的互相影响,且可以得出feature的重要性,具有一定参考意义。(可以做特征筛选)用于其他模型的输入
10. 由于每棵树可以独立、同时生成,容易做成并行化方法。
11. 由于实现简单、精度高、抗过拟合能力强,当面对非线性数据时,适于作为基准模型。
随机森林的参数详解
随机森林主要的参数有n_estimators(子树的数量)、max_depth(树的最大生长深度)、min_samples_leaf(叶子的最小样本数量)、min_samples_split(分支节点的最小样本数量)、max_features(最大选择特征数)。它们对随机森林模型复杂度的影响如下图所示:
可以看到,n_estimators是影响程度最大的参数,下面我们会对上面的参数自定义调优,前面我们都知道有一个很强大的模块就是网格调参,但是在实际的调优中,一般不直接一上手就暴力搜索,可以测试一下参数迭代和探索学习曲线,最终确定参数的最优
随机森林模型提高方法
1.特征选择
1)输入特征按照其重要性从高到底排序,其中特征重要性排序可以根据与输出变量的皮尔森相关系数或者由支持向量机模型得出;(有时候不适用)
2)去除与输出变量相关性很小的特征;(有时候不适用)
3)在原有特征的基础上,添加新的特征,新特征可以是原有特征集的组合或划分,例如将year按season划分,将weekend和holiday组合为restday(见具体情况)
在随机森林中,特征选取除非是那种特别不相关的变量,需要筛选出去,一般只要有先验知识,觉得这些变量都是有点意思的,那么最好不要删除,因为在随机森林的内部算法里面,可能一环扣一环,删除之后反而对模型的效果有所影响。
2.参数优化(最佳的选择)
以python的sklearn.ensemble.RandomForestRegressor库为例,主要需要调节的参数为:
1)n_estimators:表示树的数量,通常随着树的数量的增加,test error会逐渐减小,当到达一定数目时,test error的变化变得很小,继续增大则test error反而会变大,出现过拟合现象,这时候就可以确定较为合理的树的数量;n_estimators的选择可通过GridSearchCV得到最优test error对应的树的数量,也可以通过学习曲线得出,再去不断寻找
2)max_features:表示基决策树的每个节点随机选择的最大特征数,传统决策树模型在选择特征时考虑所有可能的特征,而它降低了单个树的多样性,而由于随机森林基于集成学习思想的优点,减小max_features不仅会提升算法速度,也有可能降低测试误差,这也是RF模型在Bagging集成学习方法基础上的一个改进;对max_features的选择是逐一尝试,直到找到比较理想的值
最大特征数(max_features)
Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。
sqrt :此选项是每颗子树可以利用总特征数的平方根个。
例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个;“log2”是另一种相似类型的选项。
0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。
max_features如何影响性能和速度?
增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。
然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。
子树的数量(n_estimators)最重要的
在利用最大投票数或平均值来预测之前,你想要建立子树的数量。 较多的子树可以让模型有更好的性能,但同时让你的代码变慢。 你应该选择尽可能高的值,只要你的处理器能够承受的住,因为这使你的预测更好更稳定。
最大深度(max_depth)
默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。(int表示深度,None表示树会生长到所有叶子都分到一个类,或者某节点所代表的样本已小于min_samples_split)
内部节点再划分所需最小样本数(min_samples_split)
这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。(int表示样本数,2表示默认值)
叶子节点最少样本数(min_samples_leaf)
这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
叶子节点最小的样本权重(min_weight_fraction_leaf)
这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
最大叶子节点数(max_leaf_nodes)
通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
节点划分最小不纯度(min_impurity_split)
这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
用于拟合和预测的并行运行的工作数量(n_jobs)
一般取整数,可选的(默认值为1),如果为-1,那么工作数量被设置为核的数量,机器上所有的核都会被使用(跟CPU核数一致)。如果n_jobs=k,则计算被划分为k个job,并运行在K核上。注意,由于进程间通信的开销,加速效果并不会是线性的(job数K不会提示K倍)通过构建大量的树,比起单颗树所需要的时间,性能也能得到很大的提升
随机数生成器(random_state)
随机数生成器使用的种子,如果是RandomState实例,则random_stats就是随机数生成器;如果为None,则随机数生成器是np.random使用的RandomState实例。
上面决策树参数中最重要的包括子树的数量n_estimators,最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf