我们在线性回归中很好地理解了均方误差的公式。理解了要进行全局误差优化(在线性回归中通常是梯度下降)首先得有一个损失函数来计算单个数据的损失。在多分类问题解决方法Softmax回归模型中,通常使用的损失函数就是交叉熵损失函数,在讲交叉熵损失函数之前,我们先理解了Softmax函数是如何将数据转换为概率的。
交叉熵误差计算的是模型预测的概率分布与实际概率分布之间的差异。对于一个多分类问题,假设模型的输出经过 Softmax 函数转换成了概率分布
P
P
P,并且我们有真实的标签概率分布
Q
Q
Q。交叉熵损失函数如下:
H
(
Q
,
P
)
=
?
∑
c
=
1
C
Q
c
l
o
g
(
P
c
)
H(Q, P) = -∑_{c=1}^{C} Q_c log(P_c)
H(Q,P)=?c=1∑C?Qc?log(Pc?)
其中:
J
(
θ
)
=
?
1
m
∑
i
=
1
m
∑
c
=
1
C
y
c
(
i
)
log
?
(
h
θ
(
x
(
i
)
)
c
)
J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \sum_{c=1}^{C} y_c^{(i)} \log(h_{\theta}(x^{(i)})_c)
J(θ)=?m1?i=1∑m?c=1∑C?yc(i)?log(hθ?(x(i))c?)
其中:
对于二分类问题,这个公式可以简化为:
J ( θ ) = ? 1 m ∑ i = 1 m [ y ( i ) log ? ( h θ ( x ( i ) ) ) + ( 1 ? y ( i ) ) log ? ( 1 ? h θ ( x ( i ) ) ) ] J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} [ y^{(i)} \log(h_{\theta}(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_{\theta}(x^{(i)})) ] J(θ)=?m1?i=1∑m?[y(i)log(hθ?(x(i)))+(1?y(i))log(1?hθ?(x(i)))]
这里:
交叉熵损失现在已经被应用于非常多的方面,不仅仅是多分类问题,能够很好地衡量两个概率分布之间差异的度量。交叉熵损失函数比均方误差更不容易陷入梯度消失的问题,所以在机器学习框架中(如TensorFlow或PyTorch),交叉熵损失函数通常已经作为内置函数实现。
在代码中Softmax回归代码如下,使用鸢尾花数据集可以获得100%正确率的成绩,相比逻辑回归OvR策略的结果要好很多:
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建Softmax回归模型
softmax_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=200)
# 训练模型
softmax_reg.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = softmax_reg.predict(X_test)
# 评估模型
report = classification_report(y_test, y_pred)
print(report)
分类结果:
类别 | 精度 (Precision) | 召回率 (Recall) | F1得分 | 支持 (Support) |
---|---|---|---|---|
0 | 1.00 | 1.00 | 1.00 | 19 |
1 | 1.00 | 1.00 | 1.00 | 13 |
2 | 1.00 | 1.00 | 1.00 | 13 |
总计 | 1.00 | 1.00 | 1.00 | 45 |