【MachineLearning】之 逻辑回归(Logistic Regression)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanfan4569/article/details/81736959

本章开始学习分类啦~

Topic:
  1. 逻辑回归 ( 逻辑回归 与 线性回归的关系)
  2. 逻辑回归模型
  3. 梯度下降法

一、逻辑回归


逻辑回归(Logistic Regression),又叫逻辑斯蒂回归,是机器学习中一种十分基础的分类方法。

逻辑回归是中分类方法,而并不是回归方法


线性可分

二维平面内,如果只使用一条直接就可以将样本分开,则称线性可分,否则为线性不可分

这里写图片描述

那在三维空间呢?
如果在三维空间,可以通过一个平面去将样本分开,也称为线性可分。


举个例子:

这里有一些点,点的 y 坐标的值只有 01 ,分别表示为 通过不通过。 称之为:0 - 1 分类问题

对于这个样一个二分类问题,怎么样用线性回归去解决?

在这里,定义:通过线性拟合函数 f ( x ) 计算结果 f ( x ) > 0.5 (靠近 1)代表 PASS,而 f ( x ) <= 0.5 (靠近 0 )代表不通过。

扫描二维码关注公众号,回复: 3402066 查看本文章

(1) f ( x ) > 0.5 => y = 1 f ( x ) 0.5 => y = 0

比如绘制了这些点

这里写图片描述

同时使用 sklearn 完成线性回归拟合过程。

这里写图片描述

如果按照上面的定义,即通过线性拟合函数 f ( x ) 计算的结果 f ( x ) > 0.5 代表 PASS,而 f ( x ) <= 0.5 代表不通过。

凡是 scores大于橙色竖线对应 x 坐标值的部分均会被判断为 PASS,也就是被棕色选框圈出的 2 个点就被错误分类。

那如何解决这个错分呢? —— 换个线性拟合函数?

Sigmoid 分布函数

这个函数定义如下:

(2) f ( z ) = 1 1 + e z

这里写图片描述
这个图像呈现出完美的 S 型(Sigmoid 的含义)
它的取值仅介于 01 之间,且关于 z=0轴中心对称。同时当 z 越大时, y 越接近于 1,而 z 越小时, y 越接近于 0。如果我们以 0.5 为分界点,将 > 0.5< 0.5 的值分为两类,这不就是解决 0-1 二分类问题的完美选择嘛。




二、逻辑回归模型


发现拟合后的线性函数的 y 值介于 ( , + ) ,而 Sigmoid 函数,它的 y 值介于 ( 0 , 1 ) 之间

将两者结合起来,把线性函数拟合的结果使用 Sigmoid 函数压缩到 (0, 1)之间。

(3) z i = w 0 x 0 + w 1 x 1 + + w i x i = w T x f ( z i ) = 1 1 + e z i

对于公式(3),一般情况下: w 0 = b , x 0 = 1 ,也就是对应着线性函数中的截距项。

"""逻辑回归模型
"""
def sigmoid(z):
    sigmoid = 1 / (1 + np.exp(-z))
    return sigmoid

每一个特征 x 乘上系数 w ,然后通过 Sigmoid 函数计算 f ( z ) 值得到概率。其中, z 可以被看作是分类边界。

(4) h w ( x ) = f ( w T x )


对数损失函数

接下来,需要对公式(3)中的参数 w T 进行求解。

求解参数之前,需要定义损失函数。

损失函数就是衡量预测值和真实值差异的函数,例如线性回归中我们使用了平方损失函数。

在逻辑回归中,我们通常会使用 对数损失函数

(5) J ( w ) = 1 m i = 1 m [ y i log ( h w ( x ) ) ( 1 y i ) log ( 1 h w ( x i ) ) ]

"""对数损失函数
"""
def loss(h, y):
    loss = (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
    return loss
那为什么设置 损失函数呢?

设置损失函数的目的是:通过最优化方法求得损失函数的最小值,损失最小 一般即代表模型最优。

而在最优化求解中,只有凸函数才能求得全局最小值,非凸函数往往得到的是局部最优。

然而,平方损失函数用于逻辑回归求解时得到的是非凸函数,即大多数情况下无法求得全局最优。

所以这里使用了 对数损失函数 来避免这个问题




三、梯度下降


如何求得损失函数的极小值?

为了求解公式(5)的极小值,这里引入一种叫「梯度下降」的求解方法。


那什么是梯度下降?

「梯度」?梯度是一个向量,它表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

函数在沿梯度方向变化最快

「梯度下降法」的核心就是,我们沿着梯度下降方向去寻找损失函数的极小值

这里写图片描述

针对公式(5)求偏导数,得到梯度。

(6) J w = 1 m X T ( h w ( x ) y )

当我们得到梯度的方向,然后乘以一个常数 α ,就可以得到每次梯度下降的步长(上图箭头的长度)。最后,通过多次迭代,找到梯度变化很小的点,也就对应着损失函数的极小值了。其中,常数 α 往往也被称之为学习率 Learning Rate。执行权重更新的过程为:

w w α J w

"""梯度计算
"""
def gradient(X, h, y):
    gradient = np.dot(X.T, (h - y)) / y.shape[0]
    return gradient


猜你喜欢

转载自blog.csdn.net/fanfan4569/article/details/81736959