目录 |
1. 基础知识 |
1.1 何为集成学习 |
面对一个机器学习问题, 通常有两种策略。 一种是研发人员尝试各种模型,选择其中表现最好的模型做重点调参优化。 这种策略类似于奥运会比赛, 通过强强竞争来选拔最优的运动员, 并逐步提高成绩。 另一种重要的策略是集各家之长, 如同贤明的君主广泛地听取众多谋臣的建议, 然后综合考虑, 得到最终决策。 后一种策略的核心, 是将多个分类器的结果统一成一个最终的决策。 使用这类策略的机器学习方法统称为集成学习。 其中的每个单独的分类器称为基分类器
1.2 集成学习一般流程 |
集成学习一般可分为以下3个步骤。
(1) 找到误差互相独立的基分类器。
(2) 训练基分类器。
(3) 合并基分类器的结果。
合并基分类器的方法有voting和stacking两种。 前者是用投票的方式, 将获得最多选票的结果作为最终的结果。 后者是用串行的方式, 把前一个基分类器的结果输出到下一个分类器, 将所有基分类器的输出结果相加(或者用更复杂的算法融合, 比如把各基分类器的输出作为特征, 使用逻辑回归作为融合模型进行最后的结果预测) 作为最终的输出。
1.3 模型融合方法 |
- Boosting
Boosting方法训练基分类器时采用串行的方式, 各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加, 每一层在训练的时候, 对前一层基分类器分错的样本, 给予更高的权重。 测试时, 根据各层分类器的结果的加权得到最终结果。
Boosting的过程很类似于人类学习的过程,我们学习新知识的过程往往是迭代式的, 第一遍学习的时候, 我们会记住一部分知识, 但往往也会犯一些错误, 对于这些错误, 我们的印象会很深。 第二遍学习的时候, 就会针对犯过错误的知识加强学习, 以减少类似的错误发生。 不断循环往复, 直到犯错误的次数减少到很低的程度。
- Bagging
Bagging与Boosting的串行训练方式不同, Bagging方法在训练过程中, 各基分类器之间无强依赖, 可以进行并行训练。 其中很著名的算法之一是基于决策树基分类器的随机森林(Random Forest) 。 为了让基分类器之间互相独立, 将训练集分为若干子集(当训练样本数量较少时, 子集之间可能有交叠) 。 Bagging方法更像是一个集体决策的过程, 每个个体都进行单独学习, 学习的内容可以相同, 也可以不同, 也可以部分重叠。 但由于个体之间存在差异性, 最终做出的判断不会完全一致。 在最终做决策时, 每个个体单独作出判断, 再通过投票的方式做出最后的集体决策
- Boosting与Bagging解释
从消除基分类器的偏差和方差的角度来理解Boosting和Bagging方法的差异。 基分类器, 有时又被称为弱分类器, 因为基分类器的错误率要大于集成分类器。 基分类器的错误, 是偏差和方差两种错误之和。 偏差主要是由于分类器的表达能力有限导致的系统性错误, 表现在训练误差不收敛。 方差是由于分类器对于样本分布过于敏感, 导致在训练样本数较少时, 产生过拟合。
Boosting方法是通过逐步聚焦于基分类器分错的样本, 减小集成分类器的偏差。
Bagging方法则是采取分而治之的策略, 通过对训练样本多次采样, 并分别训练出多个不同模型, 然后做综合, 来减小集成分类器的方差。 假设所有基分类器出错的概率是独立的, 在某个测试样本上, 用简单多数投票方法来集成结果, 超过半数基分类器出错的概率会随着基分类器的数量增加而下降。
- Boosting与Bagging主要区别
样本选择上:Bagging采用的是Bootstrap随机有放回抽样;而Boosting每一轮的训练集是不变的,改变的只是每一个样本的权重。
样本权重:Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。
预测函数:Bagging所有的预测函数的权重相等;Boosting中误差越小的预测函数其权重越大。
并行计算:Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。
下面是将决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT
1.4 如何选择基分类器 |
最常用的基分类器是决策树, 主要有以下3个方面的原因。
(1) 决策树可以较为方便地将样本的权重整合到训练过程中, 而不需要使用过采样的方法来调整样本权重。
(2) 决策树的表达能力和泛化能力, 可以通过调节树的层数来做折中。
(3) 数据样本的扰动对于决策树的影响较大, 因此不同子样本集合生成的决策树基分类器随机性较大, 这样的“不稳定学习器”更适合作为基分类器。 此外,在决策树节点分裂的时候, 随机地选择一个特征子集, 从中找出最优分裂属性,很好地引入了随机性。
除了决策树外, 神经网络模型也适合作为基分类器, 主要由于神经网络模型也比较“不稳定”, 而且还可以通过调整神经元数量、 连接方式、 网络层数、 初始权值等方式引入随机性。
2. 随机森林简介 |
随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类、回归等问题。
随机森林有许多优点:
- 具有极高的准确率
- 随机性的引入,使得随机森林不容易过拟合
- 随机性的引入,使得随机森林有很好的抗噪声能力
- 能处理很高维度的数据,并且不用做特征选择
- 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
- 训练速度快,可以得到变量重要性排序
- 容易实现并行化
随机森林的缺点:
- 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
- 随机森林模型还有许多不好解释的地方,有点算个黑盒模型
随机森林的构建过程大致如下:
- 从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
- 对于n_tree个训练集,我们分别训练n_tree个决策树模型
- 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
- 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
- 将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果
3. 随机森林算法推导 |
3.1 信息、熵以及信息增益的概念 |
这三个基本概念是决策树的根本,是决策树利用特征来分类时,确定特征选取顺序的依据。理解了它们,决策树你也就了解了大概。
引用香农的话来说,信息是用来消除随机不确定性的东西。当然这句话虽然经典,但是还是很难去搞明白这种东西到底是个什么样,可能在不同的地方来说,指的东西又不一样。对于机器学习中的决策树而言,如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息可以定义如下:
I(x)用来表示随机变量的信息,p(xi)指是当xi发生时的概率。
熵是用来度量不确定性的,当熵越大,X=xi的不确定性越大,反之越小。对于机器学习中的分类问题而言,熵越大即这个类别的不确定性更大,反之越小。
信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好。
3.2 bootstrap 重抽样 |
bootstrapping 就是一种用来产生数据随机性的统计工具。对同一份数据集,进行不同的重采样(re-sample)以模拟不同的数据集出来,避免了 cross-validation 中数据量的减少。
3.3 算法说明 |
4. 随机森林算法分析 |
随机森林分类效果(错误率)与两个因素有关:
森林中任意两棵树的相关性:相关性越大,错误率越大;
森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。
5. 随机森林算法sklearn实现 |
- 1.分类问题
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
clf = RandomForestClassifier(n_estimators=100)
scores = cross_val_score(clf,iris.data,iris.target)
scores.mean()
- 2.回归问题
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
boston = load_boston()
rgm = RandomForestRegressor(n_estimators=100)
scores = cross_val_score(rgm,boston.data,boston.target)
scores.mean()
6. 随机森林算法参数调优 |
- 1 框架参数:
- n_estimators : 指定随机森林中的分类器的个数,默认为10。一般来说n_estimators 太小容易欠拟合,太大计算量大,故需要参数调优选择一个适中的数值;
- oob_score: 是否采用袋外误差来评估模型,默认为 False;
- criterion :及CART树划分对特征的评价标准,默认我基尼指数,还可以选择信息增益;
- 2 决策树参数
- max_features :建立决策树时选择的最大特征数目(从原始特征中选取多少特征进行建立决策树),默认为auto,意味着考虑sqrt(n_features)个特征;还可以为整数,即直接指定数目;浮点数,即指定百分比;sqrt与auto相同;log2即指定log2(n_features);如果是None,则为最大特征数n_features;
- max_depth :决策树的最大深度,默认是不进行限制的,如果是模型样本量多,特征也多的情况,推荐限制修改这个,常用的可以取值为10-100之间;
- min_samples_split :限制子树继续划分的条件,如果某节点的样本数目小于此值,则不会再继续划分,默认为2,样本量非常大的时候,应该增大这个值;
- min_samples_leaf :叶子节点的最小样本数目,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,默认为1,数据量大的时候可以增大这个值;
- min_weight_fraction_leaf :叶子节点最小样本权重,这个值限制了叶子节点所有样本权重和最小值,如果小于最小值,则会和兄弟节点被剪枝。默认为0,就是不考虑权重。通常来说,若样本中存在较多的缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时就需要考虑这个值了。
- max_leaf_nodes :最大叶子节点数,通过限制最大叶子节点数目来防止过拟合,默认为None,即 不进行限制,如果特征分成很多可以加以限制;
- min_impurity_split :节点划分最小不纯度,这个值限制了决策树的增长,如果某节点的不纯度小于这个阈值,则该节点不在生成子节点,即为叶子节点,一般不推荐改动,默认值为1e-7;
- min_impurity_decrease :若一个节点被分割,如果这个分割导致大于或等于该值。默认为0;
- bootstrap :构建树时是否使用bootstrap采样,默认为True;
- n_jobs :设置程序的并行作业数量,默认为1,如果为-1,则作业数目为核心数;
- random_state :随机数的设置;
- verbose :控制构建树过程中的详细程度。
7. 参考资料 |
白面机器学习
http://blog.csdn.net/a819825294 https://blog.csdn.net/a819825294/article/details/51177435