本文本文所述内容,参考了机器学习实战:基于Scikit-Learn和TensorFlow一书。
从上往下,本文的代码可完整运行。

逻辑回归(Logistic回归,也称为罗吉思回归)被广泛用于估算一个实例属于某个特定类别的概率。

概率估算

  1. 逻辑回归模型概率估算(向量化形式)
    <mover> y </mover> = h θ ( X ) = σ ( θ T X ) \mathop y\limits^ \wedge = {h_\theta }(X) = \sigma ({\theta ^T} \cdot X) y=hθ(X)=σ(θTX)
  2. 逻辑函数
    σ ( t ) = 1 1 + exp ( t ) \sigma (t) = {1 \over {1 + \exp ( - t)}} σ(t)=1+exp(t)1
  3. 逻辑回归模型预测
    当t<0时,σ(t)<0.5;当t≥0时,σ(t)≥0.5。所以如果θT·x是正类,逻辑回归模型预测结果是1,如果是负类,则预测为0。

训练和成本函数

  1. 单个训练实例的成本函数
  2. 逻辑回归成本函数(log损失函数)
  3. 逻辑回归成本函数偏导数
    θ j J ( θ ) = 1 m i = 1 m ( σ ( θ T X ( i ) ) y ( i ) ) x j ( i ) {\partial \over {\partial {\theta _j}}}J(\theta ) = {1 \over m}\sum\nolimits_{{\rm{i}} = 1}^m {(\sigma ({\theta ^T} \cdot {X^{(i)}}) - {y^{(i)}}){x_j}^{(i)}} θjJ(θ)=m1i=1m(σ(θTX(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鸢尾花。
逻辑回归模型可以用l1l2惩罚函数来正则化。Scikit-Learn默认添加的是l2函数。

log_reg = LogisticRegression(C=0.2)                # 其他线性模型使用alpha

Softmax回归

逻辑回归模型可以直接支持多个类别,即多元逻辑回归。
对于一个给定的实例x,Softmax回归模型首先计算出每个类别k的分数sk(x),然后对这些分数应用softmax函数(也叫归一化指数),估算出每个类别的概率。

  1. 类别k的Softmax分数
    s k ( X ) = θ k T X {s_k}(X) = \theta _k^T \cdot X sk(X)=θkTX
    每个类别都有自己特定的参数向量θk。所有这些向量通常都作为行存储在参数矩阵Θ中。
  2. Softmax函数
    <munderover> p k </munderover> = σ ( s ( X ) ) k = exp ( s k ( X ) ) <munderover> j = 1 k </munderover> exp ( s j ( X ) ) {\mathop p\limits^ \wedge _k} = \sigma {(s(X))_k} = {{\exp ({s_k}(X))} \over {\sum\limits_{j = 1}^k {\exp ({s_j}(X))} }} kp=σ(s(X))k=j=1kexp(sj(X))exp(sk(X))
  3. Softmax回归分类器预测
    训练目标是得到一个能对目标类别做出高概率估算的模型(也就是其他类别的概率相应要很低)。
  4. 交叉熵成本函数
    J ( Θ ) = 1 m <munderover> i = 1 m </munderover> <munderover> k = 1 K </munderover> [ y k ( i ) log ( <mover> p k </mover> ( i ) ) ] J(\Theta ) = - {1 \over m}\sum\limits_{i = 1}^m {\sum\limits_{k = 1}^K {[{y_k}^{(i)}\log ({{\mathop {{p_k}}\limits^ \wedge }^{(i)}})]} } J(Θ)=m1i=1mk=1K[yk(i)log(pk(i))]
    如果第i个实例的目标类别为k,则 y k ( i ) {{y_k}^{(i)}} yk(i) 等于1,否则为0。当只有两个类别(K=2)时,该成本函数等价于逻辑回归的成本函数(log损失函数)。
  5. 对于类别k的交叉熵梯度向量
    θ k J ( Θ ) = 1 m i = 1 m ( <mover> p k </mover> ( i ) y k ( i ) ) X ( i ) {\nabla _{{\theta _k}}}J(\Theta ) = {1 \over m}\sum\nolimits_{{\rm{i}} = 1}^m {({{\mathop {{p_k}}\limits^ \wedge }^{(i)}} - {y_k}^{(i)}){X^{(i)}}} θkJ(Θ)=m1i=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]]