决策树集成

集成(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

posted @ 2022-04-21 20:36  朝南烟  阅读(208)  评论(0编辑  收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }