猿创征文|机器学习实战(8)——随机森林

本文深入探讨了机器学习中的随机森林和提升法。介绍了随机森林的原理,包括如何通过RandomForestClassifier训练模型,以及特征重要性的计算。接着讲解了极端随机树的概念。在提升法部分,阐述了AdaBoost的工作机制,并通过实例展示了梯度提升回归树的训练过程及其优势。最后讨论了学习率对模型性能的影响。
摘要由CSDN通过智能技术生成

目录

1 随机森林

2 极端随机树

3 特征重要性

4 提升法

4.1 AdaBoost

4.2 梯度提升


机器学习实战(7)中我们已经提到,随机森林是决策树的集成,通常用bagging方法训练,训练集大小通过max_samples来设置。除了先构建一个 BaggingClassifier 然后将结果传输到 DecisionTreeClassifier ,还有一种方法就是使用 RandomForestClassifier 类(对于回归任务有RandomForestRegressor类),这种方法更方便。

1 随机森林

常规模块的导入以及图像可视化的设置:(注意,本节是基于第7节集成学习的代码继续往下演示的

# Common imports
import numpy as np
import os
 
# to make this notebook's output stable across runs
np.random.seed(42)
 
# To plot pretty figures
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)

以下代码训练一个拥有500棵树的随机森林分类器(其中每棵树限制为最多16个叶节点):

from sklearn.ensemble import RandomForestClassifier

rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
rnd_clf.fit(X_train, y_train)

y_pred_rf = rnd_clf.predict(X_test)

np.sum(y_pred == y_pred_rf) / len(y_pred)  # almost identical predictions

运行结果如下:

0.936

除了少数例外(没有splitter(强制为random),没有presort(强制为False),没有max_samples(强制为1.0),没有base_estimator(强制为DecisionTreeClassifier)),RandomForestClassifier 具有 DecisionTreeClassifier 和 BaggingClassifier 的所有超参数,前者用来控制树的生长,后者用来控制集成本身。

用 BaggingClassifier 实现与上述代码效果相同的效果:

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
    n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)

bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)

from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)

运行结果如下:

0.92

2 极端随机树

随机森林里单棵树的生长过程中,每个节点在分裂时仅考虑到一个随机子集所包含的特征。如果我们对每个特征使用随机阈值,而不是搜索得出的最佳阈值,则可能让决策树生产得更随机。这种极端随机的决策树组成的森林被称为极端随机树。同样,它也是以更高的偏差换取了更低的方差。

我们使用Scikit-Learn的 ExtraTreeClassifier 可以创建一个极端随机树分类器。

我们很难预先知道一个 RandomForestClassifier 是否比一个 ExtraTreeClassifier 更好或是更差,只有两种都尝试一遍,然后使用交叉验证进行比较。

3 特征重要性

我们查看单个决策树会发现,重要的特征更可能出现在靠近根节点的位置,而不重要的特征通常出现在靠近叶节点的位置。因此,通过计算一个特征在森林中所有树上的平均深度,就可以估算出一个特征的重要程度。Scikit-Learn 在训练结束后自动计算每个特征的重要性。

例如下列代码:

from sklearn.datasets import load_iris
iris = load_iris()
rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42)
rnd_clf.fit(iris["data"], iris["target"])
for name, score in zip(iris["feature_names"], rnd_clf.feature_importances_):
    print(name, score)

运行结果如下:

sepal length (cm) 0.11249225099876375
sepal width (cm) 0.02311928828251033
petal length (cm) 0.4410304643639577
petal width (cm) 0.4233579963547682
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值