从零学习:详解基于树形结构的 ML 建模(R & Python)——随机森林篇
编译:Bot 编者按:在上一篇中,我们介绍了决策树的基础知识,并用一些实例和计算演示了决策树的构建、分裂和剪枝。现在,有了 "一棵树",我们就能种植一片 "森林",并用分类组合的方法,从中挑选出表现最佳的树。
"从零学习" 系列第 4 篇 "详解基于树形结构的 ML 建模(R & Python)——随机森林篇",来自知名印度数据科学网站 Analytics Vidhya 的内容团队。目录 树形模型的集成方法
什么是 Bagging
什么是随机森林
什么是 Boosting
GBM VS XGboost
用 R 和 Python 使用 GBM
习题(回归、分类)注:XGboost 的实现由于篇幅过长,将单独放在番外篇中介绍。树形模型的集成方法
集成学习(ensemble learning)是一种非常热门的学习方法,通过训练一些弱学习器并把它们组成起来,我们可以获得一个在精度和稳定性上都有大幅提升的强学习器。"集成" 作为一个词,它本身就包含 "组" 的含义,它也可以被用在基于树形结构的模型上。
和其他模型一样,树形结构模型也会受 bias 和方差影响。bias 指的是理论预测值与实际值的平均偏差,而方差指的是当模型的输入是来自同一群体的不同样本,它预测的结果会有多大的不同。
如果你构建了一棵决策树,你就会得到一个低方差、高 bias 的模型,那么,该怎么平衡这两者之间的关系呢?通常情况下,随着模型变得越来越复杂,模型 bias 会越小,预测值误差也越小。这时如果你进一步提升它的复杂度,那么你最终会获得一个高方差的过拟合模型。
因此,最好的做法是在 bias 和方差间保持平衡,也就是 bias-variance trade-off(偏差—方差权衡)。集成学习正式执行这种折衷分析的一个常用的方法。
之前提到了,集成学习的主要思路是将若干个个体学习器组成起来。在实际操作中,它们可以是一类的,也可以是不同的,但前者应用更广泛。CART 决策树是集成学习最长使用的模型之一,由于本文介绍的是基于树形结构的模型,因此后文涉及的都是以树形模型为代表的同质个体学习器的集成学习方法,它们包括 Bagging、Boosting。什么是 Bagging
Bagging 是一种降低方差的方法,它先将原数据集分为几个子数据集,之后分别在上面独立并行训练弱学习器,这些学习器通过集合策略进行重组,最后导出一个强学习器。具体流程如下图所示:
step 1:在原训练集 D 的基础上创建多个子数据集 D1、D2……Dt-1、Dt这里的采样是有放回的,子数据集从训练集中采取样本后,这些样本会被放回训练集中参与下一轮采样,因此我们有可能会得到多个相同的子数据集;
这些新的子数据集可能有一些关于行和列的分数,它们通常是 Bagging 模型中的超参数;
如果行列分数小于 1,它们将有助于建立一个不太会过拟合的强学习器。step 2:构建多个学习器(分类器)一个子数据集对应一个学习器;
通常,这些学习器都使用同一模型。step 3:组合分类器根据具体问题,用平均值、中位数或众数组合各个学习器的预测;
组合得出的值通常比任何学习器的预测都靠谱。
请注意,这里的学习器数量并不是一个超参数。虽然很多情况下模型数量越多越好,但是这样做也会带来更多相似的、性能较低的预测。从 Bagging 的理论推理中我们可以发现,在一些问题中,Bagging 得出的新预测的方差往往是原方差的 1/n(n 为分类器数量)。
Bagging 模型有多种实现,其中随机森林就是它的一个进阶版。什么是随机森林
随机森林称得上是所有数据科学问题的灵丹妙药,当你对如何解决(任何)问题一头雾水时,选择随机森林总是没错的。这是一种功能全面的算法,它不仅能解决分类、回归问题,还能通过降维处理缺失值、异常值,能满足数据科学所需的几乎所有基础操作,而且表现出色。随机森林的原理
在随机森林中,我们不再只构建一个 CART 模型,而是要 "种植" 多棵树。对于分类问题,每棵决策树都会给出一个预测分类,这相当于给那个类别 "投票",最后森林会选择 "票数" 最多的那个分类;而对于回归问题,我们一般取所有树预测值的平均值。
它的构建步骤如下:设输入样本为 N 个,从训练集中有放回地随机抽取 N 个子数据集;
如果存在 M 个特征变量,则选取 m≤M,以 m 中的最佳分裂作为分裂节点,对采样之后的数据构建决策树;
每棵决策树都必须是完全分裂的,不能剪枝(随机采样,不会过拟合);
组合决策树预测,得出新数据。
随机森林的优点
随机森林主要有 6 大优势:能同时解决分类、回归两类问题,并给出高质量的预测;
能处理高维的大数据。随机森林能从上千个特征中筛选出最重要的特征,并以此降维(随机挑选,无需特征选择)。在某些随机数据集上,这种依赖变量的模型十分适用;
提供了一种有效的方法来计算丢失数据,并能保证其中大部分计算的准确性;
能处理不平衡数据集,平衡其中的误差;
上述的这些功能能扩展到无标签数据上,可以实现无监督聚类、制作数据视图及异常值检测;
随机森林的采样方法被称为自助采样法(Bootstap sampling),它无需测试集。现在,如果我们将 1/N 的数据作为测试集,那它们就是袋外样本(out of bag samples),它们包含的误差被称为袋外误差(out of bag error)。通过研究袋外样本的误差我们可以发现,如果测试集的大小和训练集一样,那它们得出的预测值也是一样的。所以,使用这种采样方法不用另行安排测试集。
随机森林的缺点比起分类问题,随机森林在回归问题上的表现更为突出。但是由于回归问题是连续预测,算法不会超出训练数据的范围,因此模型会在噪声数据上出现过拟合的现象;
对于开发者,随机森林更像是一种黑盒方法,因为它的作用是不可控的。Python&R 的实现
随机森林在 Python 和 R 语言中都有现成的工具。Python #导入Libraryfrom sklearn.ensemble import RandomForestClassifier#用随机森林解决回归问题#假设你有一个关于训练集的预测模型X和目标值y,以及一个测试集的预测模型x_test#创建随机森林对象model = RandomForestClassifier(n_estimators = 1000)#用训练集训练模型并验证得分model.fit(X, y)#预测输出predicted = model.predict(x_test) R 语言 >library(randomForest)>xfitsummary(fit)#PredictOutput>predicted=predict(fit,x_test) 什么是 Boosting
Boosting 是将弱学习器转化为强学习器的一种算法。
1.初始化结果2.从1到1的树总数2.1根据以前的运行更新目标的权重(错误分类的权重更高)2.2在选定的数据子样本上拟合模型2.3对全套观察数据进行预测2.4依据学习率,用当前结果更新输出3.返回最终输出。>library(caret)>fitControl tune_Grid < - expand.grid(interaction.depth = 2, n.trees = 500, shrinkage = 0.1, n.minobsinnode = 10) > set.seed(825) > fit < -train(y_train~., data = train, method = "gbm", trControl = fitControl, verbose = FALSE, tuneGrid = gbmGrid) > predicted = predict(fit, test, type = "prob")[, 2]#导入librariesfrom sklearn.ensemble import GradientBoostingClassifier#分类问题from sklearn.ensemble import GradientBoostingRegressor#回归问题#使用GBM算法clf = GradientBoostingClassifier(n_estimators = 100, learning_rate = 1.0, max_depth = 1) clf.fit(X_train, y_train)
来源: https://juejin.im/entry/5a53408f518825733a308d3b