第六章
目录
6 - 1 - Classification
6 - 2 - Hypothesis Representation
6 - 3 - Decision Boundary
6 - 4 - Cost Function
6 - 5 - Simplified Cost Function and Gradient Descent
6 - 6 - Advanced Optimization
6 - 7 - Multiclass Classification_ One-vs-all
6 - 1 - Classification
在分类问题中,预测的变量
y
y
y 是离散的值(例如0,1),我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,是使用最广泛的算法之一。
在分类问题中,预测的是结果是否属于某一个类(例如正确或错误)。例如:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;区别一个肿瘤是恶性的还是良性的。
如果用线性回归算法来解决一个分类问题,对于分类, ? 取值为 0 或者1,但如果使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于0,即使所有训练样本的标签 ? 都等于 0 或 1。尽管我们知道标签应该取值0 或者1,但是如果算法得到的值远大于1 或者远小于0 的话,就很奇怪。
根据线性回归模型我们只能预测连续的值,然而对于分类问题,只需要输出0 或1,则我们可以将预测转化为:
当
h
θ
(
x
)
>
=
0.5
ℎ_\theta(x) >= 0.5
hθ(x)>=0.5时,预测 ? = 1。
当
h
θ
(
x
)
<
0.5
ℎ_\theta(x) < 0.5
hθ(x)<0.5时,预测 ? = 0 。
对于上图所示的数据,这样的一个线性模型似乎能很好地完成分类任务。假使我们又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入到我们的训练集中来,这将使得我们获得一条新的直线。
这时,再使用0.5 作为阀值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越[0,1]的范围,并不适合解决这样的问题。所以接下来的要研究的算法为做逻辑回归算法,通过sigmod函数使得它的输出值永远在0 到 1 之间。
注:逻辑回归算法虽然名为回归算法但是确是分类算法
6 - 2 - Hypothesis Representation
逻辑回归模型的假设是:
h
θ
(
x
)
=
g
(
θ
T
X
)
ℎ_\theta(x) = g(\theta^TX)
hθ(x)=g(θTX)其中: ? 代表特征向量 ? 代表逻辑函数(logistic function)是一个常用的逻辑函数为S 形函数(Sigmoid function),公式为:
g
(
z
)
=
1
1
+
e
−
z
g(z) =\frac{1}{1+e^{−z}}
g(z)=1+e−z1。
python代码
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
h
θ
(
x
)
ℎ_\theta(x)
hθ(x)的作用是,对于给定的x,根据
θ
\theta
θ计算y=1 的可能性(estimated probablity)即
h
θ
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
ℎ_\theta(x) = P(y = 1|x; \theta)
hθ(x)=P(y=1∣x;θ)
例如,如果对于给定的x,通过已经确定的参数计算得出
h
θ
(
x
)
ℎ_\theta(x)
hθ(x)= 0.7,则表示有70%的几率?为正向类,相应地y为负向类的几率为1-0.7=0.3。
6 - 3 - Decision Boundary
下决策边界(decision boundary),这个概念能更好地帮助理解逻辑回归的假设函数在计算什么。
由上图可知,根据上面绘制出的 S 形函数图像,我们知道当
? = 0 时 ?(?) = 0.5
? > 0 时 ?(?) > 0.5
? < 0 时 ?(?) < 0.5
又 ? =
θ
T
x
\theta ^Tx
θTx ,即:
θ
T
x
\theta ^Tx
θTx >= 0 时,预测 ? = 1
θ
T
x
\theta ^Tx
θTx < 0 时,预测 ? = 0
6 - 4 - Cost Function
对于线性回归模型,定义的代价函数是模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将
h
θ
(
x
)
=
1
1
+
e
−
θ
T
x
h_\theta(x) =\frac{1}{1+e^{−\theta ^Tx}}
hθ(x)=1+e−θTx1。带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)
J
(
θ
0
,
θ
1
,
.
.
.
,
θ
n
)
=
1
2
m
Σ
i
=
1
m
(
h
θ
(
x
i
)
−
y
(
i
)
)
2
J(\theta_0,\theta_1, . . . ,\theta_n) = \frac{1}{2m}\Sigma_{i=1}^m(h_\theta(x^{i})-y^{(i)})^2
J(θ0,θ1,...,θn)=2m1Σi=1m(hθ(xi)−y(i))2
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
我们重新定义逻辑回归的代价函数为:?(?) =
J
(
θ
0
,
θ
1
,
.
.
.
,
θ
n
)
=
1
m
Σ
i
=
1
m
C
o
s
t
(
h
θ
(
x
i
)
,
y
(
i
)
)
J(\theta_0,\theta_1, . . . ,\theta_n) = \frac{1}{m}\Sigma_{i=1}^mCost(h_\theta(x^{i}),y^{(i)})
J(θ0,θ1,...,θn)=m1Σi=1mCost(hθ(xi),y(i)) ,其中
当实际的 ? = 1 且
h
θ
(
x
)
h_\theta(x)
hθ(x)也为 1 时误差为 0,当 ? = 1 但
h
θ
(
x
)
h_\theta(x)
hθ(x)不为1 时误差随着
h
θ
(
x
)
h_\theta(x)
hθ(x)变小而变大;当实际的 ? = 0 且
h
θ
(
x
)
h_\theta(x)
hθ(x)也为 0 时代价为 0,当? = 0 但
h
θ
(
x
)
h_\theta(x)
hθ(x)不为 0 时误差随着 ℎ?(?)的变大而变大。
Python 代码实现:
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))
6 - 5 - Simplified Cost Function and Gradient Descent
将构建的
C
o
s
t
(
h
θ
(
x
i
)
,
y
(
i
)
)
Cost(h_\theta(x^{i}),y^{(i)})
Cost(hθ(xi),y(i))简化如下:
C
o
s
t
(
h
θ
(
x
i
)
,
y
(
i
)
)
=
−
y
×
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
×
l
o
g
(
1
−
h
θ
(
x
)
)
Cost(h_\theta(x^{i}),y^{(i)})=-y ×log(h_\theta(x)) − (1 − y)× log(1 − ℎ_\theta(x))
Cost(hθ(xi),y(i))=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
带入代价函数得到:
J
(
θ
)
=
1
m
Σ
i
=
1
m
[
−
y
×
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
×
l
o
g
(
1
−
h
θ
(
x
)
)
]
J(\theta) = \frac{1}{m}\Sigma_{i=1}^m[-y ×log(h_\theta(x)) − (1 − y)× log(1 − ℎ_\theta(x))]
J(θ)=m1Σi=1m[−y×log(hθ(x))−(1−y)×log(1−hθ(x))]
即:
J
(
θ
)
=
−
1
m
Σ
i
=
1
m
[
y
×
l
o
g
(
h
θ
(
x
)
)
+
(
1
−
y
)
×
l
o
g
(
1
−
h
θ
(
x
)
)
]
J(\theta) = -\frac{1}{m}\Sigma_{i=1}^m[y ×log(h_\theta(x)) +(1 − y)× log(1 − ℎ_\theta(x))]
J(θ)=−m1Σi=1m[y×log(hθ(x))+(1−y)×log(1−hθ(x))]
这里的代价函数
J
(
θ
)
J(\theta)
J(θ)是一个凸函数,并且没有局部最优值。
梯度下降算法:
求导过程如下:
虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的
h
θ
(
x
)
=
g
(
θ
T
X
)
ℎ_\theta(x) = g(\theta^TX)
hθ(x)=g(θTX)与线性回归中不同,所以实际上是不一样的。另外,逻辑回算法中进行特征缩放依旧是非常必要的。
6 - 6 - Advanced Optimization
除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS)
这三种算法有许多优点:
通常不需要手动选择学习率 ?,所以对于这些算法的一种思路是,给出计算导数项和代价函数的方法,他们有一个智能的内部循环,称为线性搜索(line search)算法,可以自动尝试不同的学习速率 ?,并自动选择一个好的学习速率 ?,甚至可以为每次迭代选择不同的学习速率,不需要自己选择。这些算法实际上在做更复杂的事情,而不仅仅是选择一个好的学习率,所以它们往往最终收敛得远远快于梯度下降。
6 - 7 - Multiclass Classification_ One-vs-all
可以将其中两类归为一类,还是采用逻辑回归就可以解决。如图