<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 4 章 模型的改善与泛化 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter04/</link>
		<description>Recent content in 第 4 章 模型的改善与泛化 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter04/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>4.1 基本概念</title>
				<link>https://mlwithme.github.io/ml/chapter04/2089400b28f54dd9/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter04/2089400b28f54dd9/</guid>
				<description>&lt;p&gt;经过前面两章内容的学习，我们已经完成了对线性回归和逻辑回归核心内容的学习，但是机器学习的一些基础概念、模型改善（Optimization）与泛化（Generalization）等内容并没有进行介绍。在第4章中，我们将以线性回归和逻辑回归为例（同样可以运用到后续介绍的其他算法模型中），来介绍机器学习中常见的几个概念和一些模型及数据的处理技巧，并尽可能地说清楚为什么要这么做的原因。由于这部分的内容略微有点杂乱，所以我们将按照如图4-1所示的顺序来递进地进行介绍，同时再辅以示例进行说明。在正式开始继续介绍后续内容之前，我们先来看一看机器学习中的几个基本概念。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;380&#34; src=&#34;https://mlwithme.github.io/images/ml/240411204705.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 4-1 学习路线图&lt;/center&gt;&#xA;&lt;h1 id=&#34;41-基本概念&#34;&gt;4.1 基本概念&lt;a class=&#34;anchor&#34; href=&#34;#41-%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在经过前面两章内容的介绍后，相信大家对于机器学习这个概念已经有了一定感官上的认识。不过到底什么是机器学习呢？机器学习又有哪些类别呢？他和传统的程序设计有什么区别呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;411-机器学习概念&#34;&gt;4.1.1 机器学习概念&lt;a class=&#34;anchor&#34; href=&#34;#411-%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e6%a6%82%e5%bf%b5&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;关于到底什么是机器学习（Machine Learning），可能不同的人会有不同的理解，自然也就产生了不同的定义。下面我们主要介绍一下计算领域内两位大师对于什么是机器学习所给出的定义。&lt;/p&gt;&#xA;&lt;p&gt;第一位是人工智能先驱亚瑟·塞缪尔（Arthur Samuel），他在1959年创造了“机器学习”一词 [1]。塞缪尔认为，所谓机器学习是指： 计算机能够具备根据现有数据构建一套不需要进行显式编程的算法模型来对新数据进行预测的能力。这里所谓不需要进行显式编程便是区别于传统程序算法需要人为指定程序执行步骤的过程。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;Field of study that gives computers the ability to learn without being explicitly programmed&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;第二位是卡内基梅隆大学的计算机科学家汤姆·迈克尔·米切尔（Tom Michael Mitchell），他给出了一个相较于塞缪尔更加正式与学术的定义。米切尔认为，如果计算机程序能够在任务T中学得经验E，并且可以通过指标P进行评价，同时根据经验E还能够提升程序在任务T中的评价指标P，这就是机器学习[2]。这段话对于初学者来讲稍微有点拗口，其实际想要表达的就是，如果一个计算机程序能够自己根据数据样本学习，以此获得经验并通过迭代逐步提高最终的表现结果，则这个过程就被称为机器学习。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.2 特征标准化</title>
				<link>https://mlwithme.github.io/ml/chapter04/56b788b624cd4971/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter04/56b788b624cd4971/</guid>
				<description>&lt;h1 id=&#34;42-特征标准化&#34;&gt;4.2 特征标准化&lt;a class=&#34;anchor&#34; href=&#34;#42-%e7%89%b9%e5%be%81%e6%a0%87%e5%87%86%e5%8c%96&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面两章内容中，我们在进行具体编码实现时都对训练数据集进行了标准化处理，但是我们并没有介绍什么是特征标准化（Standardization），以及为什么特征需要进行标准化，但这确实机器学习中极为重要的一步。在回答这两个问题之前，我们先来介绍一下什么是等高线。&lt;/p&gt;&#xA;&lt;h2 id=&#34;421-等高线&#34;&gt;4.2.1 等高线&lt;a class=&#34;anchor&#34; href=&#34;#421-%e7%ad%89%e9%ab%98%e7%ba%bf&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如图4-4所示，上面部分为$J(w_1,w_2)=w^2_1+w^2_2+5$的函数图形，而下面部分则为函数$J(w_1,w_2)$ 的等高线。也就是说，其实等高线就是函数$J(w_1,w_2)$ 向下的垂直投影，而所谓等高指的就是投影中任意一个环所代表的函数值均相等。反映在3D图形上就是，在曲面上总能找到一个闭环，使得环上每一点的函数值$J(w_1,w_2)$都相等，即距离谷底的高度都相同。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-2.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-4 等高线投影图形&lt;/center&gt;&#xA;&lt;p&gt;如图4-5所示，同样为函数$J(w_1,w_2)=w^2_1+w^2_2+5$的等高线图，只不过这次将它展示在二维平面。在图4-5中，任意一个环所代表的是不同$(w_1,w_2)$取值下相等的函数值，同时可以看到中心点为$J(0,0)$对应的函数值为$5$，通常这是通过梯度下降进行求解的最优点。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-3.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-5 等高线图形&lt;/center&gt;&#xA;&lt;h2 id=&#34;422-梯度与等高线&#34;&gt;4.2.2 梯度与等高线&lt;a class=&#34;anchor&#34; href=&#34;#422-%e6%a2%af%e5%ba%a6%e4%b8%8e%e7%ad%89%e9%ab%98%e7%ba%bf&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;由于梯度的方向始终与等高线保持垂直，所以理想情况下不管随机初始点选在何处，我们都希望梯度下降算法能沿着类似如图4-6左边所示的方式达到最低点，而非右边的情形。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;600&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-4.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-6 梯度下降方向图形&lt;/center&gt;&#xA;&lt;p&gt;可以看出，若同时使用梯度下降算法来优化图4-6左右两边所代表的目标函数，则显然在左边的情形下能够以更快的速度收敛得到最优解。同时，从右图可以看出，若$w_1$和$w_2$分别同时增加若干个单位，则增加$w_2$所带来的函数增量要远大于$w_1$。例如，当初始点$(w_1=0,w_2=0)$时，$w_1$从$0$变化至$3$的函数增量$J(3,0)$要远远小于$w_2$从$0$变化至$3$的函数增量$J(0,3)$，前者约等于$1.5$，而后者约等于$12$。那什么样的目标函数会使等高线呈现出椭圆形的环状现象呢？答案就是，若不同特征维度之间的范围差异过大便会出现如图4-6右边所示的椭圆形等高线，具体分析将在4.2.3节中进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;在本节内容伊始，我们便直接给出了梯度垂直于等高线的结论，下面先来大致分析一下梯度为什么会垂直于等高线。&lt;/p&gt;&#xA;&lt;p&gt;设$f(x,y)=c$为平面上任意曲线，又由于曲线$F(x,y)=f(x,y)-c=0$的法向量为$n=\{F_x,F_y\}=\nabla F$。故，曲线$F(x,y)$的法向量为$m=\{{{f}_{x}},{{f}_{y}}\}$。可以发现，曲线$F(x,y)$也就是$f(x,y)=c$的法向量$m$正好就是曲线$f(x,y)=c$对应的梯度，所以可以得出梯度垂直于曲线（等高线）的结论。&lt;/p&gt;&#xA;&lt;p&gt;如图4-7所示，已知曲线$f(x,y)=(x-2)^2+y^2-1=0$，因此其在$P$点的梯度$m=\{2(x-2),2y\}{{|}_{p}}$。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-5.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-7 曲线切线图形&lt;/center&gt;&#xA;&lt;p&gt;又因为曲线$y=\sqrt{1-{{(x-2)}^{2}}}$在$P$的斜率为&#xA;&lt;/p&gt;&#xA;$$&#xA;k=\frac{2-x}{\sqrt{1-{{(x-2)}^{2}}}}\tag{4-1}&#xA;$$&lt;p&gt;&#xA;将$y=\sqrt{1-{{(x-2)}^{2}}}$代入式(4-1)得&lt;/p&gt;&#xA;$$&#xA;k=(2-x)/y\tag{4-2}&#xA;$$&lt;p&gt;所以曲线$y=\sqrt{1-(x-2)^2}$过点$P$切线的一个方向向量为$n=\{(y,2-x)\}{{|}_{P}}$。&lt;/p&gt;&#xA;&lt;p&gt;注： 若直线斜率为$k$，则它的一个方向向量为$(1,k)$。&lt;/p&gt;&#xA;&lt;p&gt;由此可得&#xA;&lt;/p&gt;&#xA;$$&#xA;m\cdot n=\{2(x-2),2y\}{{|}_{P}}\cdot \{(y,2-x)\}{{|}_{P}}=0\tag{4-3}&#xA;$$&lt;p&gt;&#xA;所以有$m\bot n$，即曲线$f(x,y)=(x-2)^2+y^2-1=0$在任意一点的梯度$m$均垂直于曲线$f(x,y)$，因此，只有每次均沿着垂直于等高线的方向移动才能以最快的速度到达或远离原点，如图4-8所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-6.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-8 最速上升下降图形&lt;/center&gt;&#xA;&lt;h2 id=&#34;423-标准化方法&#34;&gt;4.2.3 标准化方法&lt;a class=&#34;anchor&#34; href=&#34;#423-%e6%a0%87%e5%87%86%e5%8c%96%e6%96%b9%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 线性回归&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;以线性回归为例，假设某线性回归模型为$\hat{y}=w_1x_1+w_2x_2$，且$x_1\in[0,1],x_2\in[10,100]$，则此时便有以下目标函数（暂时忽略$b$）：&#xA;&lt;/p&gt;&#xA;$$&#xA;J({{w}_{1}},{{w}_{2}})=\frac{1}{2}\sum\limits_{i=1}^{m}{{{\left( {{y}^{(i)}}-({{w}_{1}}x_{1}^{(i)}+{{w}_{2}}x_{2}^{(i)}) \right)}^{2}}}\tag{4-4}&#xA;$$&lt;p&gt;&#xA;从式(4-4)可以看出，由于$x_2\gg x_1$，所以当$x_1$和$x_2$产生相同的增量时，后者能产生更大的函数变化值，而这就引发了如图4-6右边所示“椭圆形”的环状等高线。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 逻辑回归&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;从上面的分析可以得知，在线性回归中若各个特征变量之间的取值范围差异较大，则会导致目标函数收敛速度慢等问题。换句话说只有所有特征变量的取值都在类似的范围，便不会出现这样的问题。在逻辑回归中又会有什么样的影响呢？由于在逻辑回归中，特征组合的加权和会作用于Sigmoid()函数，所以影响目标函数收敛的因素除了上述因素外，更主要的还会取决于$z$的大小。&lt;/p&gt;&#xA;&lt;p&gt;如图4-9所示，黑色实线为$g(z)$的函数图像，黑色虚线为$g(z)\prime$的函数图形。可以明显地看出，当$z&lt;-5$或者$z&gt;5$时，$g(z)\prime\approx 0$，这就意味着此时目标函数关于各个参数的梯度趋于0，从而使参数在梯度下降过程中无法得到更新（或更新非常缓慢）。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-7.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-9 Sigmoid及其导数图形&lt;/center&gt;&#xA;&lt;p&gt;综上所述，在进行建模之前都应该对数据进行标准化。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.3过拟合</title>
				<link>https://mlwithme.github.io/ml/chapter04/ca091dc393a84518/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter04/ca091dc393a84518/</guid>
				<description>&lt;h1 id=&#34;43过拟合&#34;&gt;4.3过拟合&lt;a class=&#34;anchor&#34; href=&#34;#43%e8%bf%87%e6%8b%9f%e5%90%88&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在4.2节中，我们以线性回归和逻辑回归为例详细介绍了为什么需要对特征维度进行标准化，以及不进行标准化会带来什么样的后果。接下来，我们继续介绍机器学习中其它改善模型的方法和策略。&lt;/p&gt;&#xA;&lt;h2 id=&#34;431模型拟合&#34;&gt;4.3.1模型拟合&lt;a class=&#34;anchor&#34; href=&#34;#431%e6%a8%a1%e5%9e%8b%e6%8b%9f%e5%90%88&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在2.5节内容中，我们首次引入了梯度下降算法并以此来最小化线性回归中的目标函数，在经过多次迭代后便可以求解得到模型中对应的参数。此时可以发现，模型的参数是一步一步根据梯度下降算法更新而来，直至目标函数收敛，也就是说这是一个循序渐进的过程，因此，这一过程也被称作是拟合（Fitting）模型参数的过程，当这个过程执行结束后就会产生3种状态，即过拟合（Overfitting）、恰拟合（Goodfitting）和欠拟合（Underfitting）。&lt;/p&gt;&#xA;&lt;p&gt;进一步，在线性回归中我们介绍了几种评估回归模型常用的指标，但现在有一个问题： 当MAE或者RMSE越小时就代表模型越好吗？还是说在某种条件下其越小就越好呢？细心的读者可能一眼便明了，肯定是有条件下的越小所对应的模型才越好。那这其中到底是怎么回事呢？&lt;/p&gt;&#xA;&lt;p&gt;假设现在有一批样本点，它本是由函数$sin(x)$生成（现实中并不知道）的，但由于其他因素的缘故，使我们得到的样本点并没有准确地落在曲线$sin(x)$上，而是分布在其附近，如图4-14所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-11.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-14 正弦样本点图形&#xA;&lt;/center&gt;&#xA;如图4-14所示，黑色圆点为训练集，黑色曲线为真实的数据分布曲线。现在需要根据训练集来建立并训练模型，然后得到相应的预测函数。假如分别用degree=1、5、10来对这12个样本点进行建模（degree表示多项式的最高次数），那么便可以得到如图4-15所示的结果。&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-12.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图4-15正弦样本点拟合图形&#xA;&lt;/center&gt;&#xA;&lt;p&gt;从图4-15中可以看出，随着多项式次数的增大，$R^2$指标的值也越来越大（$R^2$的值越大预示着模型就越好），并且当次数设置为10的时候，$R^2$达到了1.0，但是最后就应该选degree=10对应的这个模型吗？&lt;/p&gt;&#xA;&lt;p&gt;假如不知过了多久，突然一名客户要买你的这个模型进行商业使用，同时客户为了评估这个模型的效果自己又带来了一批新的含标签的数据（虽然这个模型已经用$R^2$测试过，但客户并不会完全相信，万一你对这个模型作弊呢）。于是你拿着客户的新数据（也是由$sin(x)$所生成的），然后分别用上面的3个模型进行预测，并得到了如图4-16所示的可视化结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-13.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 4-16 正弦样本点过拟合图形&#xA;&lt;/center&gt;&#xA;如图4-16所示，各个曲线表示根据新样本预测值绘制得到的结果。此时令你感到奇怪的是，为什么当degree=5时的结果居然会好于degree=10时模型的结果，问题出在哪里？其原因在于，当第1次通过这12个样本点进行建模时，为了尽可能地使“模型好（表现形式为$R^2$尽可能大）”而使用了非常复杂的模型，尽管最后每个训练样本点都“准确无误”地落在了预测曲线上，但是这却导致最后模型在新数据上的预测结果严重地偏离了其真实值。&#xA;&lt;h2 id=&#34;432-过拟合与欠拟合&#34;&gt;4.3.2 过拟合与欠拟合&lt;a class=&#34;anchor&#34; href=&#34;#432-%e8%bf%87%e6%8b%9f%e5%90%88%e4%b8%8e%e6%ac%a0%e6%8b%9f%e5%90%88&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在机器学习中，通常将建模时所使用的数据叫做训练集（Training Dataset），例如图4-14中的12个样本点。将测试时所使用的数据集叫做测试集（Testing Dataset）。同时把模型在训练集上产生的误差叫做训练误差（Training Error），把模型在测试集上产生的误差叫做测试误差（Testing Error）或泛化误差（Generalization Error），最后也将整个拟合模型的过程称作训练（Training）[7]。&lt;/p&gt;&#xA;&lt;p&gt;进一步讲，将4.3.1节中degree=10时所产生的现象叫做过拟合（Overfitting），即模型在训练集上的误差很小，但在测试集上的误差却很大，也就是泛化能力弱； 相反，将其对立面degree=1时所产生的现象叫做欠拟合（Underfitting），即模型训练集和测试集上的误差都很大； 同时，将degree=5时的现象叫做恰拟合（Goodfitting），即模型在训练集和测试集上都有着不错的效果。&lt;/p&gt;&#xA;&lt;p&gt;同时，需要说明的是，在4.3.1节中我们仅仅以多项式回归为例来向读者直观地介绍了什么是过拟合与欠拟合，但并不代表这种现象只出现在线性回归中，事实上所有的机器学习模型都会存在着这样的问题，因此一般来讲，所谓过拟合现象指的是模型在训练集上表现很好，而在测试集上表现却糟糕，欠拟合现象是指模型在两者上的表现都十分糟糕，而恰拟合现象是指模型在训练集上表现良好（尽管可能不如过拟合时好），但同时在测试集上也有着不错的表现。&lt;/p&gt;&#xA;&lt;h2 id=&#34;433-解决欠拟合与过拟合问题&#34;&gt;4.3.3 解决欠拟合与过拟合问题&lt;a class=&#34;anchor&#34; href=&#34;#433-%e8%a7%a3%e5%86%b3%e6%ac%a0%e6%8b%9f%e5%90%88%e4%b8%8e%e8%bf%87%e6%8b%9f%e5%90%88%e9%97%ae%e9%a2%98&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 如何解决欠拟合问题&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;经过上面的描述我们已经对欠拟合有了一个直观的认识，所谓欠拟合就是训练出来的模型根本不能较好地拟合现有的训练数据。要解决欠拟合问题相对来讲较为简单，主要分为以下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) 减小正则化系数，当模型出现欠拟合现象时，可以通过减小正则化中的惩罚系数来减缓欠拟合现象，这一点将在4.4节中进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 如何解决过拟合问题&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于如何有效地缓解模型的过拟合现象，常见的做法主要分为以下4种方法：&lt;/p&gt;&#xA;&lt;p&gt;(1) 收集更多数据，这是一个最为有效但实际操作起来又是最为困难的一种方法。训练数据越多，在训练过程中也就越能够纠正噪声数据对模型所造成的影响，使模型不易过拟合，但是对于新数据的收集往往有较大的困难。&lt;/p&gt;&#xA;&lt;p&gt;(2) 降低模型复杂度，当训练数据过少时，使用较为复杂的模型极易产生过拟合现象，例如4.3.1节中的示例，因此可以通过适当减少模型的复杂度来达到缓解模型过拟合的现象。&lt;/p&gt;&#xA;&lt;p&gt;(3) 正则化方法，在出现过拟合现象的模型中加入正则化约束项，以此来降低模型过拟合的程度，这部分内容将在4.4节中进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;(4) 集成方法，将多个模型集成在一起，以此来达到缓解模型过拟合的目的，这部分内容将在第9章中进行介绍。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 如何避免过拟合&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;为了避免训练出来的模型产生过拟合现象，在模型训练之前一般会将获得的数据集划分成两部分，即训练集与测试集，且两者一般为7∶3的比例。其中训练集用来训练模型（降低模型在训练集上的误差），然后用测试集来测试模型在未知数据上的泛化误差，观察是否产生了过拟合现象 [8]。&lt;/p&gt;&#xA;&lt;p&gt;但是由于一个完整的模型训练过程通常会先用训练集训练模型，再用测试集测试模型，而绝大多数情况下不可能第1次就选择了合适的模型，所以又会重新设计模型（如调整多项式次数等）进行训练，然后用测试集进行测试，因此在不知不觉中，测试集也被当成了训练集在使用，所以这里还有另外一种数据的划分方式，即训练集、验证集（Validation Data）和测试集，且一般为7∶2∶1的比例，此时的测试集一般通过训练集和验证集选定模型后做最后测试所用。&lt;/p&gt;&#xA;&lt;p&gt;实际训练中应该选择哪种划分方式呢？这一般取决于训练者对模型的要求程度。如果要求严苛就划分为3份，如果不那么严格，则可以划分为2份，也就是说这两者并没硬性的标准。&lt;/p&gt;&#xA;&lt;h2 id=&#34;434-小结&#34;&gt;4.3.4 小结&lt;a class=&#34;anchor&#34; href=&#34;#434-%e5%b0%8f%e7%bb%93&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在这节中，我们首先介绍了什么是拟合，进而介绍了拟合后带来的3种状态，即欠拟合、恰拟合与过拟合，其中恰拟合的模型是我们最终所需要的结果。接着，我们介绍了解决欠拟合与过拟合的几种方法，其中解决过拟合的两种具体方法将在后续的内容中分别进行介绍。最后，我们还介绍了两种方法来划分数据集，以尽可能避免产生模型过拟合的现象。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.4 正则化</title>
				<link>https://mlwithme.github.io/ml/chapter04/5097d3b8c1144427/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter04/5097d3b8c1144427/</guid>
				<description>&lt;h1 id=&#34;44-正则化&#34;&gt;4.4 正则化&lt;a class=&#34;anchor&#34; href=&#34;#44-%e6%ad%a3%e5%88%99%e5%8c%96&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;从4.3节的内容可以知道，模型产生过拟合的现象表现为在训练集上误差较小，而在测试集上误差较大，并且我们还讲到之所以会产生过拟合现象是由于训练数据中可能存在一定的噪声，而我们在训练模型时为了尽可能地做到拟合每个样本点（包括噪声），往往就会使用较为复杂的模型。最终使训练出来的模型在很大程度上受到了噪声数据的影响，例如真实的样本数据可能更符合一条直线，但是由于个别噪声的影响使训练出来的是一条曲线，从而使模型在测试集上表现糟糕，因此，可以将这一结果看作由糟糕的训练集导致了糟糕的泛化误差，但仅仅从过拟合的表现形式来看糟糕的测试集（噪声多）也可能导致糟糕的泛化误差。在接下来的内容中，我们将分别从这两个角度来介绍正则化（Regularization）方法中最常用的$\mathcal{l}_2$正则化是如何来解决这一问题的。&lt;/p&gt;&#xA;&lt;p&gt;这里还是以线性回归为例，我们首先来看在线性回归的目标函数后面再加上一个$\mathcal{l}_2$正则化项项的形式，即&#xA;&lt;/p&gt;&#xA;$$&#xA;J=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {{y}^{(i)}}-(\sum\limits_{j=1}^{n}{{{w}_{j}}x_{j}^{(i)}}+b) \right)}^{2}}}+\frac{\lambda }{2n}\sum\limits_{j=1}^{n}{{{({{w}_{j}})}^{2}}};\;\;(\lambda &gt;0)\tag{4-7}&#xA;$$&lt;p&gt;&#xA;在式(4-7)中的第2项便是新加入的$\mathcal{l}_2$正则化项（Regularization Term），同时我们也称包含$\mathcal{l}_2$正则化项的线性回归为岭回归（Ridge Regression）。&lt;/p&gt;&#xA;&lt;p&gt;根据2.1.3节中的内容可知，当真实值与预测值之间的误差越小（表现为损失值趋于0）时，也就代表着模型的预测效果越好，并且可以通过最小化目标函数来达到这一目的。由式(4-7)可知，为了最小化目标函数$J$，第2项的结果也必将逐渐地趋于0。这使最终优化求解得到的$w_j$均会趋于0附近，进而得到一个平滑的预测模型。这样做的好处是什么呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;441-测试集导致的泛化误差&#34;&gt;4.4.1 测试集导致的泛化误差&lt;a class=&#34;anchor&#34; href=&#34;#441-%e6%b5%8b%e8%af%95%e9%9b%86%e5%af%bc%e8%87%b4%e7%9a%84%e6%b3%9b%e5%8c%96%e8%af%af%e5%b7%ae&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;所谓测试集导致糟糕的泛化误差是指训练集本身没有多少噪声，但由于测试集含有大量噪声，使训练出来的模型在测试集上没有足够的泛化能力，而产生了较大的误差。这种情况可以看作模型过于准确而出现了过拟合现象。正则化方法是怎样解决这个问题的呢？&#xA;&lt;/p&gt;&#xA;$$&#xA;y=\sum\limits_{j=1}^{n}{{{x}_{j}}}{{w}_{j}}+b\tag{4-8}&#xA;$$&lt;p&gt;&#xA;假如式(4-8)所代表的模型就是根据式(4-7)中的目标函数训练而来的，此时当某个新输入样本（含噪声）的某个特征维度由训练时的$x_j$变成了现在的$(x_j+\Delta x_j)$，那么其预测输出就由训练时的$\hat{y}$变成了现在的$\hat{y}+\Delta x_jw_j$，即产生了$\Delta x_jw_j$的误差，但是，由于$w_j$接近于$0$附近，所以这使模型最终只会产生很小的误差。同时，如果$w_j$越接近于$0$，则产生的误差就会越小，这意味着模型越能够抵抗噪声的干扰，在一定程度上越能提升模型的泛化能力 [9]。&lt;/p&gt;&#xA;&lt;p&gt;由此便可以知道，通过在原始目标函数中加入正则化项，便能够使训练得到的参数趋于平滑，进而能够使模型对噪声数据不再那么敏感，缓解了模型的过拟合现象。&lt;/p&gt;&#xA;&lt;h2 id=&#34;442-训练集导致的泛化误差&#34;&gt;4.4.2 训练集导致的泛化误差&lt;a class=&#34;anchor&#34; href=&#34;#442-%e8%ae%ad%e7%bb%83%e9%9b%86%e5%af%bc%e8%87%b4%e7%9a%84%e6%b3%9b%e5%8c%96%e8%af%af%e5%b7%ae&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;所谓训练集导致糟糕的泛化误差是指，由于训练集中包含了部分噪声，导致我们在训练模型的过程中为了能够尽可能地最小化目标函数而使用了较为复杂的模型，使最终得到的模型并不能在测试集上有较好的泛化能力，但这种情况完全是因为模型不合适而出现了过拟合的现象，而这也是最常见的过拟合的原因。$\mathcal{l}_2$正则化方法又是如何做到在训练过程中就能够降低模型对噪声数据的敏感度的呢？为了便于后面的理解，我们先从图像上来直观地理解一下$\mathcal{l}_2$正则化到底对目标函数做了什么。&lt;/p&gt;&#xA;&lt;p&gt;如图4-17所示，左右两边黑色实线为原始目标函数，黑色虚线为添加$\mathcal{l}_2$正则化后的目标函数。可以看出黑色实线的极值点均发生了明显改变，并且不约而同地都更靠近原点。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;440&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-14.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;text-align: center;&#34;&gt;&#xA;  图 4-17 $\mathcal{l}_2$正则化图形&#xA;&lt;/div&gt;&#xA;&lt;p&gt;再来看一张包含两个参数的目标函数在加入$\mathcal{l}_2$正则化后的结果，如图4-18所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-15.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;text-align: center;&#34;&gt;&#xA;  图 4-18 $\mathcal{l}_2$正则化投影图形&#xA;&lt;/div&gt;&#xA;&lt;p&gt;如图4-18所示，图中黑色虚线为原始目标函数的等高线，黑色实线为施加正则化后目标函数的等高线。可以看出，目标函数的极值点同样也发生了变化，从原始的$(0.5,0.5)$变成了$(0.0625,0.25)$，而且也更靠近原点（$w_1$和$w_2$变得更小了）。到此我们似乎可以发现，正则化能够使原始目标函数极值点发生改变，并且同时还有使参数趋于0的作用。事实上也正是因为这个原因才使$\mathcal{l}_2$正则化具有缓解过拟合的作用，但原因在哪里呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;443-正则化原理&#34;&gt;4.4.3 $\mathcal{l}_2$正则化原理&lt;a class=&#34;anchor&#34; href=&#34;#443-%e6%ad%a3%e5%88%99%e5%8c%96%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;以目标函数${{J}_{1}}=1/6{{({{w}_{1}}-0.5)}^{2}}+{{({{w}_{2}}-0.5)}^{2}}$为例，其取得极值的极值点为$(0.5,0.5)$，且$J_1$在极值点处的梯度为$(0,0)$。当对其施加正则化项$R=(w_1^2+w_2^2)$后，由于$R$的梯度方向是远离原点的（因为$R$为一个二次曲面），所以给目标函数加入正则化，实际上等价于给目标函数施加了一个远离原点的梯度。通俗点讲，正则化给原始目标函数的极值点施加了一个远离原点的梯度（甚至可以想象成施加了一个力的作用），因此，这也就意味着对于施加正则化后的目标函数$J_2=J_1+R$来讲，因为最小化是取负梯度方向所以$J_2$的极值点$(0.0625,0.25)$相较于$J_1$的极值点$(0.5,0.5)$更加靠近于原点，而这也就是$\mathcal{l}_2$正则化本质之处。&lt;/p&gt;&#xA;&lt;p&gt;假如有一个模型$A$，它在含有噪声的训练集上表示异常出色，使目标函数$J_1(\hat{w})$的损失值等于$0$（也就是拟合到了每个样本点），即在$w=\hat{w}$处取得了极值。现在，我们在$J_1$的基础上加入$\mathcal{l}_2$正则化项构成新的目标函数$J_2$，然后来分析一下通过最小化$J_2$求得的模型$B$到底产生了什么样的变化。&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; {{J}_{1}}=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {{y}^{(i)}}-(\sum\limits_{j=1}^{n}{{w}_{j}}{x_{j}^{(i)}}+b) \right)}^{2}}} \\[1ex] &#xA; &amp; {{J}_{2}}={{J}_{1}}+\frac{\lambda }{2n}\sum\limits_{j=1}^{n}{{{({{w}_{j}})}^{2}}};\;\;(\lambda &gt;0) \\ &#xA;\end{aligned}\tag{4-9}&#xA;$$&lt;p&gt;&#xA;从式(4-9)可知，由于$J_2$是由$J_1$加正则化项构成的，同时根据先前的铺垫可知，$J_2$将在离原点更近的极值点$w=\tilde{w}$处取得$J_2$的极值，即通过最小化含正则化项的目标函数$J_2$，将得到$w=\tilde{w}$这个最优解，但是需要注意，此时的$w=\tilde{w}$将不再是$J_1$的最优解，即$J_1(\tilde{w})\neq0$，因此通过最小化$J_2$求得的最优解$w=\tilde{w}$将使$J_1(\tilde{w})&gt;J_1(\hat{w})$，而这就意味着模型$B$比模型$A$更简单了，也就代表着从一定程度上缓解了$A$的过拟合现象。&lt;/p&gt;&#xA;&lt;p&gt;同时，由式(4-7)可知，通过增大参数$\lambda$的取值可以对应增大正则化项所对应的梯度，而这将使最后求解得到更加简单的模型（参数值更加趋近于0）。也就是$\lambda$越大，一定程度上越能缓解模型的过拟合现象，因此，参数$\lambda$又叫做惩罚项（Penalty Term）或者惩罚系数。&lt;/p&gt;&#xA;&lt;p&gt;最后，从上面的分析可知，在第一种情况中$\mathcal{l}_2$正则化可以看作使训练好的模型不再对噪声数据那么敏感，而对于第二种情况来讲，$\mathcal{l}_2$正则化则可以看作使模型不再那么复杂，但其实两者的原理归结起来都是一回事，那就是通过较小的参数取值，使模型变得更加简单。&lt;/p&gt;&#xA;&lt;p&gt;另外值得注意的一点是，很多读者对于复杂模型存在着一个误解。认为高次数多项式表示的模型一定比低次数多项式表示的模型复杂，例如5次多项式就要比2次多项式复杂，但高次项代表的仅仅是更大的模型空间，其中既包含了复杂模型，同时也包含了简单模型。只需将复杂模型对应位置的权重参数调整到更接近于0便可以对其进行简化。如图4-19所示，如果仅从幂次来看，两个模型同样“复杂”，但实际上虚线对应模型的复杂度要远大于实线对应模型的复杂度。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-16.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;text-align: center;&#34;&gt;&#xA;  图 4-19 模型空间图形&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;444-正则化中的参数更新&#34;&gt;4.4.4 $\mathcal{l}_2$正则化中的参数更新&lt;a class=&#34;anchor&#34; href=&#34;#444-%e6%ad%a3%e5%88%99%e5%8c%96%e4%b8%ad%e7%9a%84%e5%8f%82%e6%95%b0%e6%9b%b4%e6%96%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在给目标函数施加正则化后也就意味着其关于参数的梯度发生了变化。不过幸运的是正则化是被加在原有目标函数中，因此其关于参数$W$的梯度也只需加上惩罚项中对应参数的梯度即可，同时关于偏置$b$的梯度并没有改变。下面我们就总结一下线性回归和逻辑回归算法加上$\mathcal{l}_2$正则化后的变化。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.5 偏差、方差与交叉验证</title>
				<link>https://mlwithme.github.io/ml/chapter04/3c7eee1621d4480b/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter04/3c7eee1621d4480b/</guid>
				<description>&lt;h1 id=&#34;45-偏差方差与交叉验证&#34;&gt;4.5 偏差、方差与交叉验证&lt;a class=&#34;anchor&#34; href=&#34;#45-%e5%81%8f%e5%b7%ae%e6%96%b9%e5%b7%ae%e4%b8%8e%e4%ba%a4%e5%8f%89%e9%aa%8c%e8%af%81&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在第4.4节中，我们介绍了什么是正则化，以及正则化为什么能够缓解过拟合的原理。同时我们知道，越是复杂的模型越可能产生过拟合的现象，这也就为模型在其他未知数据集上的预测带来了误差，但是这些误差来自哪里，又是怎么产生的呢？知道这些误差的来源后对改善我们的模型有什么样的帮助呢？接下来我们就来介绍关于误差分析及模型选择的若干方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;451-偏差与方差定义&#34;&gt;4.5.1 偏差与方差定义&lt;a class=&#34;anchor&#34; href=&#34;#451-%e5%81%8f%e5%b7%ae%e4%b8%8e%e6%96%b9%e5%b7%ae%e5%ae%9a%e4%b9%89&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在机器学习的建模中，模型的误差普遍来自于偏差（Bias）或方差（Variance）。什么是偏差与方差呢？&lt;/p&gt;&#xA;&lt;p&gt;如图4-23所示 [12]，假设你拿着一把枪射击红色的靶心，在你连打数十枪后出现了以下4种情况：&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;（4）子弹都散落在靶心旁边的位置，这就是典型的方差大（子弹散乱），偏差大（距离靶心远）。&lt;/p&gt;&#xA;&lt;p&gt;由此可知，偏差描述的是预测值的期望与真实值之间的差距，即偏差越大，越偏离真实值，如图4-23第2行所示。方差描述的是预测值之间的变化范围和离散程度，也就是离其期望值的距离，即方差越大数据的分布越分散，如图4-23右列所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;280&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-18.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 4-23 偏差与方差&lt;/center&gt;&#xA;&lt;h2 id=&#34;452-模型的偏差与方差&#34;&gt;4.5.2 模型的偏差与方差&lt;a class=&#34;anchor&#34; href=&#34;#452-%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%81%8f%e5%b7%ae%e4%b8%8e%e6%96%b9%e5%b7%ae&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;上面介绍了什么是偏差与方差，那么这4种情况又对应于机器学习中的哪些场景呢？通常来讲，一个简单的模型会带来比较小的方差（Low Variance），而复杂的模型会带来比较大的方差（High Variance）。这是由于简单的模型不容易受到噪声的影响，而复杂的模型（例如过拟合）容易受到噪声的影响而产生较大的误差。一个极端的例子，$\hat{y}=C$这个模型不管输入是什么，输出都是常数$C$，那么其对应的方差就会是0。对于偏差来讲，一个简单的模型容易产生较高的偏差（High Bias），而复杂的模型容易产生较低的偏差（Low Bias），这是由于越复杂的模型越容易拟合更多的样本。&lt;/p&gt;&#xA;&lt;p&gt;如图4-24所示为模型的偏差、方差与模型复杂度的变化情况。从图中可以看出，方差随着模型的复杂度增大而上升，偏差与之恰好相反。同时，如果一个模型的主要误差来自于较大的方差，则这个模型呈现出的就是过拟合的状态，而当一个模型的主要误差来自于较大的偏差时，此时模型呈现出的就是欠拟合状态。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;320&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-19.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图4-24模型偏差与方差&#xA;&lt;/center&gt;&#xA;&lt;p&gt;总结来讲，模型的高方差与高偏差分别对应于过拟合与欠拟合。如果一个模型不能很好地拟合训练样本，则此时模型呈现的就是高偏差（欠拟合）的状态。 如果能够很好地拟合训练样本，但是在测试集上有较大的误差，这就意味着此时模型出现了高方差（过拟合）的状态，因此，当模型出现这类情况时，我们完全可以按照前面处理过拟合与欠拟合的方法对模型进行改善，然后在这两者之间寻找平衡。&lt;/p&gt;&#xA;&lt;h2 id=&#34;453-超参数选择&#34;&gt;4.5.3 超参数选择&lt;a class=&#34;anchor&#34; href=&#34;#453-%e8%b6%85%e5%8f%82%e6%95%b0%e9%80%89%e6%8b%a9&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在之前的介绍中，我们知道了模型中的权重参数可以通过训练集利用梯度下降算法求解得到，但超参数又是什么呢？所谓超参数（Hyper Parameter）是指那些不能通过数据集训练得到的参数，但它的取值同样会影响最终模型的效果，因此同样重要。到目前为止，我们一共接触过了3个超参数，只是第一次出现的时候我们并没有提起其名字，在这里再做一个细致的总结。这3个超参数分别是： 惩罚系数$\lambda$、学习率$\alpha$ 及特征映射时多项式的次数，其中最为重要的是前面两个。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 惩罚系数$\lambda$&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;从4.4节内容中对正则化的介绍可知，$\lambda$越大也就意味着对模型的惩罚力度越大，最终训练得到的模型也就相对越简单，因此，在模型的训练过程中，也需要选择一个合适的$\lambda$来使模型的泛化能力尽可能好。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 学习率$\alpha$&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在介绍线性回归的求解过程中，我们首次介绍了梯度下降算法，如式(4-26)所示。&#xA;&lt;/p&gt;&#xA;$$&#xA;W=W-\alpha \cdot \frac{\partial J}{\partial W}\tag{4-26}&#xA;$$&lt;p&gt;&#xA;并且讲过，$\alpha$ 的作用是用来控制每次向前跳跃的距离，较大的$\alpha$可以更快地跳到谷底并找到最优解，但是过大的$\alpha$同样能使目标函数在峡谷的两边来回振荡，以至于需要多次迭代才可以得到最优解，不过也可能得不到最优解。&lt;/p&gt;&#xA;&lt;p&gt;如图4-25所示为相同模型采用不同学习率后，经梯度下降算法在同一初始位置优化后的结果，其中黑色五角星表示全局最优解（Global Optimum），ite表示迭代次数。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;600&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-20.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-25 凸函数优化过程&lt;/center&gt;&#xA;&lt;p&gt;从图4-25可以看出，当学习率为0.4时，模型大概在迭代12次后就基本达到了全局最优解附近。当学习率为3.5时，模型在大约迭代12次后同样能够收敛于全局最优解附近，但是，当学习率为4.1时，此时的模型已经处于了发散状态。可以发现，由于模型的目标函数为凸形函数（例如线性回归），所以尽管使用了较大的学习率3.5，目标函数依旧能够收敛，但在后面的学习过程中，遇到更多的情况便是非凸型的目标函数，此时的模型对于学习率的大小将会更加敏感。&lt;/p&gt;&#xA;&lt;p&gt;如图4-26所示为一个非凸形的目标函数，三者均从同一初始点开始进行迭代优化，只是各自采用了不同的学习率。其中黑色五角星表示全局最优解，ite表示迭代次数。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;600&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-21.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-26 非凸形函数优化过程&lt;/center&gt;&#xA;&lt;p&gt;从图4-26可以看出，当采用较小的学习率0.02时，模型在迭代20次后陷入了局部最优解（Local Optimum），并且可以知道此时无论再继续迭代多少次，其依旧会收敛于此处，因为此时的梯度已经开始接近于0，而使参数无法得到更新。当采用较大一点的学习率0.4时，模型在迭代4次后便能收敛于全局最优解附近。当采用学习率为0.6时，模型在这20次的迭代过程中总是来回振荡，并且没有一次接近于全局最优解。&lt;/p&gt;&#xA;&lt;p&gt;从上面两个示例的分析可以得出，学习率的大小对于模型的收敛性及收敛速度有着严重的影响，并且非凸函数在优化过程中对于学习率的敏感性更大。同时值得注意的是，所谓学习率过大或者过小，在不同模型间没有可比性。例如在上面凸函数的图示中学习率为0.4时可能还算小，但是在非凸函数的这个例子中0.4已经算是相对较大了。&lt;/p&gt;&#xA;&lt;p&gt;经过上面的介绍，我们明白了超参数对于模型最终的性能有着重要的影响。那到底应该如何选择这些超参数呢？对于超参数的选择，首先可以列出各个参数的备选取值，例如$\alpha=[0.001,0.03,0.1,0.3,1]$，$\lambda=[0.1,0.3,1,3,10]$，然后根据不同的超参数组合训练得到不同的模型（例如这里就有25个备选模型），然后通过4.5.4节所介绍的交叉验证来确立模型。不过这一整套步骤sklearn中也有现成的类方法可供使用，并且使用起来也非常方便，在4.6节中将会通过一个详细的示例进行说明。不过随着介绍的模型越来越复杂，就会出现更多的超参数组合，训练一个模型也会花费一定的时间，因此，对于模型调参的一个基本要求就是要理解各个参数的含义，这样才可能更快地排除不可能的参数取值，以便于更快地训练出可用的模型。&lt;/p&gt;&#xA;&lt;h2 id=&#34;454-模型选择&#34;&gt;4.5.4 模型选择&lt;a class=&#34;anchor&#34; href=&#34;#454-%e6%a8%a1%e5%9e%8b%e9%80%89%e6%8b%a9&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;当在对模型进行改善时，自然而然地就会出现很多备选模型，而我们的目的便是尽可能地选择一个较好的模型，以达到低偏差与低方差之间的平衡。该如何选择一个好的模型呢？通常来讲有两种方式： 第1种就是4.3.3节中介绍过的将整个数据集划分成3部份的方式； 第2种则是使用K折交叉验证（KFold Cross Validation）[9] 的方式。对于第1种方法来说，其步骤为先在训练集上训练不同的模型，然后在验证集上选择其中表现最好的模型，最后在测试集上测试模型的泛化能力。但是这种做法的缺点在于可能某一次数据集的划分结果具有较强的偶然性，导致模型表现出来的泛化误差不准确，因此可以通过K折交叉验证来解决。同时，在数据量有限的情况下，交叉验证还可以充分利用数据，让每个样本都有机会被用作训练集和验证集。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4.6 实例分析手写体识别</title>
				<link>https://mlwithme.github.io/ml/chapter04/c5957e0753d04746/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter04/c5957e0753d04746/</guid>
				<description>&lt;h1 id=&#34;46-实例分析手写体识别&#34;&gt;4.6 实例分析手写体识别&lt;a class=&#34;anchor&#34; href=&#34;#46-%e5%ae%9e%e4%be%8b%e5%88%86%e6%9e%90%e6%89%8b%e5%86%99%e4%bd%93%e8%af%86%e5%88%ab&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;经过前面几节的介绍，我们对模型的改善与泛化已经有了一定的认识。下面我们就通过一个实际的手写体分类任务进行示范，介绍一下常见的操作流程。同时顺便介绍一下sklearn和matplotlib中几种常见方法的使用，以下完整示例代码可参见&lt;code&gt;AllBooKCode/Chapter04/C20_digits_classification&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;461数据预处理&#34;&gt;4.6.1数据预处理&lt;a class=&#34;anchor&#34; href=&#34;#461%e6%95%b0%e6%8d%ae%e9%a2%84%e5%a4%84%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在4.1.3节中，我们详细介绍了为何需要对输入特征进行标准化操作，以及两种常见的标准化方法。接下来，就来详细介绍标准化在模型训练过程中的具体使用流程。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 载入并划分数据集&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先，载入模型训练时所需要的数据集。这里以sklearn中常见的手写体数据集&lt;code&gt;load_digits&lt;/code&gt;为例，它一共包含1797个样本共10个类别，每个样本包含64个特征维度，载入示例代码如下：&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;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;2&lt;/span&gt;     data &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_digits()&#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;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;data, data&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;target&#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;     x_train, x_test, y_train, y_test &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;         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;, random_state&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;20&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2~3行是载入原始数据的特征和标签；第4~5行是将训练集划分成两部分，其中&lt;code&gt;test_size=0.3&lt;/code&gt;表示测试集的比例为30%，&lt;code&gt;random_state=20&lt;/code&gt;表示设置一种状态值，它的作用是使每次划分的结果都一样但也可以设置其他值。在sklearn中对于包含随机操作的函数或者方法，一般都有这个参数，固定下来的目的是便于其他人复现结果。同时，如果需要将整个数据集划分成3份，只需要再次使用&lt;code&gt;train_test_split()&lt;/code&gt;方法对&lt;code&gt;x_train&lt;/code&gt;和&lt;code&gt;y_train&lt;/code&gt;进行对应比例的划分即可。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 样本可视化&lt;/strong&gt;&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;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;matplotlib.pyplot&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;plt&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;visualization&lt;/span&gt;(x):&#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;     images &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;reshape(&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 style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;)  &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# reshape成一张图片的形状&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;     fig, ax &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;subplots(&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;5&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;for&lt;/span&gt; i, axi &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;enumerate&lt;/span&gt;(ax&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;flat):&#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;         image &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; images[i]&#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;         axi&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;imshow(image)&#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;         axi&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;set(xticks&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;[], yticks&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;9&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;tight_layout()&#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;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行是导入matplotlib中的pyplot作图模块。第3行是将原始输入的形状从&lt;code&gt;[n,64]&lt;/code&gt;变形为&lt;code&gt;[n,8,8]&lt;/code&gt;，即原始的每张图片为一个64维的向量，在可视化时需要将其变成一个像素矩阵。第4行是行定义一个包含有3行5列的子图画布。第5~8行是循环展示每一张图片，其中第8行是去掉每个子图对应的横纵坐标轴。第9行是自适应各子图间的距离。第10行是对最后的结果进行可视化，结果如图4-28所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p4-23.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 4-28 手写体可视化&lt;/center&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 数据集标准化&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在完成数据集载入和划分以后，进一步需要对特征维度进行标准化并保存标准化过程中计算得到的相关参数。例如在以4.2.3节中介绍的去均值方法进行标准化时，就需要保存每个维度对应的均值和标准差。这里可以借助sklearn中的&lt;code&gt;StandardScaler&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.preprocessing&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; StandardScaler&#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; &#x9;&lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# 此处接 &amp;#34;1.载入并划分数据集&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;4&lt;/span&gt;     ss &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; StandardScaler()&#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;     x_train &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; ss&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit_transform(x_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;     x_test &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; ss&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;transform(x_test)&#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:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x_train, x_test, y_train, y_test&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行是导入取均值特征标准化模块。第4行用来定义4.2.3节中的去均值标准化方法实例对象。第5行是利用训练集来计算每个维度对应的均值和标准差，然后对训练集中每个特征维度进行标准化。第6行是利用在训练集上计算得到的均值和方差来对测试集中的每个维度进行标准化。如果这里再使用&lt;code&gt;.fit_transform()&lt;/code&gt;方法进行标准化，则是根据测试集中的参数来对测试集进行标准化，而这将严重影响模型在未来新数据上的泛化能力。第7行则是返回最后各部分的结果。&lt;/p&gt;</description>
			</item>
			<item>
				<title>引用</title>
				<link>https://mlwithme.github.io/ml/chapter04/a915e49586eb4426/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter04/a915e49586eb4426/</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] &lt;a href=&#34;https://en.wikipedia.org/wiki/Machine_learning&#34;&gt;https://en.wikipedia.org/wiki/Machine_learning&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[2] The Discipline of Machine Learning, Tom M.Mitchell, July 2006 CMUML06108.&lt;/p&gt;&#xA;&lt;p&gt;[3] &lt;a href=&#34;https://zh.wikipedia.org/zh/&#34;&gt;https://zh.wikipedia.org/zh/&lt;/a&gt;强化学习&lt;/p&gt;&#xA;&lt;p&gt;[4] &lt;a href=&#34;https://zh.wikipedia.org/wiki/&#34;&gt;https://zh.wikipedia.org/wiki/&lt;/a&gt;人工智能&lt;/p&gt;&#xA;&lt;p&gt;[5] &lt;a href=&#34;https://cloud.google.com/learn/artificial-intelligence-vs-machine-learning&#34;&gt;https://cloud.google.com/learn/artificial-intelligence-vs-machine-learning&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[6] Andrew Ng, Machine Learning,Stanford University, CS229, Spring 2019.&lt;/p&gt;&#xA;&lt;p&gt;[7] Ian Goodfellow,Yoshua Bengio,Aaron Courville.深度学习[M]. 赵申剑，黎彧君，符天凡，等译.北京： 人民邮电出版社，2007.&lt;/p&gt;&#xA;&lt;p&gt;[8] Andrew Ng,Machine Learning,Stanford University,CS229,Spring 2019.&lt;/p&gt;&#xA;&lt;p&gt;[9] Hungyi Lee,MachineLearning,National Taiwan University,2020,Spring.&lt;/p&gt;&#xA;&lt;p&gt;[10] 阿斯顿·张,李沐,扎卡里·C.立顿,等.动手学深度学习［M］.北京： 人民邮电出版社,2019.&lt;/p&gt;&#xA;&lt;p&gt;[11] Trevor Hastie, Robert Tibshirani, Jerome Friedman, The Elements of Statistical Learning, Second Edition, Springer Series in Statistics, Jan 13, 2017.&lt;/p&gt;&#xA;&lt;p&gt;[12] 图片来自 &lt;a href=&#34;http://scott.fortmannroe.com/docs/BiasVariance.html&#34;&gt;http://scott.fortmannroe.com/docs/BiasVariance.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[13] Natural Language Processing with Deep Learning, Stanford CS224N, Spring 2024.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
