<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 9 章 集成学习与提升算法 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter09/</link>
		<description>Recent content in 第 9 章 集成学习与提升算法 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter09/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>9.1 集成学习算法</title>
				<link>https://mlwithme.github.io/ml/chapter09/9eff4004fd6c437d/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter09/9eff4004fd6c437d/</guid>
				<description>&lt;p&gt;经过前面几章内容的学习，我们已经了解了机器学习中的多种分类和回归模型。现在有一个问题，这么多模型究竟哪一个最好呢？以分类任务为例，当拿到一个实际的数据集时，如果是你，你会选择哪种模型进行建模呢？最笨的方法就是挨个都试一下，这样做有没有道理呢？还别说，在实际的情况中真的可能会都去试一下。但是另外一种更常见的做法就是采用集成学习的思想来进行建模，也就是本章中将要介绍的内容。&lt;/p&gt;&#xA;&lt;p&gt;整个第9章的学习路线如图9-1所示，首先我们将介绍集成学习的基本思想和并以随机森林为例来介绍scikit-learn建模过程，然后介绍集成学习中应用最为广泛的随机森林算法及其对应的特征重要评估方法，最后再来介绍其它几种常见的集成学习算法。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/240427135841.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 9-1 集成学习算法学习路线图&lt;/center&gt;&#xA;&lt;h1 id=&#34;91-集成学习算法&#34;&gt;9.1 集成学习算法&lt;a class=&#34;anchor&#34; href=&#34;#91-%e9%9b%86%e6%88%90%e5%ad%a6%e4%b9%a0%e7%ae%97%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;911-集成学习思想&#34;&gt;9.1.1 集成学习思想&lt;a class=&#34;anchor&#34; href=&#34;#911-%e9%9b%86%e6%88%90%e5%ad%a6%e4%b9%a0%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;假如现在选择A、B、C这3个模型进行建模，最后得到结果是： A的分类准确率为0.93，B的分类准确率为0.95，C的分类准确率为0.88。那最终应该选择哪一个模型呢？是模型B吗？&lt;/p&gt;&#xA;&lt;p&gt;假设现在一共有100个样本，其标签为二分类（正、负两类），3个模型的部分分类结果如表9-1所示。&lt;/p&gt;&#xA;&lt;center&gt;表 9-1 不同模型分类结果对比表&lt;/center&gt;&lt;div align=center&gt;&lt;img width=&#34;600&#34; src=&#34;https://mlwithme.github.io/images/ml/t8-6.jpg&#34;/&gt;&lt;/div&gt;&#xA;&lt;p&gt;在表9-1中的5个样本，模型A和模型C均能分类正确，而模型B不能分类正确，但如果此时将这3个模型一起用于分类任务的预测，并且对于每个样本的最终输出结果采用基于投票的规则在3个模型的输出结果中进行选择。例如表9-1中的第1个样本，模型A和模型C均判定为“负类”只有模型B判定为“正类”，则最后的输出便为“负类”。那么此时，我们就可以得到一个分类准确率为1的“混合”模型。&lt;/p&gt;&#xA;&lt;p&gt;注意： 在其余的95个样本中，假设根据投票规则均能分类正确。&lt;/p&gt;&#xA;&lt;h2 id=&#34;912-集成学习种类&#34;&gt;9.1.2 集成学习种类&lt;a class=&#34;anchor&#34; href=&#34;#912-%e9%9b%86%e6%88%90%e5%ad%a6%e4%b9%a0%e7%a7%8d%e7%b1%bb&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在机器学习中，基于这种组合思想来提高模型精度的方法被称为集成学习（Ensemble Learning）。俗话说“三个臭皮匠，赛过诸葛亮”，这句话就完美阐述了集成学习的潜在思想——通过将多个模型结合在一起来提高整体的泛化能力[1]。常见的集成模型主要包括以下3种：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. Bagging集成学习&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Bagging的核心思想为并行地训练一系列各自相互独立的同类模型，然后将各个模型的输出结果按照某种策略进行组合并输出得到最终结果。例如在分类中可采用投票策略，而在回归中可采用平均策略，在9.2节中将要介绍到了随机森林便是这一集成学习的典型应用。通常来讲，模型越容易过拟合，则越适用于Bagging集成学习方法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. Boosting集成学习&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Boosting的核心思想为先串行地训练一系列前后依赖的同类模型，即后一个模型用来对前一个模型的输出结果进行修正，最后通过某种策略将所有的模型组合起来并输出最终的结果，在9.4节、9.5节和9.6节中将会详细介绍几种常见Boosting算法的原理及实现过程。通常来讲，模型越容易欠拟合，则越适用于Boosting集成学习方法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. Stacking集成学习&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Stacking的核心思想为并行地训练一系列各自独立的不同类模型，然后将各个模型的输出结果作为输入来训练一个新模型（例如： 逻辑回归），并通过这个新模型来输出最终预测的结果[2]。通常来讲，Stacking集成学习也适用于欠拟合的机器学习模型。&lt;/p&gt;&#xA;&lt;p&gt;下面，我们来大致介绍一下各类集成模型中常见的算法和使用示例。&lt;/p&gt;&#xA;&lt;h2 id=&#34;913-bagging集成学习&#34;&gt;9.1.3 Bagging集成学习&lt;a class=&#34;anchor&#34; href=&#34;#913-bagging%e9%9b%86%e6%88%90%e5%ad%a6%e4%b9%a0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Bagging全称为Bootstrap Aggregation，而这两个单词也分别代表了Bagging在执行过程中的两个步骤：①Bootstrap Samples； ②Aggregate Outputs。总结起来就是Bagging首先从原始数据中随机抽取多组包含若干数量样本的子训练集，并且对于各子训练集来讲再随机抽取其中若干特征维度作为模型输入；然后分别以不同的子训练集来训练并得到不同的基模型，同时将各个基模型的预测结果进行聚合得到最终的输出，即&#xA;&lt;/p&gt;&#xA;$$&#xA;y=\frac{1}{M}\sum\limits_{m=1}^{M}{{{f}_{m}}}(x)\tag{9-1}&#xA;$$&lt;p&gt;&#xA;其中，$M$表示基模型的数量，$f_m(x)$表示不同的基模型。&lt;/p&gt;&#xA;&lt;p&gt;同时，由于Bagging的策略是取所有基模型的“平均”值作为最终模型的输出结果，所以Bagging集成方法能够很好地降低模型高方差（过拟合）的情况，因此通常来讲，在使用Bagging集成方法的时候，可以尽量使每个基模型都出现过拟合的现象。下面介绍在sklearn中如何使用Bagging集成学习方法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. Bagging on KNN&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在sklearn中，可以通过语句&lt;code&gt;from sklearn.ensemble import BaggingClassifier&lt;/code&gt;导入Bagging集成学习方法中的分类模型。下面先来介绍&lt;code&gt;BaggingClassifier&lt;/code&gt;类中常见的重要参数及其含义，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;, base_estimator&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;, n_estimators&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     max_samples&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1.0&lt;/span&gt;, max_features&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1.0&lt;/span&gt;, bootstrap&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     bootstrap_features&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;, n_jobs&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;): &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行&lt;code&gt;base_estimator&lt;/code&gt;表示所使用的基模型，例如可以是K近邻或者逻辑回归等； &lt;code&gt;n_estimators&lt;/code&gt;表示需要同时训练多少个基模型。第2行 &lt;code&gt;max_samples&lt;/code&gt;表示每个子训练集中最大的样本数量，其可以是整数也可以是0~1的浮点数（此时表示在总样本数中的占比）；&lt;code&gt; max_features&lt;/code&gt;表示子训练集中特征维度的数量，由于采用的是随机抽样所以不同的子训练集特征维度可能不一样； &lt;code&gt;bootstrap=True&lt;/code&gt;表示在同一子训练集中同一样本可以重复抽样出现。第3行 &lt;code&gt;bootstrap_features=False&lt;/code&gt;表示在同一子训练集中同一特征维度不能重复出现，如果设置为True，则在极端情况下所有的特征维度可能都一样；&lt;code&gt; n_jobs&lt;/code&gt;表示同时要使用多个CPU核并行进行计算。&lt;/p&gt;</description>
			</item>
			<item>
				<title>9.2 随机森林</title>
				<link>https://mlwithme.github.io/ml/chapter09/18980c9f757e42c8/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter09/18980c9f757e42c8/</guid>
				<description>&lt;h1 id=&#34;92-随机森林&#34;&gt;9.2 随机森林&lt;a class=&#34;anchor&#34; href=&#34;#92-%e9%9a%8f%e6%9c%ba%e6%a3%ae%e6%9e%97&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;921-随机森林原理&#34;&gt;9.2.1 随机森林原理&lt;a class=&#34;anchor&#34; href=&#34;#921-%e9%9a%8f%e6%9c%ba%e6%a3%ae%e6%9e%97%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;正如在9.1.3节中所介绍的那样，随机森林本质上是基于决策树的Bagging集成学习模型，因此，随机森林的建模过程总体上可以分为3步[3]：&lt;/p&gt;&#xA;&lt;p&gt;第1步，对原始数据集进行随机采样，得到多个训练子集。&lt;/p&gt;&#xA;&lt;p&gt;第2步，在各个训练子集上训练得到不同的决策树模型。&lt;/p&gt;&#xA;&lt;p&gt;第3步，将训练得到的多个决策树模型进行组合，然后得到最后的输出结果。&lt;/p&gt;&#xA;&lt;p&gt;如图9-2所示为随机对样本点和特征采样后训练得到的若干决策树模型组成的随机森林。从图9-2中可以看出，即使同一个样本在不同树中所归属的叶子节点也不尽相同，甚至连类别也可能不同，但是这也充分体现了Bagging集成模型的优点，通过“平均”来提高模型的泛化能力。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p8-18.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-2 随机森林原理示意图&lt;/center&gt;&#xA;&lt;p&gt;在图9-2中，多个不同结构的决策树模型构成了随机森林，并且在模型输出时将会以投票的方式决策出最终的输出类别。同时，随机森林与普通Bagging集成学习方法存在的一点差别就是，随机森林中每棵决策树在每次划分节点的过程中，还会有一个随机的过程，即只会从已有的特征中再随机选择部分特征取值参与节点划分，这一过程被称为Feature Bagging。之所以要这么做，是为了减小各个树模型之间的关联性。例如训练数据中如果存在着某些差异性较大的特征取值，则所有的决策树在节点划分时就会选择同样的特征，使最终得到的决策树之间具有较强的关联性，即每棵树都类似。&lt;/p&gt;&#xA;&lt;h2 id=&#34;922-随机森林示例代码&#34;&gt;9.2.2 随机森林示例代码&lt;a class=&#34;anchor&#34; href=&#34;#922-%e9%9a%8f%e6%9c%ba%e6%a3%ae%e6%9e%97%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;介绍完随机森林的基本原理后再来看一看如何通过sklearn完成随机森林的建模任务。在sklearn中，可以通过语句&lt;code&gt;from sklearn.ensemble import RandomForestClassifier&lt;/code&gt;导入模块随机森林。下面先来介绍一下&lt;code&gt;RandomForestClassifier&lt;/code&gt;类中常见的几个重要参数及其含义，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;, n_estimators&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;100&lt;/span&gt;, criterion&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;gini&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     max_depth&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;, min_samples_split&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;, min_samples_leaf&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     max_features&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, bootstrap&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;, max_samples&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行&lt;code&gt;n_estimators&lt;/code&gt;表示在随机森林中决策树的数量； &lt;code&gt;criterion&lt;/code&gt;用于指定构建决策树的算法，可参见第8章内容。第2行 &lt;code&gt;max_depth&lt;/code&gt;表示允许决策树的最大深度； &lt;code&gt;min_samples_split&lt;/code&gt;表示节点允许继续划分的最少样本数，即如果划分后的节点中样本数少于该值，将不会进行划分； &lt;code&gt;min_samples_leaf&lt;/code&gt;表示叶子节点所需要的最少样本数； &lt;code&gt;max_features&lt;/code&gt;表示每次对节点进行划分时所选特征的最大数量，即节点每次在进行划分时会先在原始特征中随机选取&lt;code&gt;max_features&lt;/code&gt;个候选特征，然后在候选特征中选择最佳特征； &lt;code&gt;bootstrap&lt;/code&gt;表示是否对原始数据集进行采样，如果其值为&lt;code&gt;False&lt;/code&gt;，则所有决策树在构造时均使用相同的样本； &lt;code&gt;max_samples&lt;/code&gt;表示每个训练子集中样本数量的最大值（当&lt;code&gt;bootstrap=True&lt;/code&gt;时），其默认值为&lt;code&gt;None&lt;/code&gt;，即等于原始样本的数量。&lt;/p&gt;&#xA;&lt;p&gt;注意：&lt;code&gt;max_samples=None&lt;/code&gt;仅仅表示采样的样本数等于原始训练集的样本数，不代表抽样后的子训练集等同于原始训练集，因为采样时样本可以重复。&lt;/p&gt;&#xA;&lt;p&gt;一般来讲，在sklearn的各个模型中，对于大多数参数来讲保持默认即可，对于少部分关键参数可采样交叉验证进行选择。下面以iris数据集为例进行&lt;code&gt;RandomForestClassifier&lt;/code&gt;的集成学习建模任务，完整代码可参见 &lt;code&gt;AllBooKCode/Chapter09/C04_ensemble_random_forest.py&lt;/code&gt;  文件，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     x_train, x_test, y_train, y_test &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_data()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; RandomForestClassifier(n_estimators&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;, max_features&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_train)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;score(x_test, y_test)) &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# 0.95&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述代码便是利用随机森林来进行分类任务的完整建模过程。可以看到，尽管随机森林这么复杂的一个模型，在sklearn中同样可以通过几行代码来完成。同时，在完成随机森林的训练后，可以通过&lt;code&gt;model.estimators&lt;/code&gt;属性来得到所有的决策树对象，然后分别对其进行可视化就可以得到整个随机森林可视化结果。当然，最重要的是可以通&lt;code&gt;过model.feature_importances&lt;/code&gt;属性来得到每个特征的重要性程度以进行特征筛选，以便去掉无关特征。&lt;/p&gt;&#xA;&lt;h2 id=&#34;923-特征重要性评估&#34;&gt;9.2.3 特征重要性评估&lt;a class=&#34;anchor&#34; href=&#34;#923-%e7%89%b9%e5%be%81%e9%87%8d%e8%a6%81%e6%80%a7%e8%af%84%e4%bc%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从决策树的构造原理便可以看出，越是靠近决策树顶端的特征维度越能对不同类别的样本进行区分，这就意味着越是接近于根节点的特征维度越重要，因此，在sklearn中的类&lt;code&gt;DecisionTreeClassifier&lt;/code&gt;里面，同样也有&lt;code&gt;feature_importances_&lt;/code&gt;这一类属性，以便输出每个特征的重要性值。只是通过随机森林进行特征重要性评估更加准确，因此才将这部分内容放到了这里。不过想要弄清楚随机森林中的特征重要性评估过程，还得从决策树说起。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 决策树中的特征评估&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在sklearn中，决策树通过基于基尼不纯度的减少量来对特征进行重要性评估，当然基尼不纯度也可以换成信息增益或者信息增益比。具体地，对于决策树中划分每个节点的特征来讲，其特征重要性计算公式为[1]&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{importance}=\frac{N_t}{N}*(\text{impurity}-\frac{N_{tL}}{N_t}*\text{left\_impurity}-\frac{N_{tR}}{N_t}*\text{right\_impurity})\tag{9-2}&#xA;$$&lt;p&gt;&#xA;其中，$N$表的样本数； $N_t$表示当前节点的样本数；$\text{ impurity}$表示当前节点的不纯度； $N_{tL}$表示当前节点左孩子中的样本数； $\text{left\_impurity}$表示当前节点左孩子的不纯度； $N_{tR}$表示当前节点右孩子中的样本数；$\text{right\_impurity}$表示当前节点右孩子的不纯度。&#xA;以9.2.2节随机森林里的其中一棵决策树为例，其在每次进行节点划分时的各项信息如图9-3所示。&lt;/p&gt;</description>
			</item>
			<item>
				<title>9.3 泰坦尼克号生还预测</title>
				<link>https://mlwithme.github.io/ml/chapter09/8a91b358b2f74d56/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter09/8a91b358b2f74d56/</guid>
				<description>&lt;h1 id=&#34;93-泰坦尼克号生还预测&#34;&gt;9.3 泰坦尼克号生还预测&lt;a class=&#34;anchor&#34; href=&#34;#93-%e6%b3%b0%e5%9d%a6%e5%b0%bc%e5%85%8b%e5%8f%b7%e7%94%9f%e8%bf%98%e9%a2%84%e6%b5%8b&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在本章的前面几节内容中，我们分别介绍了三种集成学习算法的基本思想，并且就其中随机森林的原理做了详细介绍。在接下来的这节内容中将以泰坦尼克号生还预测（分类）[4]为例进行实战演示，并且还会介绍相关的数据预处理方法，例如缺失值填充和类型特征转换等。&lt;/p&gt;&#xA;&lt;p&gt;本次用到的数据集为泰坦尼克号生还预测数据，原始数据集一共包含891个样本和11个特征维度，但是需要注意的是，在实际处理时这11个特征维度不一定都要用到，只选择部分有用的即可。同时，由于部分样本存在某些特征维度出现缺失的状况，因此还需要对其进行填充，完整代码可参见&lt;code&gt;AllBooKCode/Chapter09/C07_titanic.py&lt;/code&gt;  文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;931-读取数据集&#34;&gt;9.3.1 读取数据集&lt;a class=&#34;anchor&#34; href=&#34;#931-%e8%af%bb%e5%8f%96%e6%95%b0%e6%8d%ae%e9%9b%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;本次用到的数据集一共包含两个文件，其中一个为训练集，另一个为测试集。下载完成后放在本代码所在目录的&lt;code&gt;data&lt;/code&gt;目录中即可。接着需要先读取本地数据，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;pandas&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;pd&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_data&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     train &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; pd&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;read_csv(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;data/train.csv&amp;#39;&lt;/span&gt;,sep&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;&#34;&gt;’&lt;/span&gt;,&lt;span style=&#34;&#34;&gt;’&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     test &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; pd&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;read_csv(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;data/test.csv&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行用来导入库pandas，以便读取本地文件。第3行代码表示通过pandas中的&lt;code&gt;read_csv()&lt;/code&gt;方法读取&lt;code&gt;.csv&lt;/code&gt;文件，它返回的是一个&lt;code&gt;DataFrame&lt;/code&gt;格式的数据类型，可以方便地进行各类数据预处理操作。这里值得一提的是，&lt;code&gt;read_csv&lt;/code&gt;不仅可以用来读取&lt;code&gt;.csv&lt;/code&gt;格式的数据，只要读取的数据满足条件： ①它是一个结构化的文本数据，即m行n列； ②列与列之间有相同的分隔符，例如默认情况下&lt;code&gt;sep=&#39;,&#39;&lt;/code&gt;。这样的数据都可以通过该方法进行读取，不管文件的扩展名是&lt;code&gt;.csv&lt;/code&gt;还是&lt;code&gt;.txt&lt;/code&gt;，抑或没有后缀。当然，pandas还提供了很多常见数据的读取方法，例如excel、json数据等。&lt;/p&gt;&#xA;&lt;p&gt;在读取完成后，可以通过如下方式查看数据集的相关信息：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(train&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;info())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; Data columns (total &lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt; columns):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;  &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;#   Column       Non-Null Count  Dtype  &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;---&lt;/span&gt;  &lt;span style=&#34;color:#666&#34;&gt;------&lt;/span&gt;       &lt;span style=&#34;color:#666&#34;&gt;--------------&lt;/span&gt;  &lt;span style=&#34;color:#666&#34;&gt;-----&lt;/span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;   PassengerId  &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    int64  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;   Survived     &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    int64  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;   Pclass       &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    int64  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;   Name         &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    &lt;span style=&#34;color:#007020&#34;&gt;object&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;   Sex          &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    &lt;span style=&#34;color:#007020&#34;&gt;object&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;   Age          &lt;span style=&#34;color:#40a070&#34;&gt;714&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    float64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;11&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;   SibSp        &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    int64  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;   Parch        &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    int64  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;13&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;   Ticket       &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    &lt;span style=&#34;color:#007020&#34;&gt;object&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;14&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;   Fare         &lt;span style=&#34;color:#40a070&#34;&gt;891&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    float64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;15&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;  Cabin        &lt;span style=&#34;color:#40a070&#34;&gt;204&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    &lt;span style=&#34;color:#007020&#34;&gt;object&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;16&lt;/span&gt;  &lt;span style=&#34;color:#40a070&#34;&gt;11&lt;/span&gt;  Embarked     &lt;span style=&#34;color:#40a070&#34;&gt;889&lt;/span&gt; non&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;null    &lt;span style=&#34;color:#007020&#34;&gt;object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从上述输出信息可以知道，该数据集一共有11个特征维度（第1列Survived 为标签）和891个样本。同时还可以具体地看到每个特征维度的数据类型及有多少为非空值等信息。&lt;/p&gt;</description>
			</item>
			<item>
				<title>9.4 AdaBoost原理与实现</title>
				<link>https://mlwithme.github.io/ml/chapter09/73f6914844f549f1/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter09/73f6914844f549f1/</guid>
				<description>&lt;h1 id=&#34;94-adaboost原理与实现&#34;&gt;9.4 AdaBoost原理与实现&lt;a class=&#34;anchor&#34; href=&#34;#94-adaboost%e5%8e%9f%e7%90%86%e4%b8%8e%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;通过9.1.4节内容的介绍，我们对于Boosting集成学习的基本思想已经有了一定的了解。在本节内容中，将会介绍Boosing算法中第1种常见的提升学习算法——AdaBoost (Adaptive Boosting) [5]。&lt;/p&gt;&#xA;&lt;h2 id=&#34;941--adaboost算法思想&#34;&gt;9.4.1  AdaBoost算法思想&lt;a class=&#34;anchor&#34; href=&#34;#941--adaboost%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;AdaBoost算法是由Freund 和 Schapire等人于1997年所提出[6]，它是一种自适应的提升算法，其核心思想在于AdaBoost会为每个样本赋予一个权重值，在上一个模型中被错分的样本在下一个模型中将具有更高的权重，以此来尽可能保证每个样本都能够被正确划分，最后再将每个模型的预测结果集成起来作为最终的预测输出。下面通过一个实际的示例来介绍AdaBoost算法的思想。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;200&#34; src=&#34;https://mlwithme.github.io/images/ml/230613192544.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-5 数据样本分布图&lt;/center&gt;&#xA;&lt;p&gt;如图9-5所示，图中一共有10个样本点，包含方块和圆形两个类别。假定现在通过某种算法构建了模型1（每个样本点具有相等的权重值）并对图9-5中的样本进行分类，得到的分类结果如图9-6所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;200&#34; src=&#34;https://mlwithme.github.io/images/ml/230613192617.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-6 模型1分类结果图&lt;/center&gt;&#xA;&lt;p&gt;从图9-6的分类结果可知，样本③和④被划分到了错误的类别中，因此可以再次构建模型2并同时赋予样本③和④更高的权重，并对所有样本点进行分类，最终可以得到图9-7中的分类结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;200&#34; src=&#34;https://mlwithme.github.io/images/ml/230613192633.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-7 模型2分类结果图&lt;/center&gt;&#xA;&lt;p&gt;从图9-7的分类结果可知，此时样本③和④已经被正确划分了，但是样本⑦和样本⑨却又出现了错误，于是可以再次构建模型3并同时赋予样本⑦和⑨更高的权重，并对所有样本点进行分类，最终可以得到图9-8中的分类结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;200&#34; src=&#34;https://mlwithme.github.io/images/ml/230613192645.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-8 模型3分类结果图&lt;/center&gt;&#xA;&lt;p&gt;从图9-8的分类结果可知，此时模型3并没有同时将样本⑦和样本⑨都分类正确，并且样本②和④也被误分了。此时，可以再次构建模型4并同时赋予样本②④⑦更高的权重，并对所有样本点进行分类，最终可以得到图9-9中的分类结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;200&#34; src=&#34;https://mlwithme.github.io/images/ml/230613192700.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-9 模型4分类结果图&lt;/center&gt;&#xA;&lt;p&gt;从图9-9所示的结果可以看出，模型4为了同时将所有方形和样本④分类正确，导致样本①②⑥⑦均分类错误。此时可以发现，虽然上述4个模型均没有将所有样本都正确的分类，但是最后可以将4个模型的结果集成起来看做一个模型的输出结果，如图9-10所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;600&#34; src=&#34;https://mlwithme.github.io/images/ml/230613192734.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-10 集成模型分类结果图&lt;/center&gt;&#xA;&lt;p&gt;根据图9-10可知，以先前的4个模型为基础，然后以某种策略将各个模型的输出结果集成起来作为最终的预测输出，这样便可以得到一个相较于单个模型更好的预测结果（模型1到模型4的分类准确率分别为0.8、0.8、0.7和0.6，而最终集成模型的准确率为0.9）。当然，事实上如果再构建一个模型5便可以实现百分之百的准确率。&lt;/p&gt;&#xA;&lt;p&gt;以上就是AdaBoost算法的核心思想，从这里也可以看出AdaBoost算法本质上也可以看做是一种模型的训练策略（这也类似于在13.1节中将要介绍的Self-Training算法），因此不管是任何模型都可以采用AdaBoost策略来进行建模，只是对于不同的算法在如何融入样本权重来进行建模有不同的做法。&lt;/p&gt;&#xA;&lt;p&gt;在清楚AdaBoost算法的基本思想以后，再来看如何利用sklearn框架快速完成整建模过程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;942-adaboost算法示例代码&#34;&gt;9.4.2 AdaBoost算法示例代码&lt;a class=&#34;anchor&#34; href=&#34;#942-adaboost%e7%ae%97%e6%b3%95%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在sklearn中，可以通过&lt;code&gt;sklearn.ensemble&lt;/code&gt;中的&lt;code&gt;AdaBoostClassifier&lt;/code&gt;来导入AdaBoosting集成学习方法中的分类模型。下面先来介绍一下&lt;code&gt;AdaBoostClassifier&lt;/code&gt;类中常见的几个重要参数及含义。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.ensemble&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; AdaBoostClassifier&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;, base_estimator&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;, n_estimators&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;50&lt;/span&gt;, learning_rate&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1.&lt;/span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行是导入AdaBoost算法模块。第2行&lt;code&gt;base_estimator&lt;/code&gt;表示所使用的基模型，如果设置为 &lt;code&gt;None&lt;/code&gt;则默认使用决策树&lt;code&gt;n_estimators&lt;/code&gt;表示基模型的数量，默认为50个；&lt;code&gt;learning_rate&lt;/code&gt;用来控制每个基模型的贡献度，即在式(9-8)的后面再乘以这个系数（这只是sklearn在实现时所新加入的参数），默认为1，即等权重。较小的学习率会减小每个分类器的权重变化，使得模型的调整更加平滑和缓慢，这有助于避免过拟合，但可能需要更多的基模型才能达到相同的分类性能；而较大的学习率可以使得模型的收敛速度加快，但可能导致过拟合。因此，在实际应用中，需要根据具体问题进行调优，找到最佳的&lt;code&gt;learning_rate&lt;/code&gt;和&lt;code&gt;n_estimators&lt;/code&gt;的组合，以实现模型的最佳性能。&lt;/p&gt;&#xA;&lt;p&gt;下面以决策树作为基模型通过sklearn中的&lt;code&gt;AdaBoostClassifier&lt;/code&gt;类来进行Boosting集成学习建模，完整示例可参见 &lt;code&gt;AllBooKCode/Chapter09/C08_AdaBoosting.py&lt;/code&gt;  文件。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     x_train, x_test, y_train, y_test &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_data()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     dt &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; DecisionTreeClassifier(criterion&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;gini&amp;#39;&lt;/span&gt;, max_features&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;, max_depth&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; AdaBoostClassifier(estimator&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;dt, n_estimators&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;100&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_train)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;模型在测试集上的准确率为：&amp;#34;&lt;/span&gt;, model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;score(x_test, y_test))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第3行是定义决策树作为基模型（基模型）。第4行是定义AdaBoost分类器，并将决策树基模型作为参数来实例化一个&lt;code&gt;AdaBoostClassifier&lt;/code&gt;类对象。&lt;/p&gt;</description>
			</item>
			<item>
				<title>9.5 MultiAdaBoost原理与实现</title>
				<link>https://mlwithme.github.io/ml/chapter09/71fd0e44294e4abb/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter09/71fd0e44294e4abb/</guid>
				<description>&lt;h1 id=&#34;95-multiadaboost原理与实现&#34;&gt;9.5 MultiAdaBoost原理与实现&lt;a class=&#34;anchor&#34; href=&#34;#95-multiadaboost%e5%8e%9f%e7%90%86%e4%b8%8e%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在9.4节内容中，我们详细介绍了AdaBoost算法的思想原理和实现过程，算是对于AdaBoost算法框架有了一个基本的认识。根据AdaBoost算法的原理可知，其最初主要是被用于二分类任务中[6]，因此它并不能很好地处理多分类问题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;951-multiadaboost算法思想&#34;&gt;9.5.1 MultiAdaBoost算法思想&lt;a class=&#34;anchor&#34; href=&#34;#951-multiadaboost%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;根据AdaBoost算法中分类器权重的计算公式(9-8)可以得到模型误差与模型权重之间的函数关系，如图9-11所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/240521204424.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-11 模型误差与模型权重函数关系图&lt;/center&gt;&#xA;&lt;p&gt;从图9-11可以看出，当模型误差$err^{(m)}$大于0.5时，模型权重$\alpha^{(m)}$将会小于0，而根据式(9-9)可知此时$w_i$将会乘以一个小于1的数，从而使得$w_i$朝着错误的方向（变小）进行更新，这显然与Adaboost的思想相违背（越容易分错的样本点对应的样本权重越大）。&lt;/p&gt;&#xA;&lt;p&gt;由于在二分类场景下，我们总能相对容易地找到误差小于0.5（可以近似的看成准确率）的模型，但是随着分类数量的增加初始时模型的误差很难再小于0.5，而这将导致被上一个模型分类错误的样本在下一个模型中同样得不到修正。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;650&#34; src=&#34;https://mlwithme.github.io/images/ml/22091635038.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 9-12 三分类中迭代次数与测试误差、模型权重和样本权重关系图（图片来自[6]）&lt;/center&gt;&#xA;&lt;p&gt;如图9-12所示为AdaBoost模型在某个三分类数据集上（训练集和测试集随机划分10次）训练后在测试集上的平均结果。从图9-12左侧的结果可知，AdaBoost在迭代伊始测试误差便大于0.5，且随着迭代次数的增加最终稳定在0.53左右，也就是说随着迭代过程的增加模型的拟合能力并没有提升。根据图9-12中间的结果可知，模型误差$err^{(m)}$先是小于0.5，然后在若干次迭代之后便稳定在了0.5附近，而这也导致模型权重$\alpha^{(m)}$从一开始的大于0到在若干次迭代后便一直处于0附近，如图9-12右所示。根据式(9-9)可知，当$\alpha^{(m)}=0$时，$w_i$将会保持不变，进而使得被错分类的样本点得不到修正。&lt;/p&gt;&#xA;&lt;p&gt;基于原始AdaBoost算法所存在的问题，Hastie等人[6]在2009年提出了一种基于AdaBoost改进的多分类AdaBoost算法——基于指数损失函数的多分类分步加法模型（ Stagewise Additive Modeling using a Multi-class Exponential loss function, SAMME）。同时，在sklearn中只需要在实例化&lt;code&gt;AdaBoostClassifier&lt;/code&gt;类时将 &lt;code&gt;algorithm&lt;/code&gt;参数指定为&lt;code&gt;&#39;SAMME&#39;&lt;/code&gt;即可使用SAMME算法，这里就不再重复进行示例，参考9.4.2节内容即可。&lt;/p&gt;&#xA;&lt;h2 id=&#34;952-samme算法原理&#34;&gt;9.5.2 SAMME算法原理&lt;a class=&#34;anchor&#34; href=&#34;#952-samme%e7%ae%97%e6%b3%95%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;SAMME算法的思想和整体框架同AdaBoost一样，仅仅只是用了一种特殊的形式来表示每个模型的预测输出，并最终得到了在多分类场景下AdaBoost的更新迭代公式，具体的详细求解过程将在后续进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;假设 $g^{(m)}(x),m=1,2,...,M$ 为 $M$ 个基模型，数据集$(x_1,\boldsymbol{y}_1),(x_2,\boldsymbol{y}_2),...,(x_n,\boldsymbol{y}_n)$一共有$n$个样本，且 $\boldsymbol{y}_i$ 是一个类似于one-hot编码的 $K$ 维向量，则SAMME算法可以通过如下过程来进行表示：&lt;/p&gt;&#xA;&lt;p&gt;(1) 初始化每个样本的权重为$w_i=1/n$；&lt;/p&gt;&#xA;&lt;p&gt;(2) 使用训练集训练得到基模型 $\boldsymbol{g}^{(m)}(x)$，其输出形式为一个 $K$ 维向量；&lt;/p&gt;&#xA;&lt;p&gt;(3) 根据式(9-29)~式(9-31)分别迭代计算每个基模型 $\boldsymbol{g}^{(m)}(x)$对应下的分类误差$err^{(m)}$，模型权重$\alpha^{(m)}$和样本权重$w_i$&lt;/p&gt;&#xA;$$&#xA;err^{(m)}=\frac{\sum_{i=1}^nw_i\cdot\mathbb{I}\left(c_i\neq T^{(m)}(x_i)\right)}{\sum_{i=1}^nw_i}\tag{9-29}&#xA;$$$$&#xA;\alpha^{(m)}=\log\frac{1-err^{(m)}}{err^{(m)}}+\log(K-1)\tag{9-30}&#xA;$$$$&#xA;\begin{aligned}&#xA;&amp;w_i\leftarrow w_i\cdot\exp \left(\alpha^{(m)}\cdot\mathbb{I}\left(c_i\neq &#xA; T^{(m)}(x_i)\right)\right),i=1,2,...,n &#xA;\\[2ex]&#xA;&amp;w_i\leftarrow \frac{w_i}{\sum_{j=1}^nw_j}&#xA;\end{aligned}\tag{9-31}&#xA;$$&lt;p&gt;其中 $c_i$ 表示标签 $\boldsymbol{y}_i$ 对应的类别编号； $T^{(m)}(x_i)$ 为根据 $\boldsymbol{g}(x)$ 得到的预测类别编号；$K$ 表示分类的类别数。&lt;/p&gt;</description>
			</item>
			<item>
				<title>9.6 Gradient Boost 原理与实现</title>
				<link>https://mlwithme.github.io/ml/chapter09/f3c2341ce7d64f70/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter09/f3c2341ce7d64f70/</guid>
				<description>&lt;h1 id=&#34;96-gradient-boost-原理与实现&#34;&gt;9.6 Gradient Boost 原理与实现&lt;a class=&#34;anchor&#34; href=&#34;#96-gradient-boost-%e5%8e%9f%e7%90%86%e4%b8%8e%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面两节内容中，我们分别详细介绍了AdaBoost算法和基于AdaBoost改进的SAMME算法的基本原理和实现过程。在接下来的这节内容中将会介绍另外一种基于Boost策略的算法模型——梯度提升（Gradient Boosting, GB）算法。从名字可以看出梯度提升算法有两个关键的地方：梯度和提升。提升表明整个集成模型依旧是串行进行，且后一个模型是用来对前一个模型的输出结果进行修正；梯度则表明后一个模型在对前一个模型的结果进行修正时是以梯度下降为策略进行优化的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;961-gradient-boost-算法思想&#34;&gt;9.6.1 Gradient Boost 算法思想&lt;a class=&#34;anchor&#34; href=&#34;#961-gradient-boost-%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;梯度提升是Friedman等人[12]于2001年所提出的一种基于梯度下降策略来对模型进行优化的算法，其核心思想是先通过设定一个目标函数，然后再通过梯度下降算法来对预测结果进行优化。梯度提升算法的整体结构类似于之前介绍的线性回归和逻辑回归的求解流程只是在具体细节部分有着不同的处理方式。&lt;/p&gt;&#xA;&lt;p&gt;在AdaBoost算法中，通过赋予每个样本一个权重值，并且在上一个模型中误差越大的样本（分类问题中即被错分的样本）在下一个模型中将会被给予更高的权重，然后对于每个基模型来说其都有不同的策略来降低高权重样本的误差，以此来提高整个集成模型的预测精度，即在AdaBoost算法中它是通过赋予样本权重来提升模型的精度。对于梯度提升算法来说，它则是通过梯度来提升整个模型的预测精度。&lt;/p&gt;&#xA;&lt;p&gt;如式(9-57)所示，便是梯度下降算法的核心公式&#xA;&lt;/p&gt;&#xA;$$&#xA;w=w-\alpha\cdot\frac{\partial J}{\partial w}\tag{9-57}&#xA;$$&lt;p&gt;&#xA;其中$w$表示待更新的参数对象，$J$表示关于参数$w$的目标函数，$\alpha$表示学习率。更多关于梯度下降算法的详细介绍可以参见2.5节内容。&lt;/p&gt;&#xA;&lt;p&gt;通过式(9-57)可知，对于参数$w$来说可以根据其梯度的方向来一步一步迭代计算得到（接近）其最优解。现在假定某个模型的预测输出为$\hat{y}=f(x)$，预测值与真实值之间的损失误差为$J(y,\hat{y})$，那么为了提高模型$f(x)$的预测结果，同样可以采用梯度下降算法来对预测结果进行迭代更新，即&#xA;&lt;/p&gt;&#xA;$$&#xA;f(x)=f(x)-\alpha\cdot\frac{\partial J}{\partial f(x)}\tag{9-58}&#xA;$$&lt;p&gt;&#xA;而式(9-58)便是梯度提升算法的核心思想。&lt;/p&gt;&#xA;&lt;p&gt;从式(9-58)可以看出，在梯度提升算法中最重要的便是求得目标函数$J$关于模型$f(x)$​的梯度，而这通常会通过训练一系列额外的模型来对梯度进行预测，具体可见后续代码实现部分。&lt;/p&gt;&#xA;&lt;h2 id=&#34;962-gradient-boost-示例代码&#34;&gt;9.6.2 Gradient Boost 示例代码&lt;a class=&#34;anchor&#34; href=&#34;#962-gradient-boost-%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在明白梯度提升算法的基本思想后我们再来看如何在sklearn中使用它。首先，需要知道的是梯度提升算法本质上也只是一种模型的训练策略，因此对于基学习器的选择是任意的。但是，通常默认情况下都是以决策树作为基学习器，所以基于梯度提升方法最常见的一个模型便是梯度提升决策树（Gradient Boosting Decision Tree, GBDT）也简称梯度提升树，而sklearn中的&lt;code&gt;GradientBoostingClassifier&lt;/code&gt;模块便是以决策树为基学习器进行实现的且不可更改。&lt;/p&gt;&#xA;&lt;p&gt;在sklearn中，可以通过如下方式来使用梯度提升树，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.ensemble&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; GradientBoostingClassifier&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.datasets&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; load_iris&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.model_selection&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; train_test_split&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_iris(return_X_y&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;     x_train, x_test, y_train, y_test &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; train_test_split(x, y, test_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.3&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; GradientBoostingClassifier(learning_rate&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.2&lt;/span&gt;, n_estimators&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;50&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_train)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;score(x_test, y_test)) &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;#    0.956&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第6~7行用来返回数据集并划分为训练集和测试集。第8行是实例化一个&lt;code&gt;GradientBoostingClassifier&lt;/code&gt;类对象，其中&lt;code&gt;learning_rate&lt;/code&gt;指式(9-58)中的学习率$\alpha$，&lt;code&gt;n_estimators&lt;/code&gt;表示基学习器的数量，即9.6.3节算法原理第三步中的$M$。第9~10行是拟合模型并输出模型在测试集上的准确率。&lt;/p&gt;&#xA;&lt;p&gt;由于&lt;code&gt;GradientBoostingClassifier&lt;/code&gt;是以决策树为基学习器，因此在第8行中实例化时还可以指定决策树对应的相关参数，例如&lt;code&gt;max_depth&lt;/code&gt;，&lt;code&gt;min_samples_leaf&lt;/code&gt;等。最后，sklearn中对应的梯度提升回归模块为&lt;code&gt;GradientBoostingRegressor&lt;/code&gt;。上述完整示例代码可参见 &lt;code&gt;AllBooKCode/Chapter09/C14_gbdt_train.py&lt;/code&gt;  文件。&lt;/p&gt;</description>
			</item>
			<item>
				<title>引用</title>
				<link>https://mlwithme.github.io/ml/chapter09/4f9b26d5b65541f5/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter09/4f9b26d5b65541f5/</guid>
				<description>&lt;h1 id=&#34;引用&#34;&gt;引用&lt;a class=&#34;anchor&#34; href=&#34;#%e5%bc%95%e7%94%a8&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;[1] Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12, pp. 2825-2830, 2011.&lt;/p&gt;&#xA;&lt;p&gt;[2] &lt;a href=&#34;https://en.wikipedia.org/wiki/Ensemble_learning&#34;&gt;https://en.wikipedia.org/wiki/Ensemble_learning&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[3] &lt;a href=&#34;https://en.wikipedia.org/wiki/Random_forest&#34;&gt;https://en.wikipedia.org/wiki/Random_forest&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[4] &lt;a href=&#34;https://www.kaggle.com/c/titanic/data&#34;&gt;https://www.kaggle.com/c/titanic/data&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[5] &lt;a href=&#34;https://en.wikipedia.org/wiki/AdaBoost&#34;&gt;https://en.wikipedia.org/wiki/AdaBoost&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[6] Hastie, Trevor; Rosset, Saharon; Zhu, Ji; Zou, Hui (2009). &amp;ldquo;Multi-class AdaBoost&amp;rdquo;. Statistics and Its Interface. 2 (3): 349–360.&lt;/p&gt;&#xA;&lt;p&gt;[7] Friedman J, Hastie T, Tibshirani R. Additive logistic regression: a statistical view of boosting (with discussion and a rejoinder by the authors)[J]. The annals of statistics, 2000, 28(2): 337-407.&lt;/p&gt;&#xA;&lt;p&gt;[8] &lt;a href=&#34;https://www.cs.toronto.edu/~mbrubake/teaching/C11/Handouts/AdaBoost.pdf&#34;&gt;https://www.cs.toronto.edu/~mbrubake/teaching/C11/Handouts/AdaBoost.pdf&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[9] &lt;a href=&#34;https://www.cs.cmu.edu/~epxing/Class/10701-08s/recitation/boosting.pdf&#34;&gt;https://www.cs.cmu.edu/~epxing/Class/10701-08s/recitation/boosting.pdf&lt;/a&gt;&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
