决策树集成
集成(ensemble)是合并多个机器学习模型来构建更强大模型的方法。
已证明有两种集成模型对大量分类和回归的数据集都是有效的,二者都以决策树为基础,分别是随机森林(random forest)和梯度提升决策树(gradient boosted decision tree)。
1、随机森林
决策树的一个主要缺点在于经常对训练数据过拟合。随机森林是解决这个问题的一种方法。
-
随机森林本质上是许多决策树的集合,其中每棵树都和其他树略有不同。
-
随机森林背后的思想是:每棵树的预测可能都相对较好,但可能对部分数据过拟合。
- 如果构造很多树,并且每棵树的预测都很好,但都以不同的方式过拟合,那么我们可以对这些树的结果取平均值来降低过拟合。
- 既能减少过拟合又能保持树的预测能力。
1)构造随机森林
随机森林中树的随机化方法有两种:
-
一种是通过选择用于构造树的数据点
- (自助采样,创建一个与原数据集大小相同的数据集)
-
一种是通过选择每次划分测试的特征
- (每个节点处,随机选择特征的一个子集,并对其中一个特征寻找最佳测试)
👍在这个过程中的一个关键参数是 max_features ,即每个节点考虑的特征子集的大小
- 如果max_features太大,随机森林的树将会十分相似
- max_features太小,则划分时无法很好地选择最佳测试
利用随机森林进行预测
-
对于回归问题,我们可以对这些结果取平均值作为最终预测
-
对于分类问题,则用到了“软投票”(soft voting)策略,
- 也就是说,每个算法做出“软”预测,给出每个可能的输出标签的概率。对所有树的预测概率取平均值,然后将概率最大的类别作为预测结果
-
在sklearn.ensemble.RandomForestClassifier模块中实现
from sklearn.datasets import load_breast_cancer from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split cancer = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0) forest = RandomForestClassifier(n_estimators=100, random_state=0) forest.fit(X_train, y_train) print("Accuracy on training set: {:.3f}".format(forest.score(X_train, y_train))) print("Accuracy on test set: {:.3f}".format(forest.score(X_test, y_test)))
-
输出
Accuracy on training set: 1.000 Accuracy on test set: 0.972
📣在没有调节任何参数的情况下,随机森林的精度为 97%,比线性模型或单棵决策树都要好。
- 我们可以调节 max_features 参数,或者像单棵决策树那样进行预剪枝。
- 但是,随机森林的默认参数通常就已经可以给出很好的结果。
2)优点缺点和参数
-
通常不需要反复调节参数就可以给出很好的结果,也不需要对数据进行缩放
-
对于维度非常高的稀疏数据(比如文本数据),随机森林的表现往往不是很好。对于这种数据,使用线性模型可能更合适。
-
max_features 决定每棵树的随机性大小,较小的 max_features 可以降低过拟合。
- 一般来说,好的经验就是使用默认值:
- 对于分类,默认值是 max_features=sqrt(n_features)
- 对于回归,默认值是 max_features=n_features 。
- 一般来说,好的经验就是使用默认值:
-
森林中的树越多(n_estimateors越大),它对随机状态选择的鲁棒性就越好。如果希望结果可以重现,固定 random_state 是很重要的。
- n_estimateors越大越好
-
增大 max_features 或 max_leaf_nodes 有时也可以提高性能。它还可以大大降低用于训练和预测的时间和空间要求。
2、梯度提升回归树(梯度提升机)
梯度提升回归树是另一种集成方法,通过合并多个决策树来构建一个更为强大的模型。
- 虽然名字中含有“回归”,但这个模型既可以用于回归也可以用于分类。
- 与随机森林方法不同,梯度提升采用连续的方式构造树,每棵树都试图纠正前一棵树的错误。
- 默认情况下,梯度提升回归树中没有随机化,而是用到了强预剪枝。
- 梯度提升树通常使用深度很小(1 到 5 之间)的树,这样模型占用的内存更少,预测速度也更快。
1)构造梯度提升回归树
梯度提升树对参数设置敏感
梯度提升的一个重要参数是 learning_rate (学习率),用于控制每棵树纠正前一棵树的错误的强度。
-
较高的学习率意味着每棵树都可以做出较强的修正,这样模型更为复杂。
-
通过增大 n_estimators 来向集成中添加更多树,也可以增加模型复杂度,因为模型有更多机会纠正训练集上的错误。
-
sklearn.ensemble.GrandientBoostingClassifier上实现
from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import train_test_split from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0) gbrt = GradientBoostingClassifier(random_state=0) gbrt.fit(X_train, y_train) print("Accuracy on training set: {:.3f}".format(gbrt.score(X_train, y_train))) print("Accuracy on test set: {:.3f}".format(gbrt.score(X_test, y_test)))
-
输出
Accuracy on training set: 1.000 Accuracy on test set: 0.965
📣
为了降低过拟合,我们可以限制最大深度来加强预剪枝,也可以降低学习率
👍注意:
- 由于梯度提升和随机森林两种方法在类似的数据上表现得都很好,因此一种常用的方法就是先尝试随机森林,它的鲁棒性很好。
- 如果随机森林效果很好,但预测时间太长,或者机器学习模型精度小数点后第二位的提高也很重要,那么切换成梯度提升通常会有用。
2)优点缺点和参数
优点:
- 梯度提升决策树是监督学习中最强大也最常用的模型之一。
- 与其他基于树的模型类似,这一算法不需要对数据进行缩放就可以表现得很好,而且也适用于二元特征与连续特征同时存在的数据集。
缺点:
- 需要仔细调参,而且训练时间可能会比较长
- 不适用于高维稀疏数据。(训练时间慢,特征选择会浪费大量的有效特征)
参数:
- 包括树的数量 n_estimators 和学习率 learning_rate
- learning_rate 用于控制每棵树对前一棵树的错误的纠正强度。
- 这两个参数高度相关,因为 learning_rate 越低,就需要更多的树来构建具有相似复杂度的模型。
- 另一个重要参数是 max_depth (或 max_leaf_nodes ),用于降低每棵树的复杂度。梯度提升模型的 max_depth 通常都设置得很小,一般不超过 5。
👍
随机森林的 n_estimators 值总是越大越好,但梯度提升不同,
- 增大 n_estimators 会导致模型更加复杂,进而可能导致过拟合。
- 通常的做法是根据时间和内存的预算选择合适的 n_estimators ,然后对不同的learning_rate 进行遍历;
3、参考文献
《Python机器学习基础教程》P64-P71