【机器学习】(九)决策树集成:随机森林、梯度提升回归树

集成是合并多个学习模型来构建更强大模型的方法。

随机森林

随机森林是解决决策树经常对训练数据过拟合的一种方法,是许多决策树的集合,每棵树和其他树略有不同,对这些树的结果取平均值。

在two-moons数据集应用RandomForestClassifier

树的个数(n_eastimators参数决定)->对每棵树:自取采样(随机抽取与原数据集元素相同个数但是内容有重复的数据集)->对每次测试只选择其中一边继续测试(深度由max_features参数决定)
为了每棵树差异不会过大,更好拟合,每棵树的深度要很大。

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons

# two_moons数据集
x, y = make_moons(n_samples=100,  noise=0.25, random_state=3)
x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, random_state=42)

# 构造森林
forest = RandomForestClassifier(n_estimators=5, random_state=2).fit(x_train, y_train)

# 可视化
fig, axes = plt.subplots(2, 3, figsize=(20, 10))
for i, (ax, tree) in enumerate(zip(axes.ravel(), forest.estimators_)):
    ax.set_title("Tree {}".format(i))
    mglearn.plots.plot_tree_partition(x_train, y_train, tree, ax=ax)

# 最后一个画布axes[-1,-1]
mglearn.plots.plot_2d_separator(forest, x_train, fill=True, ax=axes[-1,-1], alpha=.4) # 分界线
axes[-1,-1].set_title('Random Forest')
mglearn.discrete_scatter(x_train[:, 0], x_train[:, 1], y_train)

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。
ravel() 函数实现将多维数组降位一维。ravel(散开,解开)
estimators_属性 :在RandomForestClassifier中,指的是决策树分类器的集合。

RandomForestClassifier参数

在这里插入图片描述

参数

  • n_jobs参数:调节使用的内核个数。在大型数据集上都贱随机森林可能会比较费时,可以使用多个CPU内核加快处理。
  • random_state参数:控制随机状态。随机森林本质是随机的,可以设置不同的随机状态(或者不设置)可以彻底改变模型结构。
  • 预剪枝选项(max_depth)
  • n_estimators参数:指定决策树的个数。在内存允许的情况下尽量多,可以起到降低过拟合得到鲁棒性更好的集成。
  • max_features参数:决定每棵树随机性大小。较小可以降低过拟合。一般使用默认值:分类max_features=sqrt(n_features),回归max_features=m_features

对random_state参数的理解

梯度提升回归树(梯度提升机)

可以用在分类和回归。
梯度提升是合并许多简单的模型(弱学习器:深度较小的树),添加的树越来越多,可以不断迭代提高性能。

在cancer数据集应用GradientBoostingClassifier

from sklearn.ensemble import GradientBoostingClassifier
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, stratify=cancer.target, random_state=0)

# 构造分类器
gbrt = GradientBoostingClassifier(random_state=0).fit(x_train, y_train)

print(gbrt.score(x_train, y_train)) # 1.0
print(gbrt.score(x_test, y_test)) # 0.958041958041958

# 降低学习率来加强预剪枝
gbrt2 = GradientBoostingClassifier(random_state=0, learning_rate=0.01).fit(x_train, y_train)

print(gbrt2.score(x_train, y_train)) # 0.9953051643192489
print(gbrt2.score(x_test, y_test)) # 0.9440559440559441

learning_rate参数:学习率。学习率越低就需要越多的树来构建具有相似复杂度的模型,

参数

与随机森林比,模型对参数设置更为敏感,参数设置正确模型精度更高。

  • 除了预剪枝与集成中树的数量以外,还有learning_rate参数:学习率,用于控制每棵树纠正前一棵树错误的强度。可以通过增大n_estimators来向集成中添加更多树。这两个参数高度相关。通常根据时间和内存选择合适的n_estimators,然后对不同的learning_rate进行遍历。
  • max_depth(一般不超过5)/max_leaf_nodes用以降低每棵树的复杂度

优缺点

优:不需要对数据进行缩放就可以表现很好;适用于二元特征与连续特征同时存在的数据。
缺:需要仔细调参;训练时间可能比较长;不适用于高维稀疏矩阵。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值