一:分类
(一)分类基础
在分类问题中,你要预测的变量y是离散的值,咱们将学习一种叫作逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最普遍的一种学习算法。算法
在分类问题中,咱们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是不是垃圾邮件;判断一次金融交易是不是欺诈;以前咱们也谈到了肿瘤分类问题的例子,区别一个肿瘤是恶性的仍是良性的。数据结构
咱们从二元的分类问题开始讨论。(固然存在多分类问题,例如y能够取到 0,1,2,3这几个值)机器学习
咱们将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class)和正向类(positive class),则因变量 ,其中 0 表示负向类(没有某项东西):良性肿瘤,1 表示正向类(含有某项东西):恶性肿瘤。函数
(二)对比线性回归
咱们对数据集创建线性模型,获得线性回归函数。同时设置一个阈值y_0=0.5,此时x_0对应y_0,当x<x_0时,则返回0,当x>x_0则返回1。学习
上面解释彷佛很合理,可是当咱们出现下面的数据集分布时:优化
从新创建线性模型,致使本来属于正向类的数据,被划分到负向类中。spa
所以,不建议将线性回归用于分类问题。指针
若是咱们要用线性回归算法来解决一个分类问题,对于分类, y取值为 0 或者1,但若是你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于0,即便全部训练样本的标签y都等于 0 或 1。尽管咱们知道标签应该取值0 或者1,可是若是算法获得的值远大于1或者远小于0的话,就会感受很奇怪。code
因此咱们在接下来的要研究的算法就叫作逻辑回归算法,这个算法的性质是:它的输出值永远在0到 1 之间。blog
顺便说一下,逻辑回归算法是分类算法,咱们将它做为分类算法使用。有时候可能由于这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法其实是一种分类算法,它适用于标签y取值离散的状况,如:1 0 0 1。
二:假说表示
(一)模型引出
咱们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。
逻辑回归模型的假设是:
其中:X表示特征向量,g表示逻辑函数,是一个经常使用的逻辑函数(为S形函数Sigmoid function)
Sigmoid function公式:
当z趋于正无穷,g(z)--->1。当z趋于负无穷,g(z)--->0。所以g(z)再(0,1)之间。
所以,完整的逻辑回归模型以下:
(二)参数θ拟合数据
当咱们拿到一个数据集,咱们须要给参数选定一个值。假说模型会帮咱们作出预测。
三:决策边界
(一)假设函数的属性---决策边界
决策边界这个概念能更好地帮助咱们理解逻辑回归的假设函数在计算什么。
在逻辑回归中,咱们预测:
根据上面绘制出的 S 形函数图像,咱们知道:
如今假设咱们有一个模型:
而且假设咱们拟合好了参数,参数θ是向量[-3 1 1].则当-3+x_1+x_2>=0,即x_1+x_2>=3时,模型将预测y=1。
咱们能够绘制直线x_1+x_2=3,这条线即是咱们模型的分界线,将预测为1和预测为0的区域分开。
这条洋红色线,被称为决策边界。具体地说,这条直线x_1+x_2=3。它对应h(x)=0.5的区域。
决策边界,也就是这条直线将整个平面分红了两部分,其中一片区域假设函数预测y等于1,而另外一片区域假设函数预测y等于0。
决策边界是假设函数的一个属性:
它包括参数θ_0 θ_1 θ_2。
即使咱们去除这个数据集以后:
这条决策边界,以及咱们预测y=1,与y=0。他们都是假设函数的属性,决定于其参数θ_j,而不是数据集的属性(不一样于线性回归)
固然,咱们后面还将讨论如何拟合参数,那时,咱们将使用训练集,使用咱们的数据来肯定参数的取值。
可是,一旦咱们有肯定的参数取值,有肯定的θ0 θ1 θ2,咱们就将彻底肯定决策边界。
这时,咱们实际上并不须要在绘制决策边界的时候,绘制训练集。
(二)复杂数据集
给定一个这样的训练集,咱们如何使用逻辑回归来拟合这些数据?
早些时候,当咱们谈论多项式回归或者线性回归时,咱们谈到能够添加额外的高阶多项式项,一样咱们也能够对逻辑回归使用相同的方法。
添加了两个额外的特征,x_1方和x_2方。而且我如今有5个参数,θ_0到θ_4。
假设咱们以及拟合了参数θ_j是[-1 0 0 1 1]
这样咱们就能够得到决策边界:
所以,经过增长这些复杂的多项式特征变量,能够获得更复杂的决定边界,而不仅是用直线分开正负样本。
再次强调:决策边界不是训练集的属性,而是假设自己及其参数的属性。咱们不是用训练集来定义的决策边界,而是用训练集来拟合参数θ
四:代价函数---拟合逻辑回归模型的参数θ
如何自动选择参数θ,使咱们能在给定一个训练集时,咱们能够根据数据自动拟合参数θ。
(一)原始代价函数
具体来讲,我要定义用来拟合参数的优化目标或者叫代价函数,这即是监督学习问题中的逻辑回归模型的拟合问题。
对于线性回归模型,咱们定义的代价函数是全部模型偏差的平方和。理论上来讲,咱们也能够对逻辑回归模型沿用这个定义,可是问题在于,当咱们将
带入到这样定义了的代价函数中时,咱们获得的代价函数将是一个非凸函数non-convexfunction。
这意味着咱们的代价函数有许多局部最小值,这将影响梯度降低算法寻找全局最小值。
相应的,咱们但愿咱们的代价函数J(θ)是一个以下的凸函数:
因此咱们对这个凸函数使用梯度降低法,就能够确保必定能够收敛到该函数的全局最小值。
可是因为咱们中间的的h(x)函数是非线性的,就致使了代价函数是非凸函数。
(二)修正后的代价函数
咱们从新定义逻辑回归的代价函数为:
推导-log(h(x)):
注意:,因此h(x)的取值范围在(0,1)之间。
所有-log(h(x))和-log(1-h(x))表示:
由于是分类(逻辑回归),因此y取值只有y=1和y=0两种,每种对应一个cost方法。
则h(x)和cost(h(x),y)之间的关系以下图所示:
上图是y=1的状况下,cost代价值(纵轴)和h(x)预测值(横轴)之间的关系。
其性质是:
当预测值是h(x)=1,实际标签值y也是为1,那么cost代价值则为0。
可是当预测值是0,实际标签值是1,那么cost代价值是∞大,这就说明咱们的预测是错误的,那么咱们就用很是很是大的代价值来惩罚这个学习算法。
是y=0的状况下,cost代价值(纵轴)和h(x)预测值(横轴)之间的关系。
当预测值是h(x)=0,实际标签值y也是为0,那么cost代价值则为0。
可是当预测值是1,实际标签值是0,那么cost代价值是∞大,这就说明咱们的预测是错误的,那么咱们就用很是很是大的代价值来惩罚这个学习算法
(三)将y=1和y=0的cost函数合并,简化
将构建的cost(h(x),y)简化以下:(再也不单独区分y=0和y=1)
带入代价函数获得:
即:
补充:这是由最大似然函数来的,是一个凸函数
(四)代码实现cost
import numpy as np def cost(theta, X, y): theta = np.matrix(theta) X = np.matrix(X) y = np.matrix(y) first = np.multiply(-y, np.log(sigmoid(X* theta.T))) second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T))) return np.sum(first - second) / (len(X))
其中,h(x)以下:是一个sigmod函数,传参为X*theta.T
五:梯度降低法---为训练集拟合出来参数θ
在获得这样一个代价函数之后,咱们即可以用梯度降低算法来求得能使代价函数最小的参数了。
算法为:
求导后获得:
注:虽然获得的梯度降低算法表面上看上去与线性回归的梯度降低算法同样,可是这里的
与线性回归中不一样,因此其实是不同的。
推导过程:
因此:
另外,在运行梯度降低算法以前,进行特征缩放依旧是很是必要的。特征缩放依旧适用于逻辑回归。
六:高级优化
(一)梯度降低法
一些高级优化算法和一些高级的优化概念,利用这些方法,咱们就可以使经过梯度降低,进行逻辑回归的速度大大提升,而这也将使算法更加适合解决大型的机器学习问题,好比,咱们有数目庞大的特征量。 如今咱们换个角度来看什么是梯度降低:
咱们有个代价函数J(θ),而咱们想要使其最小化,那么咱们须要作的是编写代码,当输入参数θ时,它们会计算出两样东西:J(θ)以及J等于 0、1直到n时的偏导数项。
梯度降低所作的就是反复执行这些更新,从而来更新参数θ。
(二)其余高级算法
然而梯度降低并非咱们可使用的惟一算法,还有其余一些算法,更高级、更复杂。
若是咱们能用这些方法来计算代价函数J(θ)和偏导数两个项的话,那么这些算法就是为咱们优化代价函数的不一样方法。
共轭梯度法,BFGS (变尺度法) 和L-BFGS (限制变尺度法) 就是其中一些更高级的优化算法,它们须要有一种方法来计算J(θ),以及须要一种方法计算导数项。
而后使用比梯度降低更复杂的算法来最小化代价函数。这三种算法的具体细节过于麻烦,这里只须要了解一些他们的特性:
一个是使用这其中任何一个算法,你一般不须要手动选择学习率α ,因此对于这些算法的一种思路是:
给出计算导数项和代价函数的方法,你能够认为算法有一个智能的内部循环。
并且,事实上,他们确实有一个智能的内部循环,称为线性搜索(line search)算法,它能够自动尝试不一样的学习速率α ,并自动选择一个好的学习速率α,
所以它甚至能够为每次迭代选择不一样的学习速率,那么你就不须要本身选择。
这些算法实际上在作更复杂的事情,而不只仅是选择一个好的学习率,因此它们每每最终收敛得远远快于梯度降低。
并且咱们每每不须要特别去了解算法的内部细节(太复杂),就能够很好的使用他,到各类应用场景
举例使用:
若是想用高级优化算法里的一个,来最小化代价函数。若是咱们不知道最小值在(5,5)时取到,可是还想要找到最小值。
咱们可使用梯度降低法,可是最好用比它更加高级的算法。
该Octave 函数实现了这样一个代价函数,好比costFunciton(theta)----返回两个自变量:
第一个是jVal:它是咱们要计算的代价函数
第二个是梯度值,梯度值应该是一个2×1的向量,梯度向量的两个元素对应这里的两个偏导数项
运行这个costFunction 函数后,你就能够调用高级的优化函数,这个函数叫 fminunc,它表示Octave 里无约束最小化函数。
你要设置几个options,这个 options 变量做为一个数据结构能够存储你想要的options。
因此 GradObj 和On,这里设置梯度目标参数为打开(on),这意味着你如今确实要给这个算法提供一个梯度,而后设置最大迭代次数。
比方说100,咱们给出一个θ的猜想初始值,它是一个2×1的向量,那么这个命令就调用fminunc,这个@符号表示指向咱们刚刚定义的costFunction 函数的指针。
若是你调用它,它就会使用众多高级优化算法中的一个,固然你也能够把它当成梯度降低,只不过它能自动选择学习速率α,你不须要本身来作。
而后它会尝试使用这些高级的优化算法,就像增强版的梯度降低法,为你找到最佳的θ值。
当有一个很大的机器学习问题时,选择这些高级算法,而不是梯度降低。有了这些概念,你就应该能将逻辑回归和线性回归应用于更大的问题中,这就是高级优化的概念。
七:多元分类---一对多
使用逻辑回归 (logistic regression)来解决多类别分类问题
(一)案例
(二)二元分类和多分类对比
二元分类问题,咱们的数据看起来多是像这样:
对于一个多类分类问题,咱们的数据集或许看起来像这样:
咱们如今已经知道如何进行二元分类,可使用逻辑回归,对于直线或许你也知道,能够将数据集一分为二为正类和负类。
用一对多的分类思想,咱们能够将其用在多类分类问题上。
下面将介绍如何进行一对多的分类工做,有时这个方法也被称为"一对余"方法。
如今咱们有一个训练集,比如上图表示的有3个类别,咱们用三角形表示y=1,方框表示y=2,叉叉表示y=3 。
咱们下面要作的就是,将这个训练集,将其分红3个独立的二元分类问题。
咱们先从用三角形表明的类别1开始,实际上咱们能够建立一个,新的"伪"训练集,类型2和类型3定为负类,类型1设定为正类,咱们建立一个新的训练集,以下图右侧所示的那样,咱们要拟合出一个合适的分类器。
这里的三角形是正样本,而圆形表明负样本。能够这样想,设置三角形的值为1,圆形的值为0,下面咱们来训练一个标准的逻辑回归分类器,这样咱们就获得一个正边界。
这里的h_θ(x)上标(1)表明类别1,咱们对三角形类别1进行上面这样的处理。
一样对类别2进行一样的处理:将方形样本设置为正样本,其余为负样本,以此来拟合第二个逻辑回归分类器h_θ^(2)(x):
这里的h_θ(x)上标(2)表明类别2,咱们对方形类别2进行上面这样的处理。
一样,设置叉型为类别3:
总结:
为了能实现这样的转变,咱们将多个类中的一个类标记为正向类(y=1),
而后将其余全部类都标记为负向类,这个模型记做:
----计算在给定x和θ时,y的值为1的几率。
接着,相似地第咱们选择另外一个类标记为正向类(y=2),再将其它类都标记为负向类,将这个模型记做:
依此类推。最后咱们获得一系列的模型简记为:(一系列分类器)
每一个分类器都针对其中一种状况进行训练。
总之:咱们训练了一个逻辑回归分类器,预测i类别y=i的几率。
最后为了作出预测,咱们给出一个新的输入值x,指望得到预测。咱们要作的就是在咱们三个分类器里面输入x,
而后咱们选择一个让最大的i,即
。选出三个当中,可信度最高,效果最好的那个分类器。
不管i值是多少,咱们都能获得一个最高的几率值,咱们预测就是那个值。
这就是多类别分类问题,以及一对多的方法,经过这个小方法,你如今也能够将逻辑回归分类器用在多类分类的问题上。
最后,在咱们须要作预测时,咱们将全部的分类机都运行一遍,而后对每个输入变量,都选择最高可能性的输出变量。