<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 3 章 逻辑回归 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter03/</link>
		<description>Recent content in 第 3 章 逻辑回归 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter03/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>3.1 模型的建立与求解</title>
				<link>https://mlwithme.github.io/ml/chapter03/96d46b53aee14c3b/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter03/96d46b53aee14c3b/</guid>
				<description>&lt;p&gt;在第2章中，我们详细地介绍了线性回归模型，从本章开始将继续介绍下一个经典的机器学习算法——逻辑回归（Logistic Regression）。如图3-1所示，此图为逻辑回归模型学习的大致路线，其同样也分为3个阶段。在第1个阶段结束后，我们也就大致掌握了逻辑回归的基本原理。下面就开始正式进入逻辑回归模型的学习。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;500&#34; src=&#34;https://mlwithme.github.io/images/ml/240427123512.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 3-1 逻辑回归学习路线图&lt;/center&gt;&#xA;&lt;h1 id=&#34;31-模型的建立与求解&#34;&gt;3.1 模型的建立与求解&lt;a class=&#34;anchor&#34; href=&#34;#31-%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%bb%ba%e7%ab%8b%e4%b8%8e%e6%b1%82%e8%a7%a3&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;311-理解逻辑回归模型&#34;&gt;3.1.1 理解逻辑回归模型&lt;a class=&#34;anchor&#34; href=&#34;#311-%e7%90%86%e8%a7%a3%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;通常来讲，一个新算法的诞生要么用来改善已有的算法模型，要么就是首次提出用来解决一个新的问题，而逻辑回归模型恰恰属于后者，它是用来解决一类新的问题——分类（Classification）。什么是分类问题呢？&lt;/p&gt;&#xA;&lt;p&gt;现在有两堆样本点，需要建立一个模型来对新输入的样本进行预测，判断其应该属于哪个类别，即二分类问题（Binary Classification），如图3-2所示。对于这个问题的描述用线性回归来解决肯定是不行的，因为两者本就属于不同类型的问题。退一步讲，即使用线性回归来建模得到的估计也就是一条向右倾斜的直线，而我们这里需要的却是一条向左倾斜的且位于两堆样本点之间的直线。同时，回归模型的预测值都位于预测曲线附近，而无法做到区分直线两边的东西。既然用已有的线性回归解决不了，那么我们可不可以在此基础上做一点改进以实现分类的目的呢？答案是当然可以。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p3-2.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 3-2 分类任务&lt;/center&gt;&#xA;&lt;h2 id=&#34;312-建立逻辑回归模型&#34;&gt;3.1.2 建立逻辑回归模型&lt;a class=&#34;anchor&#34; href=&#34;#312-%e5%bb%ba%e7%ab%8b%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;既然是解决分类问题，那么完全可以通过建立一个模型用来预测每个样本点$(x_1,y_2)$属于其中一个类别的概率$p$，如果$p＞0.5$，我们就可以认为该样本点属于这个类别，这样就能解决上述的二分类问题了。该怎样建立这个模型呢？&lt;/p&gt;&#xA;&lt;p&gt;在前面的线性回归中，通过建模$h(x)=wx+b$来对新样本进行预测，其输出值为可能的任意实数，但此处既然要得到一个样本所属类别的概率，那最直接的办法就是通过一个函数$g(z$)，将$x_1$和$x_2$这两个特征的线性组合映射至[0,1]的范围即可。由此，便得到了逻辑回归中的预测模型&#xA;&lt;/p&gt;&#xA;$$&#xA;\hat{y}=h(x)=g(w_1x_1+w_2x_2+b)\tag{3-1}&#xA;$$&lt;p&gt;&#xA;其中，$w_1$、$w_2$和$b$为未知参数； $h(x)$称为假设函数（Hypothesis）。当$h(x)$大于某个值（通常设为0.5）时，便可以认为样本$x$属于正类，反之则认为属于负类。同时，也将$w_1x_1+w_2x_2+b=0$称为两个类别间的决策边界（Decision Boundary）。当求解得到$w_1$、$w_2$和$b$后，也就意味着得到了这个分类模型。&lt;/p&gt;&#xA;&lt;p&gt;当然，如果该数据集有$n$个特征维度，那么同样只需要将所有特征的线性组合映射至区间[0,1]即可&#xA;&lt;/p&gt;&#xA;$$&#xA;\hat{y}=h(x)=g({{w}_{1}}{{x}_{1}}+{{w}_{2}}{{x}_{2}}+\cdots +{{w}_{n}}{{x}_{n}}+b)\tag{3-2}&#xA;$$&lt;p&gt;注意： 回归模型一般来讲是指对连续值进行预测的一类模型，而分类模型则是指对离散值（类标）预测的一类模型，但是由于历史的原因虽然逻辑回归被称为回归，但它却是一个分类模型，这算是一个例外。&lt;/p&gt;&#xA;&lt;h2 id=&#34;313-求解逻辑回归模型&#34;&gt;3.1.3 求解逻辑回归模型&lt;a class=&#34;anchor&#34; href=&#34;#313-%e6%b1%82%e8%a7%a3%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;当建立好模型之后就需要找到一种方法来求解模型中的未知参数。同线性回归一样，此时也需要通过一种间接的方式，即通过目标函数来刻画预测标签（Label）与真实标签之间的差距。当最小化目标函数后，便可以得到需要求解的参数$w$和b。&lt;/p&gt;&#xA;&lt;p&gt;同样，我们先给出逻辑回归中的目标函数（第二阶段再讲解来历）：&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; J(w,b)=-\frac{1}{m}\left[ \sum\limits_{i=1}^{m}{{{y}^{(i)}}}\log h({{x}^{(i)}})+(1-{{y}^{(i)}})\log (1-h({{x}^{(i)}})) \right] \\[2ex] &#xA; &amp; h({{x}^{(i)}})=g(w{{x}^{(i)}}+b)  &#xA;\end{aligned}\tag{3-3}&#xA;$$&lt;p&gt;&#xA;其中，$m$表示样本总数，$x^{(i)}$表示第$i$个样本，$y^{(i)}$表示第$i$个样本的真实标签，取值为0或1，$h(x^{(i)})$表示第$i$个样本为正类的预测概率。&lt;/p&gt;&#xA;&lt;p&gt;由式(3-3)可以知道，当函数$J(w,b)$取得最小值的参数$\hat{w}$和$\hat{b}$，也就是我们要求的目标参数。原因在于，当$J(w,b)$取得最小值时就意味着此时所有样本的预测标签与真实标签之间的差距最小，这同时也是最小化目标函数的意义，因此，对于如何求解模型$h(x)$的问题就转化为如何最小化目标函数$J(w,b)$的问题。&lt;/p&gt;&#xA;&lt;p&gt;至此，对逻辑回归算法第1阶段核心内容的学习也就只差一步之遥了，也就是评价指标及通过开源的框架来建模并进行预测。&lt;/p&gt;&#xA;&lt;h2 id=&#34;314-逻辑回归示例代码&#34;&gt;3.1.4 逻辑回归示例代码&lt;a class=&#34;anchor&#34; href=&#34;#314-%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%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;LogisticRegression&lt;/code&gt;来完成模型的求解。完整代码见 &lt;code&gt;AllBookCode/Chapter03/C02_decision_boundary.py&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中的&lt;code&gt;make_blobs()&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.datasets&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; make_blobs&#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;make_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;     centers &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;1&lt;/span&gt;], [&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;]]  &lt;span style=&#34;color:#60a0b0;font-style:italic&#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;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; make_blobs(n_samples&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;200&lt;/span&gt;, centers&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;centers,&#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;           cluster_std&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.2&lt;/span&gt;, random_state&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;random&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;seed(&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;6&lt;/span&gt;     index_pos, index_neg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; (y &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;), (y &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;0&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_pos, x_neg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; x[index_pos], x[index_neg]&#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:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x, y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2行用来指定生成两个样本堆的中心，第3~4行则是根据指定的中心点生成两个不同类别的样本堆，其中&lt;code&gt;n_samples&lt;/code&gt;表示样本的数量，&lt;code&gt;cluster_std&lt;/code&gt;表示样本间的标准差（值越小，样本点分布就越集中），&lt;code&gt;random_state&lt;/code&gt;表示用来指定一个固定的随机种子，以使每次产生相同的样本点。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.2 多分类任务</title>
				<link>https://mlwithme.github.io/ml/chapter03/fac70083dd764141/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter03/fac70083dd764141/</guid>
				<description>&lt;h1 id=&#34;32-多分类任务&#34;&gt;3.2 多分类任务&lt;a class=&#34;anchor&#34; href=&#34;#32-%e5%a4%9a%e5%88%86%e7%b1%bb%e4%bb%bb%e5%8a%a1&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;321多分类逻辑回归&#34;&gt;3.2.1多分类逻辑回归&lt;a class=&#34;anchor&#34; href=&#34;#321%e5%a4%9a%e5%88%86%e7%b1%bb%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在3.1节中对于逻辑回归的介绍都仅仅局限在二分类任务中，但是在实际任务里，更多则是多分类的任务场景，也就是说最终的分类结果中类别数会大于2。对于这样的问题该如何解决呢？&lt;/p&gt;&#xA;&lt;p&gt;通常情况下在用逻辑回归处理多分类任务时，都会采用一种称为One-vs-all（也叫作 One-vs-rest）的方法，两者的缩写分别为ova与ovr。这种策略的核心思想就是每次将其中一个类和剩余的其他类看作一个二分类任务进行训练，最后在预测过程中选择输出概率值最大那个类作为该样本点所属的类别。&lt;/p&gt;&#xA;&lt;p&gt;如图3-5所示，此图为一个可视化的数据集，它一共包含3个类别。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/240401195517.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 3-5 多分类问题&lt;/center&gt;&#xA;&lt;p&gt;当利用One-vs-all的分类思想来解决图3-5中的多分类问题时，可以可视化成如图3-6所示的情况。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;650&#34; src=&#34;https://mlwithme.github.io/images/ml/240331222055.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 3-6 One-vs-all思想&lt;/center&gt;&#xA;&lt;p&gt;在图3-6中，以从左往右的划分方式划分数据集，然后分别训练3个二分类的逻辑回归模型$h_0(x)$、$h_1(x)$和$h_2(x)$，分别表示样本$x$属于第0、第1和第2共3个类别的概率，最后在预测的时候只要选择概率最大时分类模型所对应的类别即可。&lt;/p&gt;&#xA;&lt;h2 id=&#34;322-多分类示例代码&#34;&gt;3.2.2 多分类示例代码&lt;a class=&#34;anchor&#34; href=&#34;#322-%e5%a4%9a%e5%88%86%e7%b1%bb%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在scikit-learn中，可以借助&lt;code&gt;LogisticRegression&lt;/code&gt;类中的&lt;code&gt;multi_class=&#39;ovr&#39;&lt;/code&gt;参数来完成整个多分类的建模任务，完整代码见 &lt;code&gt;AllBookCode/Chapter03/C04_one_vs_all_train.py&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中内置的一个分类数据集iris进行示例。首先需要载入这个数据集，代码如下：&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.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;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;     data &lt;span style=&#34;color:#666&#34;&gt;=&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;4&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;5&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x, y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;iris数据集一共包含3个类别，每个类别中有50个样本，并且每个样本有4个特征维度。同时，scikit-learn中也内置了很多丰富的其它数据集来方便初学者使用，具体信息可以参见官网 [1]。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 训练模型&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在数据集载入完成后，便可以通过sklearn中的&lt;code&gt;LogisticRegression&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;train&lt;/span&gt;(x, y): &#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;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; LogisticRegression(multi_class&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;ovr&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;3&lt;/span&gt;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x,y)&#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:#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, y))&#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; &#x9;&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;到此，对于多变量逻辑回归的分类方法与建模过程就介绍完了。不过细心的读者可能会发现，上面代码中的最后一行输出了一个0.95的得分，它表示什么含义呢？这里的0.95其实指的模型分类的准确率，意思是有95%的样本被模型正确分类了，具体计算原理可见3.3节内容。&lt;/p&gt;&#xA;&lt;h2 id=&#34;323-小结&#34;&gt;3.2.3 小结&lt;a class=&#34;anchor&#34; href=&#34;#323-%e5%b0%8f%e7%bb%93&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在本节内容中，我们首先以图示的方式介绍了如何用Onevsall的思想来用逻辑回归模型解决多分类的任务场景，然后介绍了如何借助开源库sklearn来完成整个多分类任务的建模过程。接下来，我们将开始学习分类模型中的常见评估指标。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.3 常见的分类评估指标</title>
				<link>https://mlwithme.github.io/ml/chapter03/6d7cfd79ef304cbd/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter03/6d7cfd79ef304cbd/</guid>
				<description>&lt;h1 id=&#34;33-常见的分类评估指标&#34;&gt;3.3 常见的分类评估指标&lt;a class=&#34;anchor&#34; href=&#34;#33-%e5%b8%b8%e8%a7%81%e7%9a%84%e5%88%86%e7%b1%bb%e8%af%84%e4%bc%b0%e6%8c%87%e6%a0%87&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;如同回归模型一样，分类模型在训练结束之后同样需要一种测度来对模型的结果进行评判，以便于我们进行下一步流程。相较于回归模型的评估指标，分类模型的评估指标则相对更多且考虑情况也更为繁杂。在接下来的这节内容中，我们将从零开始一步一步地从二分类场景到多分类场景来详细介绍分类任务中几种常见的评估指标及其实现方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;331-准确率&#34;&gt;3.3.1 准确率&lt;a class=&#34;anchor&#34; href=&#34;#331-%e5%87%86%e7%a1%ae%e7%8e%87&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;首先介绍分类任务中最常用也是最简单评估指标准确率（Accuracy）。假定现在有一个猫狗识别程序，并且假定狗为正类别（Positives）猫为负类别（Negatives）。程序在对12张狗和10张猫的混合图片进行识别后，判定其中8张图片为狗，14张图片为猫。待程序识别完毕后，经人工核对在这8张程序判定为狗的图片中仅仅只有5张图片的确为狗，14张被判定为猫的图片中仅有7张为真实的猫。&lt;/p&gt;&#xA;&lt;p&gt;因此，准确率的定义为预测正确的样本数在总样本数中的占比，即上述例子中程序的准确率为&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{Accuracy}=\frac{\text{预测正确的样本数}}{\text{总样本数}}=\frac{5+7}{12+10}\approx0.545\tag{3-4}&#xA;$$&lt;p&gt;&#xA;以上就是准确率的定义及计算过程。&lt;/p&gt;&#xA;&lt;p&gt;虽然准确率计算过程简单也十分容易理解，但是准确率却存在着一个不容忽视的弊端。例如，现在需要训练一个癌细胞诊断模型来识别癌细胞，且在训练数据中其中负样本（非癌细胞）有10万个，而正样本（癌细胞）只有200个。假如某个模型将其中的105个预测为正样本，100095个预测为负样本。最终经过核对后发现，正样本中有5个预测正确，负样本中有99900个样本预测正确。那么此时该模型在训练集上的准确率为&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{Accuracy}=\frac{99900+5}{100000+200}\approx0.997\tag{3-5}&#xA;$$&lt;p&gt;&#xA;但显然，这样的一个模型对于辅助医生决策来说并没有任何作用。如果模型极端一点将所有的样本都预测为负样本，那模型的准确率更是高达$0.998$。因此，在面对类似这种样本不均衡的任务中，并不能够将准确率作为评估模型的唯一指标。此时就需要引入精确率和召回率来作为新的评价指标。&lt;/p&gt;&#xA;&lt;h2 id=&#34;332-精确率与召回率计算&#34;&gt;3.3.2 精确率与召回率计算&lt;a class=&#34;anchor&#34; href=&#34;#332-%e7%b2%be%e7%a1%ae%e7%8e%87%e4%b8%8e%e5%8f%ac%e5%9b%9e%e7%8e%87%e8%ae%a1%e7%ae%97&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;我们仍旧以上面的猫狗识别任务为例。在这8张程序判定为狗的图片中仅仅只有5张图片的确为狗，因此这5张图片就被称为预测正确的正样本（True Positives, TP）；而余下的3张被称为预测错误的正样本（False Positives, FP）。同时，在这14张程序判定为猫的图片中，仅有7张为真实的猫，即预测正确的负样本（True Negatives, TN)；而余下的7张被称为预测错误的负样本（False Negatives, FN）。&lt;/p&gt;&#xA;&lt;p&gt;此时，根据这一识别结果，我们便可以得到如图3-7所示的混淆矩阵（Confuse Matrix）。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/ml/23020451148.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 3-7. 混淆矩阵图&lt;/center&gt;&#xA;&lt;p&gt;如何来读这个混淆矩阵呢？读的时候首先横向看，然后纵向看。例如读TP的时候，首先横向表示真实的正样本，其次是纵向表示预测的正样本，因此TP表示的就是将正样本预测为正样本的个数，即预测正确，因此，同理共有以下4种情况。&lt;/p&gt;&#xA;&lt;p&gt;(1) TP： 表示将正样本预测为正样本，即预测正确。&lt;/p&gt;&#xA;&lt;p&gt;(2) FN： 表示将正样本预测为负样本，即预测错误。&lt;/p&gt;&#xA;&lt;p&gt;(3) FP： 表示将负样本预测为正样本，即预测错误。&lt;/p&gt;&#xA;&lt;p&gt;(4) TN： 表示将负样本预测为负样本，即预测正确。&lt;/p&gt;&#xA;&lt;p&gt;如果此时突然问FP表示什么含义，又该怎样迅速地反应出来呢？我们知道FP从字面意思来看表示的是错误的正类，也就是说实际上它并不是正类，而是错误的正类，即实际上为负类，因此，FP表示的就是将负样本预测为正样本的含义。再看一个FN，其字面意思为错误的负类，也就是说实际上它表示的是正类，因此FN的含义就是将正样本预测为负样本。&lt;/p&gt;&#xA;&lt;p&gt;在定义完上述4种分类情况后就能得出各种场景下的计算指标公式，如式(3-6)~式(3-8)所示。&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{Accuracy}=\frac{\text{TP}+\text{TN}}{\text{TP}+\text{FP}+\text{FN}+\text{TN}}\tag{3-6}&#xA;$$$$&#xA;\text{Precision}=\frac{\text{TP}}{\text{TP}+\text{FP}}\tag{3-7}&#xA;$$$$&#xA;\text{Recall}=\frac{\text{TP}}{\text{TP}+\text{FN}}\tag{3-8}&#xA;$$$$&#xA;{\text{F}_{\text{score}}}=(1+{{\beta }^{2}})\frac{\text{Precision}\cdot \text{Recall}}{{{\beta }^{2}}\cdot \text{Precision}+\text{Recall}}\tag{3-9}&#xA;$$&lt;p&gt;注意： 当$\text{F}_{\text{score}}$中$\beta=1$时称为$\text{F}_1$值，同时$\text{F}_1$也是用得最多的$\text{F}_{\text{score}}$评价指标。&lt;/p&gt;&#xA;&lt;p&gt;在这里，我们又一次根据不同的定义形式得到了准确率的计算方式，但其本质依旧等同于式(3-4)。同时还可以看到，精确率计算的是预测对的正样本在整个预测为正样本中的比重，而召回率计算的是预测对的正样本在整个真实正样本中的比重，因此一般来讲，召回率越高也就意味着这个模型寻找正样本的能力越强（例如在判断是否为癌细胞的时候，寻找正样本癌细胞的能力就十分重要），而$\text{F}_{\text{score}}$则是精确率与召回率的调和平均。&lt;/p&gt;&#xA;&lt;p&gt;因此，根据精确率和召回率的定义，我们还可以通过更直观的图示来进行说明，如图3-8所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;250&#34; src=&#34;https://mlwithme.github.io/images/ml/23020449782.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 3-8. 分类情况分布图&lt;/center&gt;&#xA;&lt;p&gt;如图3-8所示，左侧的所有实心样本点为正样本（相关元素），右侧的所有空心点为负样本，中间的圆形区域为模型预测的正样本（检索元素），即圆形左侧为模型将正样本预测为正样本的情况，右侧为模型将负样本预测为正样本的情况。例如现在可以想象这么一个场景，某一次我们在使用搜索引擎搜索相关内容（正样本）时，搜索引擎一共检索返回了30个搜索页面（搜索引擎认为的正样本），而搜索引擎返回的结果就相当于是图3-8中对应的圆形区域，所以精确率和召回率还可以通过图3-9来形象地进行表示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/23020430313.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 3-9. 精确率召回率图示&lt;/center&gt;&#xA;&lt;p&gt;从图3-9中更能直观地看出，精确率计算的是预测正确的正样本在整个被预测为正样本中的占比；而召回率计算的是预测正确的正样本在所有真实正样本中的占比。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.4 目标函数推导</title>
				<link>https://mlwithme.github.io/ml/chapter03/2fdc655d00c74548/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter03/2fdc655d00c74548/</guid>
				<description>&lt;h1 id=&#34;34-目标函数推导&#34;&gt;3.4 目标函数推导&lt;a class=&#34;anchor&#34; href=&#34;#34-%e7%9b%ae%e6%a0%87%e5%87%bd%e6%95%b0%e6%8e%a8%e5%af%bc&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面3节的内容中，我们详细地介绍了什么是逻辑回归、如何进行多分类及分类任务对应的评价指标等，即完成了前面阶段一的学习，但是到目前为止仍旧有一些问题没有解决，映射函数$g(z)$ 是什么样的？逻辑回归的目标函数是怎么来的？如何自己求解并实现逻辑回归？只有在这3个问题得到解决后，整个逻辑回归算法的主要内容才算学习完了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;341-映射函数&#34;&gt;3.4.1 映射函数&lt;a class=&#34;anchor&#34; href=&#34;#341-%e6%98%a0%e5%b0%84%e5%87%bd%e6%95%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;前面我们只是介绍了通过一个函数$g(z)$将特征的线性组合$z=Wx+b$映射到区间$[0,1]$，那么这个$g(z)$是什么样的呢？如图3-11所示，这便是$g(z)$的函数图形，其也被称为Sigmoid()函数。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/p3-9.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 3-11 Sigmoid()函数图形&lt;/center&gt;&#xA;&lt;p&gt;Sigmoid()函数的数学定义如下&#xA;&lt;/p&gt;&#xA;$$&#xA;g(z)=\frac{1}{1+{{e}^{-z}}}\tag{3-28}&#xA;$$&lt;p&gt;&#xA;其中$z\in (-\infty ,+\infty )$，而之所以选择Sigmoid()的原因在于： ①其连续光滑且处处可导； ②Sigmoid()函数关于点(0,0.5)中心对称；③Sigmoid()函数的求导过程简单，其最后的求导结果为$g^{\prime}(z)=g(z)(1-g(z))$。&lt;/p&gt;&#xA;&lt;p&gt;根据式(3-28)可以得出其实现代码如下：&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;g&lt;/span&gt;(z):&#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;return&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &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:#666&#34;&gt;+&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;exp(&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;z))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到对于Sigmoid()的实现也非常简单，1行代码就能完成。&lt;/p&gt;&#xA;&lt;h2 id=&#34;342-概率表示&#34;&gt;3.4.2 概率表示&lt;a class=&#34;anchor&#34; href=&#34;#342-%e6%a6%82%e7%8e%87%e8%a1%a8%e7%a4%ba&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在介绍完Sigmoid()函数后就需要弄清楚逻辑回归中的目标函数到底是怎么得来的。此时，可以设&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp;P(y=1|x;W,b)=h(x) \\[2ex] &#xA; &amp; P(y=0|x;W,b)=1-h(x) \\[2ex]  &#xA; &amp; h(x)=g(z)=g({{W}^{T}}x+b)&#xA;\end{aligned}\tag{3-29}&#xA;$$&lt;p&gt;&#xA;其中$W$和$x$均为一个列向量，$P(y=1|x; W,b)=h(x)$的含义为当给定参数$W$和$b$时，样本$x$属于$y=1$这个类别的概率为$h(x)$。此时可以发现，对于每个样本来讲都需要前面两个等式来衡量每个样本所属类别的概率，为了更加方便地表示每个样本所属类别的概率，可以改写为如下形式：&#xA;&lt;/p&gt;&#xA;$$&#xA;p(y|x;W,b)={{(h(x))}^{y}}{{(1-h(x))}^{1-y}}\tag{3-30}&#xA;$$&lt;p&gt;&#xA;这样一来，不管样本$x$属于哪个类别，都可以通过式(3-30)进行概率计算。&lt;/p&gt;&#xA;&lt;p&gt;进一步，我们知道在机器学习中是通过给定训练集，即$({{x}^{(i)}},{{y}^{(i)}})$来求得其中的未知参数$W$和$b$。换句话说，对于每个给定的${{x}^{(i)}}$，我们已经知道了其所属的类别${{y}^{(i)}}$，即${{y}^{(i)}}$的这样一个分布结果我们是知道的。那么什么样的参数$W$和$b$能够使已知的${{y}^{(1)}},{{y}^{(2)}},\cdots ,{{y}^{(m)}}$这样一个结果（分布）最容易出现呢？也就是说给定什么样的参数$W$和$b$，使当输入${{x}^{(1)}},{{x}^{(2)}},\cdots ,{{x}^{(m)}}$这$m$个样本时，最能够产生已知类别标签${{y}^{(1)}},{{y}^{(2)}},\cdots ,{{y}^{(m)}}$这一结果呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;343-极大似然估计&#34;&gt;3.4.3 极大似然估计&lt;a class=&#34;anchor&#34; href=&#34;#343-%e6%9e%81%e5%a4%a7%e4%bc%bc%e7%84%b6%e4%bc%b0%e8%ae%a1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;上面绕来绕去说了这么多，其目的只有一个，即为什么要用似然函数进行下一步计算。由3.4.2节内容分析可知，为了能够使${{y}^{(1)}},{{y}^{(2)}},\cdots ,{{y}^{(m)}}$这样一个结果最容易出现，应该最大化如下似然函数 [3]&#xA;&lt;/p&gt;&#xA;$$&#xA;L(W,b)=\frac{1}{m}\prod\limits_{i=1}^{m}{p}({{y}^{(i)}}|{{x}^{(i)}};W,b)=\frac{1}{m}\prod\limits_{i=1}^{m}{(h(}{{x}^{(i)}}){{)}^{{{y}^{(i)}}}}{{(1-h(x^{(i)}))}^{1-{{y}^{(i)}}}}\tag{3-31}&#xA;$$&lt;p&gt;&#xA;对式(3-31)两边同时取自然对数有&#xA;&lt;/p&gt;&#xA;$$&#xA;\ell (W,b)\text{ }=\frac{1}{m}\log L(W,b)=\frac{1}{m}\sum\limits_{i=1}^{m}{\left[ {{y}^{(i)}}\log h({{x}^{(i)}})+(1-{{y}^{(i)}})\log (1-h({{x}^{(i)}})) \right]}\tag{3-32}&#xA;$$&lt;p&gt;注意：$\log {{a}^{b}}{{c}^{d}}=\log {{a}^{b}}+\log {{c}^{d}}=b\log a+d\log c$&lt;/p&gt;</description>
			</item>
			<item>
				<title>引用</title>
				<link>https://mlwithme.github.io/ml/chapter03/a4b61c5bbadd43a6/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter03/a4b61c5bbadd43a6/</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://scikitlearn.org/stable&#34;&gt;https://scikitlearn.org/stable&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[2] Pedregosa F, Varoquaux G, Gramfort A, et al. Scikit-learn: Machine learning in Python[J]. the Journal of machine Learning research, 2011, 12: 2825-2830.&lt;/p&gt;&#xA;&lt;p&gt;[3] Andrew Ng,Machine Learning,Stanford University,CS229,Spring 2019.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
