逻辑回归
- 0. 本质和概述
- 本质:y 表达了正例的可能性
- 概念/术语
- 1. 假设函数
- 建模过程:用对数几率去拟合一条线性回归线
- 逻辑回归模型
- 2. 损失函数
- 3. 优化算法
- 3.1 极大似如估计:去求解概率函数的极大值
- 3.2 梯度下降法:求解极大值
- 4. 代码实例
- 4.1 一维(特征)数据
- 4.2 二维数据
- Softmax回归
逻辑回归类似于多元线性回归,只是结果是二元的。它使用多种变换将问题转换成可以拟合线性模型的问题。更准确地说,逻辑回归也是一种线性模型 y = wTx,为了解决分类问题而引入了一个非线性的决策函数g(·),用来将输出由实数变为离散标签—— LR 选择的是Sigmoid 函数,即 y = Sigmoid(wTx)。
0. 本质和概述
本质:y 表达了正例的可能性
利用 y = wTx + b 对新样本 x 进行分类,并用预测出的 y 值与一个阈值进行比较。
例如通常在 y > 0.5(1-y < 0.5)时判别为正例,否则为反例。
核心:直接从样本估计出它属于正负样本的概率
Logistic 回归 或者叫 逻辑回归 虽然名字有回归,但是它是用来做分类的。其主要思想是: 根据现有数据对分类边界线(Decision Boundary)建立回归公式,以此进行分类。
概念/术语
- Logistic 函数
一种能将属于某个类的概率映射到 ±∞ 范围上(而不是 0 到 1 之间)的函数。(注意并不是最终的比例)
Logistic 函数 = 对数几率函数 - 几率
“成功”(1)与“不成功”(0)之间的比率。 - 结果变量:标签是 1 的概率 p(而不是简单二元标签)
结果变量 = 变量 y
1. 假设函数
建模过程:用对数几率去拟合一条线性回归线
首先,我们不能将结果变量简单看作二元标签,而应视为标签是 1 的概率 p。
若直接建模,并不能确保概率 p 位于 [0, 1] 区间内:
下面换一种做法。我们通过在预测因子中应用逻辑响应函数(逆逻辑回归函数)去建模p:
这一转换确保了 p 值位于 [0, 1] 区间内。注意:
对等式两端取对数,得:
对数几率函数也称Logistic函数。
完成这样的转换过程后,我们就可以使用线性模型去预测概率。
逻辑回归模型
- 线性回归模型的模型
- Sigmoid函数
逻辑回归的模型定义(需要借助Sigmoid函数): - 逻辑回归的模型
- 逻辑回归的模型的预测
假定上个表达式是等于类 1 的概率,自然等于类 0 的概率等于1减去等于类 1 的概率。
就是将上面两个式子整合为下面一个公式:
2. 损失函数
先求出由所有样本组成的似然函数,转化为对数似然,转化为梯度下降,根据梯度下降的方向更新迭代权重参数,选取代价函数本次与上次的差小于某个阈值的迭代思路。
- 似然函数
m表示样本个数。
对数似然如下:
然后,利用对数极大似然估计,即求上式的极大值,引入因子 -1/m,转化为求下式的极小值:
即为逻辑回归代价函数(log损失函数)
3. 优化算法
逻辑回归代价函数没有已知的闭式方程(不存在一个标准方程的等价方程)来计算出最小化成本函数的θ值。但是,这是个凸函数,所以通过梯度下降(或是其他任意优化算法)保证能够找出全局最小值。
3.1 极大似如估计:去求解概率函数的极大值
L(θ) 就是 LR 的似然函数。我们要让它达到最大,也就是对其进行“极大估计”。因此,求解 LR 目标函数的过程,就是对 LR 模型函数进行极大似然估计的过程。
l(θ) 其实可以作为 LR 的目标函数。前面讲过,我们需要目标函数是一个凸函数,具备最小值。因此我们设定:J(θ)=−l(θ)。
这样,求 l(θ) 的最大值就成了求 J(θ) 的最小值。J(θ) 又叫做负对数似然函数。它就是 LR 的目标函数。
3.2 梯度下降法:求解极大值
4. 代码实例
4.1 一维(特征)数据
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
iris = datasets.load_iris()
list(iris.keys())
# 我们试试仅基于花瓣宽度这一个特征,创建一个分类器来检测Virginica鸢尾花。
X = iris["data"][:, 3:] # petal width
y = (iris["target"] == 2).astype(np.int) # 1 if Iris-Virginica, else 0
log_reg = LogisticRegression()
log_reg.fit(X, y)
X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
y_proba
plt.scatter(X, y)
plt.plot(X_new, y_proba)
# plt.plot(X_new, y_proba[:, 1], "g-", label="Iris-Virginica")
# plt.plot(X_new, y_proba[:, 0], "b--", label="Not Iris-Virginica")
注意,这里有一部分重叠。在大约1.6厘米处存在一个决策边界,这里“是”和“不是”的可能性都是50%
4.2 二维数据
- 导入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
- 准备数据
X, y = make_blobs(n_samples=100, centers=2,
cluster_std=0.60, random_state=0)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
- 拟合数据
logistic_model = LogisticRegression()
logistic_model.fit(X, y)
- 预测数据
# 产生新(二维)数据
rng = np.random.RandomState(0)
X_new = [-1, -1] + [5, 7] * rng.rand(2000, 2)
print(X_new.shape)
print(X_new[0:3, :])
plt.scatter(X_new[:, 0], X_new[:, 1], s=10)
(2000, 2)
[[1.74406752 4.00632556]
[2.01381688 2.81418228]
[1.118274 3.52125879]]
新数据:
- 预测
y_pred = logistic_model.predict(X_new)
print(y_pred.shape)
print(y_pred[0:3])
(2000,)
[0 1 0]
- 可视化逻辑回归训练结果
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
plt.scatter(X_new[:, 0], X_new[:, 1], c=y_pred, s=5, alpha=0.5)
可以清晰地看出模型的预测结果
(相对于可视化决策边界更加直观)
附:也可以使用 plt 的 pcolormesh() 函数进行绘制分类图(根据y的取值画上不同的颜色)
逻辑回归介绍利用plt.pcolormesh绘制分类图
Softmax回归
逻辑回归模型经过推广,可以直接支持多个类别,而不需要训练并组合多个二元分类器。这就是Softmax回归,或者叫多元逻辑回归。
参考
- 逻辑回归——非线性逻辑函数的由来
- 逻辑回归——用来做分类的回归模型
- 《机器学习实战基于scikitlearn和tensorflow》
- 一句话+一张图说清楚 Logistic回归 算法