《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-学习笔记(7):集成学习和随机森林

本文介绍了集成学习,如投票分类器、Bagging、随机森林、Boosting(如AdaBoost和GBDT)和Stacking,展示了如何通过组合多个弱学习器增强模型性能。重点讲解了随机森林的原理和特征重要性评估,以及如何在实践中应用这些方法提高机器学习模型的准确性。
摘要由CSDN通过智能技术生成

· Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélien Géron (O’Reilly). Copyright 2019 Aurélien Géron, 978-1-492-03264-9.
· 《机器学习》周志华
· 环境:Anaconda(Python 3.8) + Pycharm
· 学习时间:2022.05.05~2022.05.05

第七章 集成学习和随机森林

如果你随机向几千个人询问一个复杂问题,然后汇总他们的回答。在许多情况下,你会发现,这个汇总的回答比专家的回答还要好,这被称为群体智慧。同样,如果你聚合一组预测器(比如分类器或回归器)的预测,得到的预测结果也比最好的单个预测器要好。这样的一组预测器称为集成,所以这种技术也被称为集成学习,而一个集成学习算法则被称为集成方法。

集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system))、基于委员会的学习(committee-based learning)等。

弱学习器(weak learner)常指泛化性能略优于随机猜测的学习器。集成学习的很多理论研究都是针对弱学习器进行的,而基学习器有时也被直接称为弱学习器。

例如,你可以训练一组决策树分类器,每一棵树都基于训练集不同的随机子集进行训练。做出预测时,你只需要获得所有树各自的预测,然后给出得票最多的类别作为预测结果(见第6章练习题8)。这样一组决策树的集成被称为随机森林,尽管很简单,但它是迄今可用的最强大的机器学习算法之一。

此外,正如我们在第2章讨论过的,在项目快要结束时,你可能已经构建好了一些不错的预测器,这时就可以通过集成方法将它们组合成一个更强的预测器。事实上,在机器学习竞赛中获胜的解决方案通常都涉及多种集成方法(最知名的是Nerflix大奖赛)。

集成学习的一般结构∶ 先产生一组"个体学习器"(individual learner),再用某种策略将它们结合起来、个体学习器通常由一个现有的学习算法从训练数据产生,例如 C4.5 决策树算法、BP神经网络算法等,此时集成中只包含同种类型的个体学习器、例如"决策树集成"中全是决策树,“神经网络集成"中全是神经网络,这样的集成是"同质"的(homogeneous)。同质集成中的个体学习器亦称"基学习器”(base learner),相应的学习算法称为"基学习算法"(base learning algorithm)。

集成也可包含不同类型的个体学习器,例如同时包含决策树和神经网络。这样的集成是"异质"的(heterogenous)。异质集成中的个体学习器由不同的学习算法生成,这时就不再有基学习算法;相应的,个体学习器一般不称为基学习器,常称为"组件学习器"(component learner)或直接称为个体学习器。

本章我们将探讨最流行的几种集成方法,包括bagging、boosting、stacking等,也将探索随机森林。

7.1 投票分类器VotingClassifier

假设你已经训练好了一些分类器,每个分类器的准确率约为80%。大概包括一个逻辑回归分类器、一个SVM分类器、一个随机森林分类器、一个K-近邻分类器,或许还有更多。这时,要创建出一个更好的分类器,最简单的办法就是聚合每个分类器的预测,然后将得票最多的结果作为预测类别。这种大多数投票分类器被称为硬投票分类器。

你会多少有点惊讶地发现,这个投票法分类器的准确率通常比集成中最好的分类器还要高。事实上,即使每个分类器都是弱学习器(意味着它仅比随机猜测好一点),通过集成依然可以实现一个强学习器(高准确率),只要有足够大数量并且足够多种类的弱学习器即可。

辅助理解:集成学习voting Classifier在sklearn中的实现

这怎么可能呢?下面这个类比可以帮助你掀开这层神秘面纱。假设你有一个略微偏倚的硬币,它有51%的可能正面数字朝上,49%的可能背面花朝上。如果你掷1000次,你大致会得到差不多510次数字和490次花,所以正面是大多数。而如果你做数学题,你会发现,“在1000次投掷后,大多数为正面朝上”的概率接近75%。投掷硬币的次数越多,这个概率越高(例如,投掷10 000次后,这个概率攀升至97%)。这是因为大数定理导致的:随着你不断投掷硬币,正面朝上的比例越来越接近于正面的概率(51%)。下图显示了10条偏倚硬币的投掷结果。可以看出随着投掷次数的增加,正面的比例逐渐接近51%,最终所有10条线全都接近51%,并且始终位于50%以上。

在这里插入图片描述

同样,假设你创建了一个包含1000个分类器的集成,每个分类器都只有51%的概率是正确的(几乎不比随机猜测强多少)。如果你以大多数投票的类别作为预测结果,可以期待的准确率高达75%。但是,这基于的前提是所有的分类器都是完全独立的,彼此的错误毫不相关。显然这是不可能的,因为它们都是在相同的数据上训练的,很可能会犯相同的错误,所以也会有很多次大多数投给了错误的类别,导致集成的准确率有所降低。

当预测器尽可能互相独立时,集成方法的效果最优。获得多种分类器的方法之一就是使用不同的算法进行训练。这会增加它们犯不同类型错误的机会,从而提升集成的准确率。

下面的代码用Scikit-Learn创建并训练一个投票分类器,由三种不同的分类器组成(训练集是卫星数据集,见第5章):

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moons

X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC()
voting_clf = VotingClassifier(
    estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
    voting='hard')
voting_clf.fit(X_train, y_train)

我们来看一下测试集上每个分类器的精度,投票分类器略胜于所有单个分类器:

from sklearn.metrics import accuracy_score

for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    
# 输出:
# LogisticRegression 0.864
# RandomForestClassifier 0.896
# SVC 0.896
# VotingClassifier 0.904

如果所有分类器都能够估算出类别的概率(即有predict_proba()方法),那么你可以将概率在所有单个分类器上平均,然后让Scikit-Learn给出平均概率最高的类别作为预测。这被称为软投票法。通常来说,它比硬投票法的表现更优,因为它给予那些高度自信的投票更高的权重。而所有你需要做的就是用voting="soft"代替voting=“hard”,并确保所有分类器都可以估算出概率。默认情况下,SVC类是不行的,所以你需要将其超参数probability设置为True(这会导致SVC使用交叉验证来估算类别概率,减慢训练速度,并会添加predict_proba()方法)。如果修改上面代码为使用软投票,你会发现投票分类器的准确率达到91.2%以上!

7.2 Bagging和Pasting

前面提到,获得不同种类分类器的方法之一是使用不同的训练算法。还有另一种方法是每个预测器使用的算法相同,但是在不同的训练集随机子集上进行训练。

采样时如果将样本放回,这种方法叫作bagging(bootstrap aggregating的缩写,也叫自举汇聚法)。采样时样本不放回,这种方法则叫作pasting。

换句话说,bagging和pasting都允许训练实例在多个预测器中被多次采样,但是只有bagging允许训练实例被同一个预测器多次采样。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新四石路打卤面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值