机器学习 吴恩达 第五章 笔记
五、逻辑回归(Logistic Regression)
5.1 分类问题
在接下来的几节里,我想讨论要预测的变量
在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误).分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;之前我们也谈到了肿瘤分类问题的例子,区别一个肿瘤是恶性的还是良性的.
我们从二元的分类问题开始讨论:
我们将{0,1}
两个数.我们常常用0
表示没有某种属性,而1表示有我们要寻找的属性.
我们将因变量(dependent variable)
可能属于的两个类分别称为负向类(negative class)
和正向类(positive class)
,则因变量0
表示负向类,1
表示正向类.
如果我们要用线性回归算法来解决一个分类问题,我们会想到用一条直线取拟合数据.如果想要作出预测,一个做法是设置一个阈值,如果>
阈值,我们设置为正类(如下所示),小于阈值设置为反类.
在上图预测肿瘤性质的例子里,线性回归的预测效果似乎还可以.但如果我们把横轴延长一点,假设有另一个训练样本位于右方远处,如果在此样本运行线性回归,就会得到另外一条直线(蓝色)去拟合数据.如果阈值没有改变(仍为
接下来再思考一个问题,如果我们将线性回归用于分类问题会怎么样?对于分类,y取值0或1.但如果你使用的是线性回归,那么假设函数的输出值可能远大于1,或者远小于0.即使所有训练样本的标签y都等于0或等于1.尽管我们知道y
应该取值0 或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪.在后面几节,我们将介绍逻辑回归算法,这个算法的性质是:它的输出值永远在0到1之间.
5.2 假设陈述
在本节,我要给你展示假设函数的表达式,也就是说,在分类问题中,要用什么样的函数来表示我们的假设.此前我们说过,希望我们的分类器的输出值在0和1之间.因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在0和1之间.
当我们使用线性回归时,假设看起来是这样:
这里我们打算修改一点来获得逻辑回归函数,也就是把
逻辑函数也称为Sigmoid function
),如果我们将
如果我们将上面两式联立的话,就会得到:
科普一下:sigmoid函数可以将一个实数映射到[0,1]的区间,可以用来做二分类.
该函数的图像为:
我们需要用参数
稍后我们会学习一个方法,帮助我们拟合参数
当我们的假设
例如,如果对于给定的70%
的几率,y
为正向类.相应地,y为负向类的几率为1-0.7=0.3.
用数学的方法表示就是
这里解释一下
是什么意思.我们可以参考正态分布的概率密度函数. .这个函数里有两个参数,均值
和方差 .通过调节这两个参数的取值,我们可以得到不一样的正态分布.以这个概率密度函数也可以用 表示.
5.3 决策界限
本节我们来讲述一下决策界限(decision boundary)的概念.这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么.
首先我们来思考什么时候y判断为1,什么时候判断为0.之前提过的一个方法:设置阈值,在逻辑回归也同样适用.
当y=1
当y=0
根据上面绘制出的S
形函数图像,我们知道当:
时, 时,
又因为
现在假设我们有一个模型和训练集(从这里可以看出
因为我们这里还没讨论如何拟合这里的参数,这里就先假设我们已经拟合好了参数.假设y
预测为1
.
使用我们在之前讨论的
时,模型认为该样本更有可能是正类.这在图上表示为一条直线.很明显直线划分出了y=1
和y=0
的区域.我们也把这条线称作决策边界.顺便说明一下,决策边界是假设函数的一个属性,它们由假设函数的参数决定,而不是数据集.当然,我们后续会讨论如何用数据集拟合参数
现在,来看一个更复杂的例子:
&esmp;假使我们的数据呈现这样的分布情况,怎样的模型才能适合呢?
之前,我们在学习线性回归的时候也学习了多项式回归,将低阶替换为高阶,这里也是同样的做法.
具体来说,我们将假设函数设置成如上,我们添加了額外的两个特征:
通过在特征里增加高阶多项式,我们可以得到更复杂的决策边界.
我们可以用非常复杂的模型来适应非常复杂形状的判定边界
5.4 代价函数
在本节,我们要介绍如何拟合逻辑回归模型的参数
理解:什么是拟合?拟合是一种数据处理的方式,不特指哪种方法.简单的说就是你有一组数据,觉得这组数据和一个已知的函数(这个函数的参数未定)很相似,为了得到最能表示这组数据特征的这个函数,通过拟合这种方式(具体的数学方法很多)求得参数Click
从上图给出的mx(n+1)
的训练集,我们要找到方法拟合参数
之前我们讨论线性回归问题时,使用了这个函数:
现在我们要对这个成本函数做一点小变动.我们将
我们可以去掉上标为了简便表示(因为实际运算是向量?)在线性回归里我们需要最小化代价函数.在逻辑回归里我们也需要最小化
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和.理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值的效率.所以我们要做的就是重新找一个
因此,我们重新定义逻辑回归的代价函数为:
其中:
根据函数,我们可以得出
让我们来直观理解一下代价函数y=1
),而我们的假设函数100%
),这样付出的代价为0.但是如果假设函数输出0
,也就是不可能为正类,这会导致Cost
的输出非常大.也就是我们要用很大的代价来惩罚我们的代价函数.当y=0
的图.
后面我们会将
5.5 简化的成本函数和梯度下降
在本节我们要简化成本函数,以及学习如何使用梯度下降来拟合逻辑回归的参数
下面是逻辑回归的代价函数:
由于y
总是等于1
或0
,我们有一个简单的方法可以写出代价函数:
我们再将
除了这种方式,还有其他方式也能用一行式子表示
根据这个代价函数,为了拟合出参数,该怎么做呢?我们要试图找尽量让
根据上面的步骤,接下来要考虑的就是如何最小化
蓝色笔记部分是求偏导后的结果,我自己在纸上算了是一致的.下面贴下其他佬写的推导过程:
我们将算出来的偏导数带回,就会得到如下结果(图里少了一个
将
之前讲线性回归时,检查
实现迭代更新的一个直接做法就算for
循环一个个更新,当然在足够理想的情况下,我们也可以使用矢量化更新.
如何向量化一次性更新
在运行梯度下降算法之前,进行特征缩放依旧是非常必要的.
5.6 高级优化
在上一个视频中,我们讨论了用梯度下降的方法最小化逻辑回归中代价函数
现在我们换个角度来看什么是梯度下降,我们有个代价函数
假设我们已经完成了可以实现这两件事的代码,那么梯度下降所做的就是反复执行这些更新.另一种考虑梯度下降的思路是:我们需要写出代码来计算
这三种算法有许多优点:
- 一个是使用这其中任何一个算法,你通常不需要手动选择学习率
.所以对于这些算法的一种理解思路是,给出计算导数项和代价函数的方法,你可以认为算法有一个智能的内部循环尝试多种学习率.而且,事实上,他们确实有一个智能的内部循环,称为线性搜索(line search
)算法,它可以自动尝试不同的学习速率 ,并自动选择一个好的学习速率 .因此它甚至可以为每次迭代选择不同的学习速率,那么你就不需要自己选择.这些算法实际上在做更复杂的事情,不仅仅是选择一个好的学习速率,所以它们往往最终比梯度下降收敛得快多了,不过关于它们到底做什么的详细讨论,已经超过了本门课程的范围.
我们实际上完全有可能成功使用这些算法,并应用于许多不同的学习问题,而不需要真正理解这些算法的内环间在做什么,如果说这些算法有缺点的话,那么我想说主要缺点是它们比梯度下降法复杂多了.特别是你最好不要自己实现L-BGFS、BFGS这些算法,除非你是数值计算方面的专家.
实际上,我不会建议你们编写自己的代码来计算数据的平方根,或者计算逆矩阵,因为对于这些算法,我还是会建议你直接使用一个软件库,比如说,要求一个平方根,我们所能做的就是调用一些别人已经写好用来计算数字平方根的函数.
现在让我们来说明,如何使用这些算法:
我们先举一个例子:
如上,你有一个含两个参数的问题,这两个参数是
假设我们不知道
后面涉及Octave 函数
的就不写了,直接下一节吧.
5.7 多类别分类:一对多
在本节视频中,我们将谈到如何使用逻辑回归(logistic regression
)来解决多类别分类问题,具体来说.我想通过一个叫做"一对多" (one-vs-all
)的分类算法.
什么是多类别分类问题?让我们来看下面的例子:
(1) 第一个例子:假如说你现在需要一个学习算法能自动地将邮件归类到不同的文件夹里,或者说可以自动地加上标签,那么,你也许需要一些不同的文件夹,或者不同的标签来完成这件事,来区分开来自工作的邮件、来自朋友的邮件、来自家人的邮件或者是有关兴趣爱好的邮件,那么,我们就有了这样一个分类问题:其类别有四个,分别用
(2) 第二个例子:如果一个病人因为鼻塞来到你的诊所,他可能并没有生病,用y=1
这个类别来代表;或者患了感冒,用y=2
来代表;或者得了流感用y=3
来代表
强调一下:y从1开始还是0开始并不重要.
我们可以比较一下二分类与多分类的数据集:
我们已经知道逻辑回归可以用来处理二分类的问题.但是这里如果我们利用一对多的思想,我们也可以将其应用在多分类的问题上.
下面将介绍如何进行一对多的分类原理,有时这个方法也被称为"一对余"方法:
现在我们有一个训练集,好比下图表示的有3个类别:我们用三角形表示y=1
,方框表示y=2
,叉叉表示y=3
.我们下面要做的就是使用一个训练集,将其分成3个独立的二元分类问题.
我们先从用三角形代表的类别1开始,实际上我们可以创建一个,新的"伪"训练集,类型2和类型3定为负类,类型1设定为正类,我们创建一个新的训练集,如下图所示的那样,我们要拟合出一个合适的分类器.
为了能实现这样的转变,我们将多个类中的一个类标记为正向类(
最后,在我们需要做预测时,我们将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量.
总之,我们已经把要做的做完了,现在要做的就是训练这个逻辑回归分类器:
你现在知道了基本的挑选分类器的方法,选择出哪一个分类器是可信度最高效果最好的,那么就可认为得到一个正确的分类,无论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2021-01-11 Labeling Balls POJ - 3687
2021-01-11 Box Relations HDU - 3231
2021-01-11 Rank of Tetris HDU - 1811
2021-01-11 Reward HDU - 2647
2021-01-11 产生冠军 HDU - 2094