查看原文
其他

多分类逻辑回归与有序回归原理及实现(Python)

王海华 模型视角 2023-09-04

在机器学习和统计领域中,分类是最常见的任务之一。无论是预测一个患者是否患有某种疾病,银行客户是否会违约,还是在线购物者是否会点击一个广告,分类方法都扮演着关键角色。其中,逻辑回归是最经典且广泛应用的技术之一。尽管它的名字包含“回归”,但逻辑回归实际上是一种分类方法。这篇文章旨在深入探讨逻辑回归及其两种扩展:多分类逻辑回归和有序逻辑回归,这两种扩展使得逻辑回归能够处理更复杂的分类问题。

1 二分类逻辑回归

逻辑回归是一种广泛应用于分类任务的统计方法,特别是在二分类问题中。

1.1 数学模型

线性函数

首先,我们创建一个线性函数来描述特征与目标变量之间的关系。这与线性回归非常相似:

其中, 是模型的参数,而 是特征。

逻辑函数

然后,我们通过逻辑函数 (或称为 sigmoid 函数) 将线性函数的输出转换为 0 和 之间的概率。这使我们能够将连续的输出转化为一个分类输出:

其中, 是自然对数的底数。当 的值趋向于正无突时, 趋近于 1 ,而当 的值趋向于负无穷时, 趋近于0。

决策边界

为了进行分类,我们设定一个决策边界,例如 。如果 大于这个值,我们可以将观 察结果分类为类别 1 ,否则分类为类别 0 。似然函数和优化。

为了估算模型参数 ,我们使用最大似然估计。具体来说,我们希望选择 值,使得观察到的数据在模型下的似然 (即概率) 达到最大。

1.2 优化目标

逻辑回归的优化目标是最大化似然函数(或等价地,最小化对数损失)。首先,回忆逻辑回归模型的形式是:

给定一个数据集 ,其中 是第 个样本的特征向量, 是其对应的标签 (0或1),似然函数 描述了参数 对于观察到的数据的可能性:

对于单个样本 ,似然贡献为:

其中 是逻辑回归模型的预测。因此,整体似然函数为:

为了便于数学处理,我们通常考虑对数似然函数,即:

逻辑回归的目标是最大化对数似然函数。这相当于最小化负对数似然,后者常常称为对数损失:

为了找到使 最小的参数 ,我们通常使用梯度下降或其他优化算法。

1.3 应用

逻辑回归在实际应用中非常广泛,主要应用于以下领域:

  1. 医学: 例如,预测一个患者是否患有某种疾病 (是/否)。
  2. 金融: 例如,预测一个黛款申请者是否会违约。
  3. 营销: 例如,预则一个宾户是否会购买某个产品。
  4. 社交媒体:例如,预测一个用户是否会点击某个广告或链接。

2 多分类逻辑回归

多分类逻辑回归(也称为Softmax回归)是逻辑回归的推广,用于处理多于两个类别的分类问题。在二分头逻辑回归中,我们使用sigmoid函数来预测样本属于某个类别的概率,但在多分 类问题中,我们使用softmax函数来预测样本属于每个类别的概率。

2.1 数学模型

假设有 个类别,对于一个样本 ,它的特征向量为 。多分类逻辑回 归试图学习一个权重矩阵 和一个偏置向量 , 其中每一类都有一个权重向量和一个偏置 值。对于类别 ,权重向量为 ,偏置值为 。对于给定样本 ,其归一化的预测得分 (也称为logits) 为:

对所有类别,我们可以得到一个得分向量 。使用softmax函数,我们可以将这些得分转换为每个类别的概率:

其中 是目标变量,表示样本的真实类别。

2.2 优化目标

与二分类逻辑回归一样,我们的目标是最小化负对数似然损失 (cross-entropy loss)。对于一个样本 和其真实头别 ,损失函数为:

对于整个数据集,我们的目标是最小化平均损失:

其中 是样本数量。

2.3 应用

多分类逻辑回归可以应用于各种多类别分类问题,例如:

  1. 手写数字识别: 将手写数字分类为 0 到 9 。
  2. 新闻类别分类: 将新间文章分类为“政治”、“体育”、“娱乐等类别。
  3. 图像分类: 将图像分类为多个预定义的类别。

3 有序逻辑回归

有序逻辑回归 (也称为有序多项逻辑回归或有序Probit模型) 是逻辑回归的扩展,用于处理有序分类变量,即类别之间存在一个自然的顺序。例如,对产品进行评级(差、中等、好、非 常好)是一个典型的有序分类任务。与标准的多分类逻辑回归不同,有序逻辑回归考虑了类别间的顺序关系,并试图利用这种关系进行预测

3.1 数学模型

假设有 个有序的类别。我们的目标是预测给定的样本 属于每个类别的概率。

有序逻辑回归的基本思想是定义一系列的阈值 (满足 ,以及一个线性函数 . 对于类别 ,样本 被分类为该类别的概率由以下公式给出:

其中 是sigmoid函数,定义为:

给定上面的概率,属于头别 的概率可以计算为:

对于边界情况,我们有:

3.2 优化目标

与标准的逻辑回归一样,我们的目标是最小化负对数似然损失

3.3  应用

有序逻辑回归在以下情境中非常有用:

  1. 产品评级:如上所述,如果用户对产品的评级是有序的(例如,1星到5星),我们可以使用有序逻辑回归进行预测。
  2. 健康评估:例如,预恻患者的健康状况为“差”,“中等"或“好”。
  3. 经济评估:例如,预测家庭的经济状况为“低收入",“中等收入"或"高收入"。

4 Python实现多分类与有序回归

这里我将使用 sklearn 中的数据集进行分析。首先,为了说明多分类逻辑回归,使用 digits 数据集,它包含 0-9 的手写数字图片(不同类别)。然后,为了说明有序逻辑回归,我将使用 wine 数据集,这是一个酒的化学分析数据集,其中目标是预测酒的质量,这是一个有序分类问题。

4.1 手写数字识别(多分类)

我们使用 digits 数据集进行多分类逻辑回归分析。

步骤为:加载数据;分割数据为训练集和测试集;训练多分类逻辑回归模型;评估模型性能。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report

# 1. 加载数据
digits = datasets.load_digits()

# 2. 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=823)

# 3. 训练多分类逻辑回归模型
logistic_model = LogisticRegression(max_iter=10000, multi_class="multinomial")
logistic_model.fit(X_train, y_train)

# 4. 评估模型性能
y_pred = logistic_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred)

accuracy, classification_rep

多分类逻辑回归分析结果:

模型在测试集上的准确率为 96%。从分类报告中可以看到,每个数字的精确度、召回率和F1分数都很高,说明模型在分类手写数字上表现良好。

4.2 红酒分级(有序)

有序逻辑回归在 sklearn 中并没有直接的实现。但我们可以使用一个简单的方法进行模拟:将目标变量进行二值化,然后为每一个阈值训练一个二分类逻辑回归模型。例如,对于三个类别(1, 2, 3),我们可以训练两个模型:一个预测类别 <=1 vs >1,另一个预测类别 <=2 vs >2。

wine 数据集的目标变量为三个有序类别。然后,我们使用上述方法进行模拟。具体过程为:加载数据;处理数据为三个有序类别(本来就是,所以不用处理了);分割数据为训练集和测试集;训练有序逻辑回归模型;评估模型性能。

# 1. 加载数据
wine = datasets.load_wine()

# 2. 处理数据为三个有序类别 (这里数据本身就是三个类别,所以不需要额外处理)
# 3. 分割数据为训练集和测试集
X_train_wine, X_test_wine, y_train_wine, y_test_wine = train_test_split(wine.data, wine.target, test_size=0.2, random_state=823)

# 4. 训练有序逻辑回归模型
# 使用二分类逻辑回归为每一个阈值训练一个模型
models = []
thresholds = [01]  # 分类阈值
for thresh in thresholds:
    y_train_binary = (y_train_wine > thresh).astype(int)
    model = LogisticRegression(max_iter=10000)
    model.fit(X_train_wine, y_train_binary)
    models.append(model)

# 5. 评估模型性能
# 使用训练好的模型进行预测
def predict_ordered(models, X):
    probs = [model.predict_proba(X)[:, 1for model in models]
    predictions = []
    for prob_tuple in zip(*probs):
        if prob_tuple[0] <= 0.5:
            predictions.append(0)
        elif prob_tuple[1] <= 0.5:
            predictions.append(1)
        else:
            predictions.append(2)
    return predictions

y_pred_wine = predict_ordered(models, X_test_wine)
accuracy_wine = accuracy_score(y_test_wine, y_pred_wine)
classification_rep_wine = classification_report(y_test_wine, y_pred_wine)

accuracy_wine, classification_rep_wine

有序逻辑回归分析结果:

模型在测试集上的准确率为 在88% 以上,说明模型在这个数据集上表现得非常好,当然也有进一步提升的空间。

结语

逻辑回归,尽管简单,但其强大的分类能力和直观的解释性使其在实际应用中仍然受到欢迎。当我们面对的问题不再仅仅是简单的二分类,而是多分类或有序类别时,多分类逻辑回归和有序逻辑回归为我们提供了处理这些问题的工具。然而,选择合适的模型和优化方法仍然需要根据实际数据和业务需求进行。希望通过本文,读者对这些技术有了更深入的了解,并能够在自己的项目中妥善应用它们。

好啦,这就是本文的全部内容。如果你觉得这篇文章对你有帮助,欢迎收藏, 点赞, 分享, 谢谢了!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存