详解机器学习经典模型(原理及应用)——逻辑回归
一、什么是逻辑回归
逻辑回归模型是经典的统计模型,主要用于处理二分类问题(预测一个事件发生与否的概率)。得益于其简单性和高度可解释性,逻辑回归在业务中常被用作baseline之一。即便是上亿量级的数据,也能够在很短的时间内完成逻辑回归模型的训练和部署,这使得在一部分重反馈速度、轻性能指标的业务场景中应用逻辑回归成为了常态,比如在一些低性能芯片中进行算法模型的边端部署时,常用逻辑回归(甚至是人工规则)作为边端模型。
二、逻辑回归模型原理
逻辑回归模型包括两个部分:一个是线性回归函数;另一个是应用在线性回归函数输出结果上的逻辑函数(Sigmoid函数),它将线性回归的输出映射到0和1之间,从而可以将线性输出表示为概率。
1、线性回归函数
首先,计算一个线性组合,即输入特征与权重的点积加上偏置项(截距)。
其中,k为特征权重,b为函数偏置,x为特征。至此,完成逻辑回归模型第一步的计算。
2、Sigmoid函数
给定输入特征x时,样本属于类别1的概率可以使用Sigmoid函数计算:
其中,z则为线性回归函数,由此输出一个介于0和1之间的概率值。这意味着逻辑回归可以提供关于分类决策的不确定性的信息。在二分类问题中,通常将概率值0.5作为阈值,当p大于0.5时,预测类别为1;否则,预测类别为0。因此,虽然逻辑回归模型包含“回归”二字,实际上它是一个分类模型。
三、模型损失函数
逻辑回归模型训练过程中的参数优化一般使用最大似然估计来实现。对应的损失函数是交叉熵损失(Cross-Entropy Loss),也称为对数损失(Log Loss)。
其中,N是样本数量,是第i个样本的实际类别标签,p(y=1∣) 是模型预测的概率。显然,当真实标签为0时,损失函数只有后半部分参与计算,为1时则只有前半部分参与计算。该损失函数会迫使逻辑函数的预测概率逼近真实标签。
1、损失函数最小值
当模型的预测概率p(y=1∣) 完全匹配真实标签时,交叉熵损失达到最小值0。对于二分类问题,如果真实标签是1,并且模型预测的概率p(y=1∣) 也是1,或者如果是0,并且模型预测的概率p(y=1∣) 也是0,那么交叉熵损失为0,因为log(1)=0。
2、损失函数最大值
当模型的预测概率p(y=1∣) 与真实标签完全相反时,交叉熵损失达到最大值正无穷大。对于二分类问题,如果p(y=1∣) 是1,但接近0,或者p(y=1∣) 是0,但接近1,损失函数的值会接近正无穷大。因为log(0)趋向于负无穷大,所以−log(0) 趋向于正无穷大。
四、模型训练优化器
逻辑回归函数常用梯度下降算法进行模型训练。梯度下降是一种优化算法,用于最小化损失函数,常用于机器学习和深度学习中的模型训练,其核心思想是找到函数的最小值。梯度是一个向量,指向损失函数增长最快的方向。通俗来说,想象你站在一个山顶上,想要尽快到达山脚。由于你看不见整个山的地形,你只能根据当前位置的斜率(也就是梯度)来决定下一步的方向。梯度下降算法就是模拟这个过程:首先,检查你周围的地面,发现某个方向的斜率最大(也就是最陡峭的方向),这个斜率告诉你下山的方向;然后,你朝着这个方向迈出一步,这一步的大小由两个因素决定:斜率的大小(梯度)和你对迈出步伐的信心(学习率);接着,你不断重复这个过程,每次都在当前位置测量斜率,并朝着斜率告诉你的下山方向迈出一步;最终,你希望这个过程能够带你到达山脚,也就是整个山的最低点(实际上有可能陷入局部最低点,此处不探讨)。
在数学上,梯度是损失函数对每个参数的偏导数组成的向量。在每次模型训练迭代中,我们根据梯度和学习率来更新参数:
这里,是损失函数在参数处的梯度,是学习率。更新的过程会不断重复,直到满足某个终止条件,比如梯度足够小、达到预设的迭代次数,或者损失函数的值不再显著下降。
五、模型应用
1、二分类
逻辑回归作为经典的机器学习模型,可以通过python第三方库scikit-learn进行调用,二分类任务示例代码如下:
# 导入必要的库
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 生成模拟的二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建逻辑回归模型实例
logreg = LogisticRegression()
# 训练模型
logreg.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = logreg.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 查看模型参数可以打印coef_和intercept_
print(f'Coefficients: {logreg.coef_}')
print(f'Intercept: {logreg.intercept_}')
2、多标签分类
多标签分类区别于多分类。多分类指的是标签类别大于两类的分类任务,但每个样本只能属于其中的一个类别。多标签分类指的是一个样本可以同时属于多个标签类别的分类任务,例如“香蕉”在食物类别上属于“水果”,在颜色上又是“黄色”,所以可以同时打上这两个标签。
逻辑回归也常用于多标签分类任务。对于多标签分类问题,即一个样本可以同时具有多个标签,可以通过一些策略进行扩展来处理这种类型的任务,常见的方法有:
(1)一对一(One-vs-One): 在这种方法中,对于每个标签,都训练一个二分类的逻辑回归模型来区分该标签和其他所有标签。例如,如果有3个标签A、B和C,我们会训练以下模型:A vs B,A vs C,B vs C。在预测时,每个模型都会输出一个概率值,样本会被赋予概率最高的标签。
(2)一对多(One-vs-Rest): 这种方法与一对一类似,但是对于每个标签,训练一个二分类模型来区分该标签和所有其他标签的组合。在预测时,样本会被赋予所有预测概率高于某个阈值的标签。
以下示例是常用的一对多建模代码:
# 导入必要的库
from sklearn.datasets import make_multilabel_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import accuracy_score
# 生成模拟的多标签分类数据集
# y的每一行都包含多个标签,例如[0, 1, 1]
X, y = make_multilabel_classification(n_samples=100, n_features=20, n_classes=3, n_labels=2, random_state=42)
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建逻辑回归模型实例
# multi_class='multinomial'参数处理多标签分类问题,会使用多项式分布来建模标签的联合概率。
logreg = LogisticRegression(multi_class='multinomial', solver='lbfgs')
# 使用一对多策略包装逻辑回归模型
ovr_classifier = OneVsRestClassifier(logreg)
# 训练模型
ovr_classifier.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = ovr_classifier.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 查看模型参数可以打印每个类别模型的coef_和intercept_
for i, classifier in enumerate(ovr_classifier.estimators_):
print(f'Classifier {i}:')
print(f'Coefficients: {classifier.coef_}')
print(f'Intercept: {classifier.intercept_}')
六、总结
虽然逻辑回归的结构非常简单,但它在业界的应用却无处不在。不论是需要快速处理大批量数据的业务场景,还是需要高可解释性的业务场景(例如给一些老板汇报),逻辑回归往往都是第一个被想到的baseline。与更为强大的模型相结合之后,逻辑回归还能进一步发挥作用,例如搜广推领域著名的GBDT-LR模型。尽管逻辑回归在许多应用中表现出色,但也存在一些不足之处:
(1)线性假设限制:逻辑回归模型假设特征与输出标签之间存在线性关系,这种假设可能不总是成立,导致模型无法捕捉复杂的非线性关系。
(2)特征交互能力有限:逻辑回归本身不擅长处理特征之间的交互作用。虽然可以通过手工创建交互项来解决这个问题,但这需要领域知识和大量的特征工程。
(3)不能捕捉复杂的数据结构:对于具有复杂数据结构的问题,如深度学习模型能够处理的层次结构或序列数据,逻辑回归模型就过于简单了。
(4)对异常值敏感:逻辑回归对异常值和噪声数据敏感。
(5)分类阈值制定:逻辑回归模型通常使用0.5作为分类阈值,但实际上最优阈值可能需要根据具体问题进行调整(可以让模型输出概率,人工进行后处理)。在需要高精度的场景,分类阈值(即概率)需要调整得更高,如阈值超过0.8才预测为正类(当然,这一定程度上会降低召回率)。