1.逻辑回归理论
机器学习最常用的两种场景无非是分类、回归,其中:
分类
:预测连续的、具体的数值。比如:支付宝里的芝麻信用分数评估,房价预测等。
回归
:对各种事物分门别类,用于离散型预测。比如:图片分类,癌症类型诊断等。
当然机器学习除了分类、回归以外,还可用于聚类、降维等。
首先要明白的是逻辑回归是一个分类算法,不要被名字迷惑了,可用于二分类,多分类等。
下面来讲讲逻辑回归的理论知识:
对于分类问题,简单来讲,就是预测概率,对于二分类问题,我们通常用y=0或者y=1来表示样本标签,我们预测该样本标签 y = 0 y=0 y=0的概率为 p p p,这 y = 1 y=1 y=1的概率为 1 − p 1-p 1−p,然后我们只用通过比较 p p p与 1 − p 1-p 1−p的大小,就可以将该样本归于概率更大的一类。对于多分类问题,同样可以这么理解。对于有些场景,我们还可以设置一个阈值,当预测的值大于该阈值时,则可以将该样本划分为某一类(前面比较的 p p p和 1 − p 1-p 1−p,其实就相当于将阈值设为了0.5)。
首先对于线性回归假设函数:
h θ ( x ) = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n {h_\theta}\left( x \right)={\theta^T}X={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}} hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn
其中: x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn是输入样本的 n n n个特征, θ 0 , θ 1 , . . . θ n \theta_0, \theta_1, ...\theta_n θ0,θ1,...θn为每个特征的权重系数。
我们如果用线性回归来做二分类的话,可能会得到远大于1或者小于0的值,得到的结果可能会让我们有点不好理解,因为概率肯定都是在0~1之间的。
所以我们就对线性回归做了如下的改进,变成下面的逻辑回归假设函数,使模型的输出变量范围始终在0和1之间。 逻辑回归模型的假设是:
h
θ
(
x
)
=
g
(
θ
T
X
)
h_\theta \left( x \right)=g\left(\theta^{T}X \right)
hθ(x)=g(θTX)
其中:
X
X
X 代表特征向量,
g
g
g 代表逻辑函数(logistic function)是一个常用的逻辑函数为S形函数(Sigmoid function),公式为:
g
(
z
)
=
1
1
+
e
−
z
g\left( z \right)=\frac{1}{1+{{e}^{-z}}}
g(z)=1+e−z1。
python代码实现:
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
该函数的图像为:
就可以看到经过逻辑回归运算的输出值都被映射在了[0,1]之间。
所以我们就得到逻辑回归的表达式:
h
θ
(
x
)
=
1
1
+
e
−
θ
T
X
{h_\theta}\left( x \right)=\frac{1}{1+{{e}^{-{\theta^T}X}}}
hθ(x)=1+e−θTX1
h θ ( x ) h_\theta \left( x \right) hθ(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性(estimated probablity)即 h θ ( x ) = P ( y = 1 ∣ x ; θ ) h_\theta \left( x \right)=P\left( y=1|x;\theta \right) hθ(x)=P(y=1∣x;θ) 例如,如果对于给定的 x x x,通过已经确定的参数计算得出 h θ ( x ) = 0.7 h_\theta \left( x \right)=0.7 hθ(x)=0.7,则表示有70%的几率 y y y为正向类,相应地 y y y为负向类的几率为1-0.7=0.3。
2.代价函数
我们知道了逻辑回归算法是怎么运行的了,那么它的参数该
θ
0
,
θ
1
,
.
.
.
θ
n
\theta_0, \theta_1, ...\theta_n
θ0,θ1,...θn 如何确定呢。
先解释一下损失函数(loss function), 代价函数(cost function),其实就是用来衡量真实值与预测值之间的误差的,误差越大,代价也就越大。
区别就是:
(1)损失函数(Loss function)是定义在单个训练样本上的,也就是只算一个样本的误差;
(2)代价函数(Cost function)是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。
所以任务就是寻找一组最优参数 θ 0 , θ 1 , . . . θ n \theta_0, \theta_1, ...\theta_n θ0,θ1,...θn ,使得代价函数最小,即:寻找一组能使得预测值与真实值最为接近的参数。
我们先直接给出他的损失函数:
C o s t ( h θ ( x ) , y ) = − y × l o g ( h θ ( x ) ) − ( 1 − y ) × l o g ( 1 − h θ ( x ) ) Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right) Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
其中:
y
y
y 为样本的真实标签,
h
θ
(
x
)
h_\theta(x)
hθ(x) 为预测的标签值。
其可以拆分为:
i
f
:
y
=
1
if :y=1
if:y=1
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
l
o
g
(
h
θ
(
x
)
)
Cost\left( {h_\theta}\left( x \right),y \right)=-log\left( {h_\theta}\left( x \right) \right)
Cost(hθ(x),y)=−log(hθ(x))
i
f
:
y
=
0
if :y=0
if:y=0
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
l
o
g
(
1
−
h
θ
(
x
)
)
Cost\left( {h_\theta}\left( x \right),y \right)=-log\left( 1-{h_\theta}\left( x \right) \right)
Cost(hθ(x),y)=−log(1−hθ(x))
这样构建的 C o s t ( h θ ( x ) , y ) Cost\left( {h_\theta}\left( x \right),y \right) Cost(hθ(x),y)函数的特点是:当实际的 y = 1 y=1 y=1 且 h θ ( x ) {h_\theta}\left( x \right) hθ(x)也为 1 时误差为 0,当 y = 1 y=1 y=1 但 h θ ( x ) {h_\theta}\left( x \right) hθ(x)不为1时误差随着 h θ ( x ) {h_\theta}\left( x \right) hθ(x)变小而变大;当实际的 y = 0 y=0 y=0 且 h θ ( x ) {h_\theta}\left( x \right) hθ(x)也为 0 时代价为 0,当 y = 0 y=0 y=0 但 h θ ( x ) {h_\theta}\left( x \right) hθ(x)不为 0时误差随着 h θ ( x ) {h_\theta}\left( x \right) hθ(x)的变大而变大。
将构建的
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
y
×
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
×
l
o
g
(
1
−
h
θ
(
x
)
)
Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)
Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
带入代价函数得到:
J
(
θ
)
=
1
m
∑
i
=
1
m
C
o
s
t
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
J\left( \theta \right) = \frac{1}{m}\sum\limits_{i=1}^{m}{Cost{\left( {h_\theta}\left( \mathop{x}^{\left( i \right)} \right),\mathop{y}^{\left( i \right)} \right)}}
J(θ)=m1i=1∑mCost(hθ(x(i)),y(i))
J
(
θ
)
=
1
m
∑
i
=
1
m
[
−
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
−
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}
J(θ)=m1i=1∑m[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]
即:
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}
J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
其中:
i
i
i为样本索引,
(
i
=
1
,
2
,
.
.
.
m
)
(i=1,2,...m)
(i=1,2,...m)
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))
在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:
Repeat { θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j} J(\theta) θj:=θj−α∂θj∂J(θ) (simultaneously update all ) }
求导后得到:
Repeat {
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta_j := \theta_j - \alpha \frac{1}{m}\sum\limits_{i=1}^{m}{{\left( {h_\theta}\left( \mathop{x}^{\left( i \right)} \right)-\mathop{y}^{\left( i \right)} \right)}}\mathop{x}_{j}^{(i)}
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i) (simultaneously update all ) }
其中:
j
j
j表示样本的特征索引,
x
j
x_j
xj表示样本的样本的第
j
j
j个特征,
θ
j
\theta_j
θj表示样本第
j
j
j个特征的权重系数,
j
=
1
,
2
,
.
.
.
n
j=1,2,...n
j=1,2,...n
最后为了避免过拟合,还可以在添加正则化,即:在代价函数中添加惩罚项,对于添加了正则项的代价函数,在求导时,也需要对正则项进行求导。
3.总结
所以总的一个过程就是: