本章开始学习分类啦~
Topic:
- 逻辑回归 ( 逻辑回归 与 线性回归的关系)
- 逻辑回归模型
- 梯度下降法
一、逻辑回归
逻辑回归(Logistic Regression),又叫逻辑斯蒂回归,是机器学习中一种十分基础的分类方法。
逻辑回归是中分类方法,而并不是回归方法
线性可分
在二维平面内,如果只使用一条直接就可以将样本分开,则称线性可分,否则为线性不可分
那在三维空间呢?
如果在三维空间,可以通过一个平面去将样本分开,也称为线性可分。
举个例子:
这里有一些点,点的 y
坐标的值只有 0
和 1
,分别表示为 通过
和 不通过
。 称之为:0 - 1
分类问题
对于这个样一个二分类问题,怎么样用线性回归去解决?
在这里,定义:通过线性拟合函数
f(x)
f
(
x
)
计算结果
f(x)>0.5
f
(
x
)
>
0.5
(靠近 1)代表 PASS
,而
f(x)<=0.5
f
(
x
)
<=
0.5
(靠近 0 )代表不通过。
比如绘制了这些点
同时使用 sklearn
完成线性回归拟合过程。
如果按照上面的定义,即通过线性拟合函数
f(x)
f
(
x
)
计算的结果
f(x)>0.5
f
(
x
)
>
0.5
代表 PASS
,而
f(x)<=0.5
f
(
x
)
<=
0.5
代表不通过。
凡是 scores
大于橙色竖线对应 x 坐标值的部分均会被判断为 PASS
,也就是被棕色选框圈出的 2 个点就被错误分类。
那如何解决这个错分呢? —— 换个线性拟合函数?
Sigmoid 分布函数
这个函数定义如下:
f(z)=11+e−z(2) (2) f ( z ) = 1 1 + e − z
这个图像呈现出完美的 S 型(Sigmoid 的含义)
它的取值仅介于0
和1
之间,且关于z=0
轴中心对称。同时当z
越大时,y
越接近于1
,而z
越小时,y
越接近于0
。如果我们以0.5
为分界点,将> 0.5
或< 0.5
的值分为两类,这不就是解决0-1
二分类问题的完美选择嘛。
二、逻辑回归模型
发现拟合后的线性函数的 y
值介于
(−∞,+∞)
(
−
∞
,
+
∞
)
,而 Sigmoid 函数,它的 y
值介于
(0,1)
(
0
,
1
)
之间
将两者结合起来,把线性函数拟合的结果使用 Sigmoid 函数压缩到 (0, 1)之间。
对于公式(3),一般情况下: w0=b w 0 = b , x0=1 x 0 = 1 ,也就是对应着线性函数中的截距项。
"""逻辑回归模型
"""
def sigmoid(z):
sigmoid = 1 / (1 + np.exp(-z))
return sigmoid
每一个特征 x x 乘上系数 ,然后通过 Sigmoid 函数计算 f(z) f ( z ) 值得到概率。其中, z z 可以被看作是分类边界。
对数损失函数
接下来,需要对公式(3)中的参数 wT w T 进行求解。
求解参数之前,需要定义损失函数。
损失函数就是衡量预测值和真实值差异的函数,例如线性回归中我们使用了平方损失函数。
在逻辑回归中,我们通常会使用 对数损失函数。
"""对数损失函数
"""
def loss(h, y):
loss = (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
return loss
那为什么设置 损失函数呢?
设置损失函数的目的是:通过最优化方法求得损失函数的最小值,损失最小 一般即代表模型最优。
而在最优化求解中,只有凸函数才能求得全局最小值,非凸函数往往得到的是局部最优。
然而,平方损失函数用于逻辑回归求解时得到的是非凸函数,即大多数情况下无法求得全局最优。
所以这里使用了 对数损失函数 来避免这个问题
三、梯度下降
如何求得损失函数的极小值?
为了求解公式(5)的极小值,这里引入一种叫「梯度下降」的求解方法。
那什么是梯度下降?
「梯度」?梯度是一个向量,它表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
函数在沿梯度方向变化最快
「梯度下降法」的核心就是,我们沿着梯度下降方向去寻找损失函数的极小值
针对公式(5)求偏导数,得到梯度。
当我们得到梯度的方向,然后乘以一个常数 α α ,就可以得到每次梯度下降的步长(上图箭头的长度)。最后,通过多次迭代,找到梯度变化很小的点,也就对应着损失函数的极小值了。其中,常数 α α 往往也被称之为学习率 Learning Rate。执行权重更新的过程为:
"""梯度计算
"""
def gradient(X, h, y):
gradient = np.dot(X.T, (h - y)) / y.shape[0]
return gradient