1.分类问题
在分类问题中,你要预测的变量
y
y
y是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。
我们从二元的分类问题开始讨论。
我们将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class)和正向类(positive class),则因变量,其中 0 表示负向类,1 表示正向类。
由上图可以看到用线性回归去拟合分类问题这不是一个好的解决方案。
2.逻辑回归模型
我们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。 逻辑回归算法是分类算法,它适用于标签
y
y
y取值离散的情况,如:1 0 0 1.我们将它作为分类算法使用。
【1】逻辑回归模型的假设是:
h
θ
(
x
)
=
g
(
θ
T
X
)
h_\theta(x)=g(\theta^TX)
hθ(x)=g(θTX)其中:X代表特征向量g代表逻辑函数,一个常用的逻辑函数为S形函数,公式为
g
(
z
)
=
1
1
+
e
−
z
g(z)=\frac{1}{1+e^{-z}}
g(z)=1+e−z1
【2】python代码实现:
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
该函数的图像为:
【3】逻辑回归模型假设
h
θ
(
x
)
=
g
(
θ
T
X
)
h_\theta(x)=g(\theta^TX)
hθ(x)=g(θTX)
g
(
z
)
=
1
1
+
e
−
z
g(z)=\frac{1}{1+e^{-z}}
g(z)=1+e−z1
h
θ
(
x
)
h_\theta(x)
hθ(x)作用时对于给定的输入变量,根据选择的参数计算输出变量=1的可能性,即
h
θ
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
h_\theta(x)=P(y=1|x;\theta)
hθ(x)=P(y=1∣x;θ)
例如,如果对于给定的
x
x
x,通过已经确定的参数计算得出
h
θ
(
x
)
=
0.7
h_\theta(x)=0.7
hθ(x)=0.7,则表示有70%的几率
y
y
y为正向类,相应地
y
y
y为负向类的几率为1-0.7=0.3。
3.判定边界
根据绘制的S形函数图像,我们知道
举例1:假设我们有一个模型
参数
θ
\theta
θ向量为[-3 1 1],则
θ
T
x
\theta^Tx
θTx为-3+
x
1
x_1
x1+
x
2
x_2
x2,当-3+
x
1
x_1
x1+
x
2
x_2
x2>=0,即
x
1
x_1
x1+
x
2
x_2
x2>=3时,模型预测为
y
=
1
y=1
y=1,否则预测值
y
=
0
y=0
y=0,因此
x
1
x_1
x1+
x
2
x_2
x2=3便是模型的分界线,将预测值为1和0的区域分隔开
举例2:假使数据呈现这样的分布情况,怎样的模型才能适合呢?
显然需要用曲线才能分割不同预测值,我们需要二次方特征
则我们得到的判定边界恰好是圆点在原点且半径为1的圆形。
4.代价函数
介绍如何拟合逻辑回归模型的参数
θ
\theta
θ具体来说,要定义用来拟合参数的优化目标或者叫代价函数
首先在逻辑回归模型中,假设函数为
而在线性回归模型,我们定义的代价函数是所有模型误差的平方和。当我们沿用这个代价函数时会发现,我们带入得到的代价函数将是一个非凸函数
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
(凸函数类似为)
线性回归的代价函数
重新定义逻辑回归的代价函数为
其中
h
θ
(
x
)
h_\theta(x)
hθ(x)与
C
o
s
t
(
h
θ
(
x
)
,
y
)
Cost(h_\theta(x),y)
Cost(hθ(x),y)之间关系如图,横坐标为
h
θ
(
x
)
h_\theta(x)
hθ(x),根据y取值1或0的不同,有两个图像
图像解释如下
y=1,
h
θ
(
x
)
=
1
h_\theta(x)=1
hθ(x)=1,误差为零;
h
θ
(
x
)
不
为
1
h_\theta(x)不为1
hθ(x)不为1,误差随
h
θ
(
x
)
h_\theta(x)
hθ(x)变小而变大
y=0,**
h
θ
(
x
)
=
0
h_\theta(x)=0
hθ(x)=0,误差为零;
h
θ
(
x
)
不
为
0
h_\theta(x)不为0
hθ(x)不为0,误差随
h
θ
(
x
)
h_\theta(x)
hθ(x)变大
C
o
s
t
(
h
θ
(
x
)
,
y
)
Cost(h_\theta(x),y)
Cost(hθ(x),y)化简(将y=1和y=0情况合并到一个式子里)如下:
带入代价函数可得:
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))
5.梯度下降算法(求使得代价函数最小的参数)
算法(特征缩放依旧必要,同样可以让逻辑回归算法梯度下降收敛的更快)
这里更新
θ
\theta
θ梯度下降算法,看起来与线性回归的梯度下降算法一样,但是要注意假设函数不同,即
h
θ
(
x
)
=
g
(
θ
T
X
)
h_\theta(x)=g(\theta^TX)
hθ(x)=g(θTX)与线性回归不同,故其实最小化代价函数
J
(
θ
)
J(\theta)
J(θ)的梯度下降算法并不一样。
(详细推导)
所以,如果你有
n
n
n个特征,也就是说
直到
θ
n
\theta_n
θn,呢么就需要用这个式子
来同时更新所有
θ
\theta
θ值,直到得到代价函数最小值。
6.高级优化
这里我们会知道除了梯度下降算法最小化逻辑回归中代价函数
J
(
θ
)
J(\theta)
J(θ),还有一些高级优化算法和一些高级的优化概念,利用这些方法,我们就能够使通过梯度下降,使进行逻辑回归的速度大大提高,而这也将使算法更加适合解决大型的机器学习问题。
首先举例:
我们有个代价函数
J
(
θ
)
J(\theta)
J(θ),而我们想要使其最小化,那么我们需要做的是编写代码,当输入参数
θ
\theta
θ,不断计算
J
(
θ
)
J(\theta)
J(θ)以及
θ
j
中
j
从
0
到
n
\theta_j中j从0到n
θj中j从0到n的偏导数,从而不断更新$\theta_j
我们编写代码完成这两项工作后,希望代码还能够监控
代价函数
J
(
θ
)
J(\theta)
J(θ),因此我们可以使用梯度下降算法。除此之外,还有更高级更复杂的算法可以用于计算
J
(
θ
)
J(\theta)
J(θ)以及
θ
j
中
j
从
0
到
n
\theta_j中j从0到n
θj中j从0到n的偏导数这两项工作,如共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) 便是其中的一些,它们需要有一种方法来计算
J
(
θ
)
J(\theta)
J(θ),以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。
三种算法优缺点
1.这其中任何一个算法,通常不需要手动选择学习率 ,他们有一个智能的内部循环,称为线性搜索(line search)算法,它可以自动尝试不同的学习速率 α \alpha α,并自动选择一个好的学习速率 ,因此它甚至可以为每次迭代选择不同的学习速率,那么你就不需要自己选择
2.复杂,最好不要自己编写代码,而食使用软件库
举例说明如何使用:
一个含有两个参数的问题,代价函数 J ( θ ) J(\theta) J(θ),我们需要不断做上述两项工作来求得使 J ( θ ) J(\theta) J(θ)最小化的两个参数值,如果我们不知道代价函数最小值,要找到这个最小值,除了使用梯度算法还有其他更高级的算法,要做的就是运行一个像这样的Octave 函数:
function [jVal, gradient]=costFunction(theta) jVal=(theta(1)-5)^2+(theta(2)-5)^2;
gradient=zeros(2,1);
gradient(1)=2*(theta(1)-5);
gradient(2)=2*(theta(2)-5);
end
这样就计算出这个代价函数,函数返回的第二个值是梯度值,梯度值应该是一个2×1的向量,梯度向量的两个元素对应这里的两个偏导数项,运行这个costFunction 函数后,你就可以调用高级的优化函数,这个函数叫 fminunc,它表示Octave 里无约束最小化函数。调用它的方式如下:
options=optimset('GradObj','on','MaxIter',100); initialTheta=zeros(2,1);
[optTheta, functionVal, exitFlag]=fminunc(@costFunction, initialTheta, options);
你要设置几个options,这个 options 变量作为一个数据结构可以存储你想要的options,所以 GradObj 和On,这里设置梯度目标参数为打开(on),这意味着你现在确实要给这个算法提供一个梯度,然后设置最大迭代次数,比方说100,我们给出一个
θ
\theta
θ的猜测初始值,它是一个2×1的向量,那么这个命令就调用fminunc,这个@符号表示指向我们刚刚定义的costFunction 函数的指针。如果你调用它,它就会使用众多高级优化算法中的一个,当然你也可以把它当成梯度下降,只不过它能自动选择学习速率
α
\alpha
α,你不需要自己来做。然后它会尝试使用这些高级的优化算法,就像加强版的梯度下降法,为你找到最佳的
θ
\theta
θ
7.多类别分类:一对多
从数据集上理解多类别分类问题
二元分类
多类别问题,如三个类型的数据集
方法:在多类别分类问题中,我们应用一对多的分类思想将其用在多类分类问题
如图理解
这里的三角形是正样本,而圆形代表负样本。设置三角形的值为1,圆形的值为0,下面我们来训练一个标准的逻辑回归分类器,这样我们就得到一个正边界。
即我们将多个类中的一个类标记为正向类(y=1),然后将其他所有类标记负向类,记模型
随后依次类推标记另一个类为正向类,得到一系列的模型简记为
最后,在我们需要做预测时,我们将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量。
总之,我们已经把要做的做完了,现在要做的就是训练这个逻辑回归分类器:
h
θ
(
i
)
(
x
)
h_\theta^{(i)}(x)
hθ(i)(x),其中i对应每一个可能的y=i,最后,为做出预测我们给出输入一个新的 x值,用这个做预测。我们要做的就是在我们三个分类器里面输入 x,然后选择一个让
h
θ
(
i
)
(
x
)
h_\theta^{(i)}(x)
hθ(i)(x)最大的i,即
m
a
x
h
θ
(
i
)
(
x
)
maxh_\theta^{(i)}(x)
maxhθ(i)(x)
现在知道了基本的挑选分类器的方法,选择出哪一个分类器是可信度最高效果最好的,那么就可认为得到一个正确的分类,无论i值是多少,我们都有最高的概率值,我们预测y就是那个值。这就是多类别分类问题,以及一对多的方法,通过这个小方法,现在也可以将逻辑回归分类器用在多类分类的问题上。