逻辑回归
本文本文所述内容,参考了
机器学习实战:基于Scikit-Learn和TensorFlow
一书。
从上往下,本文的代码可完整运行。
逻辑回归(Logistic回归,也称为罗吉思回归)被广泛用于估算一个实例属于某个特定类别的概率。
概率估算
- 逻辑回归模型概率估算(向量化形式)
y∧=hθ(X)=σ(θT⋅X) - 逻辑函数
σ(t)=1+exp(−t)1
- 逻辑回归模型预测
当t<0时,σ(t)<0.5;当t≥0时,σ(t)≥0.5。所以如果θT·x是正类,逻辑回归模型预测结果是1,如果是负类,则预测为0。
训练和成本函数
- 单个训练实例的成本函数
- 逻辑回归成本函数(log损失函数)
- 逻辑回归成本函数偏导数
∂θj∂J(θ)=m1∑i=1m(σ(θT⋅X(i))−y(i))xj(i)
计算出每个实例的预测误差,并将其乘以第j个特征值,然后再对所有训练实例求平均值。
决策边界
用鸢尾植物数据集来说明逻辑回归。共有150朵鸢尾花,分别来自三个不同品种:Setosa鸢尾花、Versicolor鸢尾花和Virginica鸢尾花,数据里包含花的萼片以及花瓣的长度和宽度。
基于花瓣长度来创建分类器:
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
iris = datasets.load_iris()
print(list(iris)) # ['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']
X = iris["data"][:, 3:] # petal width
y = (iris['target'] == 2).astype(np.int) # 1 if Iris-Virginica, else 0
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X, y)
# 花瓣长度在0-3cm
X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
plt.plot(X_new, y_proba[:, 1], 'g-', label="Iris-Virginica")
plt.plot(X_new, y_proba[:, 0], 'b--', label="Not Iris-Virginica")
plt.xlabel('petal width')
plt.ylabel("Probability")
plt.legend()
plt.show()
Virginica鸢尾花的花瓣宽度范围为1.4~2.5厘米,而其他两种鸢尾花花瓣通常较窄,花瓣宽度范围为0.1~1.8厘米。对花瓣宽度超过2cm的花,分类器可以很有信心地说它是一朵Virginica鸢尾花(对该类别输出一个高概率值),对花瓣宽度低于1cm以下的,也可以胸有成竹地说其不是(对“非Virginica鸢尾花”类别输出一个高概率值)。但在这两者之间分类器却不是很有把握。在大约1.6厘米处存在一个决策边
界,这里“是”和“不是”的可能性都是50%。
print(log_reg.predict([[1.7], [1.5]])) # [1 0]
使用花瓣宽度和花瓣长度两个特征,虚线表示模型估算概率为
50%的点,即模型的决策边界。使方程θ0+θ1x1+θ2x2=0的点x的集合,这个方程定义的是一条直线。)从左下的15%到右上的90%。根据这个模型,右上线之上的所有花朵,都有超过90%的概率属于Virginica鸢尾花。
逻辑回归模型可以用
l1
或l2
惩罚函数来正则化。Scikit-Learn默认添加的是l2函数。
log_reg = LogisticRegression(C=0.2) # 其他线性模型使用alpha
Softmax回归
逻辑回归模型可以直接支持多个类别,即多元逻辑回归。
对于一个给定的实例x,Softmax回归模型首先计算出每个类别k的分数sk(x),然后对这些分数应用softmax函数(也叫归一化指数),估算出每个类别的概率。
- 类别k的Softmax分数
sk(X)=θkT⋅X
每个类别都有自己特定的参数向量θk。所有这些向量通常都作为行存储在参数矩阵Θ中。 - Softmax函数
kp∧=σ(s(X))k=j=1∑kexp(sj(X))exp(sk(X)) - Softmax回归分类器预测
训练目标是得到一个能对目标类别做出高概率估算的模型(也就是其他类别的概率相应要很低)。
- 交叉熵成本函数
J(Θ)=−m1i=1∑mk=1∑K[yk(i)log(pk∧(i))]
如果第i个实例的目标类别为k,则 yk(i) 等于1,否则为0。当只有两个类别(K=2)时,该成本函数等价于逻辑回归的成本函数(log损失函数)。 - 对于类别k的交叉熵梯度向量
∇θkJ(Θ)=m1∑i=1m(pk∧(i)−yk(i))X(i)
可以计算出每个类别的梯度向量,然后使用梯度下降(或任意其他优化算法)找到最小化成本函数的参数矩阵Θ。
X = iris['data'][:, (2, 3)] # # petal length, petal width
y = iris["target"]
# 的LogisticRegressio默认选择使用的是一对多的训练方式,以下为softmax回归,默认l2正则
softmax_reg = LogisticRegression(multi_class="multinomial", solver='lbfgs', C=0.2)
softmax_reg.fit(X, y)
print(softmax_reg.predict([[5, 2]])) # [2]
print(softmax_reg.predict_proba([[5, 2]])) # [[0.00454305 0.34143078 0.65402617]]