编者按:在上一篇中,我们介绍了 决策树的基础知识 ,并用一些实例和计算演示了决策树的构建、分裂和剪枝。现在,有了 "一棵树",我们就能种植一片 "森林",并用分类组合的方法,从中挑选出表现最佳的树。
"从零学习" 系列第 4 篇 "详解基于树形结构的 ML 建模(R & Python)——随机森林篇",来自知名印度数据科学网站 Analytics Vidhya 的内容团队。
和其他模型一样,树形结构模型也会受 bias 和方差影响。bias 指的是理论预测值与实际值的平均偏差,而方差指的是当模型的输入是来自同一群体的不同样本,它预测的结果会有多大的不同。
如果你构建了一棵决策树,你就会得到一个低方差、高 bias 的模型,那么,该怎么平衡这两者之间的关系呢?通常情况下,随着模型变得越来越复杂,模型 bias 会越小,预测值误差也越小。这时如果你进一步提升它的复杂度,那么你最终会获得一个高方差的过拟合模型。
因此,最好的做法是在 bias 和方差间保持平衡,也就是 bias-variance trade-off(偏差—方差权衡)。集成学习正式执行这种折衷分析的一个常用的方法。
之前提到了,集成学习的主要思路是将若干个个体学习器组成起来。在实际操作中,它们可以是一类的,也可以是不同的,但前者应用更广泛。CART 决策树是集成学习最长使用的模型之一,由于本文介绍的是基于树形结构的模型,因此后文涉及的都是以树形模型为代表的同质个体学习器的集成学习方法,它们包括 Bagging、Boosting。
请注意,这里的学习器数量并不是一个超参数。虽然很多情况下模型数量越多越好,但是这样做也会带来更多相似的、性能较低的预测。从 Bagging 的理论推理中我们可以发现,在一些问题中,Bagging 得出的新预测的方差往往是原方差的 1/n(n 为分类器数量)。
Bagging 模型有多种实现,其中随机森林就是它的一个进阶版。
在随机森林中,我们不再只构建一个 CART 模型,而是要 "种植" 多棵树。对于分类问题,每棵决策树都会给出一个预测分类,这相当于给那个类别 "投票",最后森林会选择 "票数" 最多的那个分类;而对于回归问题,我们一般取所有树预测值的平均值。
它的构建步骤如下:
随机森林主要有 6 大优势:
随机森林在 Python 和 R 语言中都有现成的工具。
- #导入Libraryfrom sklearn.ensemble import RandomForestClassifier#用随机森林解决回归问题#假设你有一个关于训练集的预测模型X和目标值y,以及一个测试集的预测模型x_test#创建随机森林对象model = RandomForestClassifier(n_estimators = 1000)#用训练集训练模型并验证得分model.fit(X, y)#预测输出predicted = model.predict(x_test)
- > library(randomForest) > x < -cbind(x_train, y_train)#Fitting model > fit < -randomForest(Species~., x, ntree = 500) > summary(fit)#Predict Output > predicted = predict(fit, x_test)
- 1.初始化结果2.从1到1的树总数2.1根据以前的运行更新目标的权重(错误分类的权重更高)2.2在选定的数据子样本上拟合模型2.3对全套观察数据进行预测2.4依据学习率,用当前结果更新输出3.返回最终输出。
- > library(caret) > fitControl < -trainControl(method = "cv", number = 10, #5folds) > 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