大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」
今日 178/10000
1. 引言
急匆匆把 逻辑回归 给落下了,今天我们杀他个回马枪,再战三百回合
逻辑回归 Logistic 回归是一种用于分类问题的统计方法。它通过使用逻辑函数(如 Sigmoid 函数)将输入变量的线性组合映射到一个概率值,从而实现分类任务。
Logistic 回归广泛应用于许多领域,主要用于二分类问题,例如:
- 信用评分:预测借款人是否会违约。
- 医学诊断:判断某个患者是否患有某种疾病。
- 市场营销:预测客户是否会购买某产品。
- 社会学研究:分析某种行为是否会发生。
通过这篇文章,你将深入了解 Logistic 回归的原理、模型构建方法以及如何使用 Python 实现 Logistic 回归模型。
2. 数学基础
2.1 线性回归实现分类
在理解 Logistic 回归之前,我们先回顾一下线性回归。线性回归用于预测连续值,其数学形式为:
简化演示:比如这样的一个简单的 2 类别样本分布,我们可以最终得到线性方程可视化后的结果可能如下:
下一步,我们可以把这个线性回归延申到分类任务中,怎么做呢?
- 我们可以设定一个阈值,大于和小于这个阈值的分别属于两类(等于阈值呢,爱咋咋地,影响不大)
- 我们可以从下图看到,这个分类结果很完美,完全把两个类别区分开了
2.2 线性回归分类的缺点
线性回归虽简单有效,但在分类问题中存在局限。线性回归的输出是连续值,而分类问题需要离散的类标签。此外,线性回归不能保证输出值在 0 和 1 之间,这对于概率预测是不合理的。
接着 2.1 的内容,通过对比直观的理解一下线性回归分类的缺点
2.1 描述的回归转分类的方式,在下面场合就不灵了,比如收集数据的小哥哥小姐姐开了个小差,数据中混入一个异常点
- 这时候分类结果就很不理想了,如下图,如果我们还是使用 0.5 为阈值,那中间几个样本都被分类错了
- 除非我们更换阈值,问题是设置多少为阈值呢?想想看,这样是不是表现很不稳定
2.3 Logistic 函数(Sigmoid 函数)
为了解决上述问题,来了
逻辑回归(Logistic Regression,简称 LR)是一种广义线性模型(GLM),通常用于分类问题。与传统的线性回归模型(预测连续值输出)不同,逻辑回归预测的是一个概率值,表示为介于 0 和 1 之间的数。这使得它非常适合于二分类问题
Logistic 回归使用了 Sigmoid 函数,其数学形式为:
Sigmoid 函数将任意实数映射到 (0, 1) 之间,非常适合用于表示概率。
再次,直观的感受下,逻辑回归这个神奇的过程
2.4 理解分类目标
预测和实际的对比
在使用逻辑回归进行分类时,核心目标是确保模型的预测概率尽可能接近实际的标签。例如,如果一个样本的实际标签是 1(正类),逻辑回归模型预测这个样本属于正类的概率应该接近 1。相反,如果样本的标签是 0(负类),则模型的预测概率应接近 0。这种方式帮助我们评价和优化模型的性能,确保模型能够正确区分不同类别的样本。
2.5 最大似然估计
最大似然估计(MLE)是一种在统计模型中估计参数的方法,它寻找能够使观测到的数据出现概率最大的参数值。在逻辑回归中,MLE尝试找到一组参数,使得给定参数下,观测到的样本标签的概率最大化。这通常通过优化一个称为似然函数的表达式来实现,该函数是对所有数据点的预测概率的乘积。
2.6 交叉熵损失
交叉熵损失函数解释
交叉熵损失函数是评估逻辑回归模型性能的一个关键工具。它衡量的是模型预测的概率分布与实际标签的概率分布之间的差异。公式可以表示为:
其中 ( y ) 是实际标签,( p ) 是预测为正类的概率。这个损失函数的值越小,表示模型的预测结果与实际情况越接近。
损失函数与预测准确度的关系
一般来说,交叉熵损失函数的值越小,模型的分类准确度越高。通过训练过程中损失函数的下降趋势,我们可以观察到模型性能的改善。实际操作中,可以通过绘制训练周期与损失值的图表来直观展示这一过程,帮助理解模型优化的效果。
3. 模型构建
3.1 数据准备与预处理
在构建 Logistic 回归模型之前,数据的准备和预处理是关键步骤。包括:
- 数据清洗:处理缺失值和异常值。
- 特征选择:选择与目标变量相关的特征。
- 数据标准化:将特征缩放到相同的范围内,以提高模型的收敛速度。
示例代码:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 生成一个武侠主题的数据集
data = {
'内力': [80, 60, 70, 90, 85, 75],
'轻功': [85, 75, 65, 95, 80, 70],
'武器': [1, 0, 1, 0, 1, 0], # 1 表示有武器,0 表示无武器
'是否胜利': [1, 0, 1, 1, 1, 0] # 1 表示胜利,0 表示失败
}
df = pd.DataFrame(data)
# 特征和标签
X = df[['内力', '轻功', '武器']]
y = df['是否胜利']
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
3.2 模型假设与参数估计
Logistic 回归假设特征与目标变量之间存在线性关系,通过 Sigmoid 函数进行非线性变换。参数估计通过最大化对数似然函数来实现。
3.3 梯度下降法模型优化
算法原理
梯度下降法是一种用于优化逻辑回归模型参数的流行算法,其核心思想是利用函数的梯度(或斜率)来确定参数更新的方向。梯度指示了函数增长最快的方向,因此在优化过程中,我们沿着梯度的相反方向(下降最快的方向)调整参数,以寻找函数的最小值。
梯度下降可以通过一个简单的比喻来理解:想象你在山上,需要找到下山的最快路径。在任何位置,你都可以查看周围最陡峭的下坡路,然后朝那个方向迈出一步。梯度下降法就是这样在参数空间中寻找损失函数最小值的方法。
算法步骤
梯度下降的每一步都需要计算损失函数关于每个参数的梯度,然后用以下公式更新参数:
其中:
- ( θ ) 表示模型参数。
- ( α ) 是学习率,控制步长的大小。
是损失函数 ( J ) 关于参数 (θ) 的梯度
更新的步骤重复进行,直到满足停止条件,例如梯度的大小小于某个阈值,或达到预定的迭代次数。
在实际操作中,选择合适的学习率是非常关键的,因为太小的学习率会导致收敛过慢,而太大的学习率则可能导致跳过最小值点,使得算法无法正确收敛。
4. 模型评估
4.1 混淆矩阵
混淆矩阵是一种用于评估分类模型性能的工具,它展示了预测结果与实际标签的对比情况。混淆矩阵包括以下四个指标:
- TP(True Positive):真实为正类,预测为正类。
- TN(True Negative):真实为负类,预测为负类。
- FP(False Positive):真实为负类,预测为正类。
- FN(False Negative):真实为正类,预测为负类。
示例代码:
from sklearn.metrics import confusion_matrix
# 预测
y_pred = model.predict(X_test)
# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print(f'混淆矩阵:\n{cm}')
4.2 精度、召回率与 F1 值
精度(Precision)、召回率(Recall)和 F1 值是评价分类模型的重要指标:
示例代码:
from sklearn.metrics import precision_score, recall_score, f1_score
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print(f'精度: {precision}')
print(f'召回率: {recall}')
print(f'F1 值: {f1}')
4.3 ROC 曲线与 AUC 值
ROC 曲线(Receiver Operating Characteristic Curve)展示了模型在不同阈值下的性能表现。AUC 值(Area Under Curve)是 ROC 曲线下的面积,用于衡量模型的区分能力。
示例代码:
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
# 预测概率
y_prob = model.predict_proba(X_test)[:, 1]
# 计算 ROC 曲线
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
# 绘制 ROC 曲线
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC 曲线 (面积 = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('假正率 (False Positive Rate)')
plt.ylabel('真正率 (True Positive Rate)')
plt.title('接收者操作特征曲线 (ROC)')
plt.legend(loc='lower right')
plt.show()
通过这些指标和可视化方法,我们可以全面评估 Logistic 回归模型的性能。在下一部分中,我们将通过一个实际示例来展示如何使用 Python 构建和评估 Logistic 回归模型。`
5. 实战示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, accuracy_score, recall_score, f1_score, roc_curve, auc
from sklearn.model_selection import train_test_split
# 生成模拟数据
X, y = make_classification(n_samples=300, n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, flip_y=0.01, random_state=42)
# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用逻辑回归进行分类
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
# 计算混淆矩阵、精度、召回率和 F1 值
cm = confusion_matrix(y_test, y_pred)
accuracy = accuracy_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
# 打印混淆矩阵和其他指标
print("混淆矩阵:\n", cm)
print("精度:", accuracy)
print("召回率:", recall)
print("F1 值:", f1)
# 可视化数据和决策边界
plt.figure(figsize=(10, 6))
plt.scatter(X_test[y_test == 0][:, 0], X_test[y_test == 0][:, 1], color='red', label='类别 0', edgecolor='k')
plt.scatter(X_test[y_test == 1][:, 0], X_test[y_test == 1][:, 1], color='blue', label='类别 1', edgecolor='k')
# 绘制决策边界和填充区域
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
np.arange(y_min, y_max, 0.01))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.2, cmap=plt.cm.Paired)
plt.contour(xx, yy, Z, levels=[0.5], linestyles='dashed', colors='black')
plt.title('武侠世界中的高手分类图')
plt.xlabel('功力')
plt.ylabel('内功心法')
plt.legend()
plt.show()
# 计算并可视化 ROC 曲线
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC 曲线 (面积 = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('受试者工作特征 (ROC) 曲线')
plt.legend(loc="lower right")
plt.show()
运行后输出:
混淆矩阵:
[[44 2]
[ 2 42]]
精度: 0.9555555555555556
召回率: 0.9545454545454546
F1 值: 0.9545454545454546
这张图展示了模型在不同阈值下的性能:
- X 轴表示假阳性率(False Positive Rate, FPR),即被错误预测为正类的负类样本的比例。
- Y 轴表示真阳性率(True Positive Rate, TPR),即被正确预测为正类的正类样本的比例。
- 曲线表示模型在不同阈值下的表现。
- 对角线(从 (0, 0) 到 (1, 1) 的虚线)表示随机猜测的表现。
曲线越接近左上角,模型的性能越好。在这次运行中,曲线下的面积(AUC)为 0.98,表示模型在区分正负类样本时具有很高的性能。很强大
这张图展示了测试数据点及其分类结果:
- 红色点代表类别 0(例如低等级武侠高手)。
- 蓝色点代表类别 1(例如高等级武侠高手)。
- 黑色虚线表示模型的决策边界,划分了类别 0 和类别 1 的区域。
- 背景颜色:决策边界两侧的背景颜色不同,用于区分类别。左侧区域(通常是类别 0)为浅红色,右侧区域(通常是类别 1)为浅蓝色。
这张图展示了模型如何基于两个特征(功力和内功心法)对数据点进行分类。大部分数据点都被正确分类,但也有少量数据点被误分类,这些误分类的数据点位于决策边界附近。 再次,强大
6. 进阶话题
6.1 正则化与过拟合
在 Logistic 回归中,正则化是一种防止过拟合的技术。过拟合是指模型在训练集上表现良好,但在测试集上表现不佳。正则化通过在损失函数中加入惩罚项来减少模型的复杂度,从而提高模型的泛化能力。
- L1 正则化(Lasso):通过增加参数绝对值之和的惩罚项,使部分参数变为零,达到特征选择的效果。
- L2 正则化(Ridge):通过增加参数平方和的惩罚项,使得所有参数趋近于零,但不会完全为零。
示例代码:
# 使用 L1 正则化
model_l1 = LogisticRegression(penalty='l1', solver='liblinear')
model_l1.fit(X_train, y_train)
# 使用 L2 正则化
model_l2 = LogisticRegression(penalty='l2')
model_l2.fit(X_train, y_train)
print(f'L1 正则化模型系数: {model_l1.coef_}')
print(f'L2 正则化模型系数: {model_l2.coef_}')
6.2 多分类问题中的 Logistic 回归
Logistic 回归不仅可以用于二分类问题,也可以扩展到多分类问题。在多分类问题中,常用的方法有:
- 一对多(One-vs-Rest, OvR):为每个类别训练一个二分类器,每个分类器区分该类别与其他类别。
- 一对一(One-vs-One, OvO):为每对类别训练一个二分类器,总共训练 𝐾(𝐾−1)2𝐾(𝐾−1)2 个分类器,其中 𝐾𝐾 是类别数量。
示例代码:
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 生成多分类数据集
X, y = make_classification(n_samples=100, n_features=4, n_classes=3, n_clusters_per_class=1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练多分类 Logistic 回归模型(OvR)
model_ovr = LogisticRegression(multi_class='ovr')
model_ovr.fit(X_train, y_train)
# 训练多分类 Logistic 回归模型(softmax)
model_softmax = LogisticRegression(multi_class='multinomial', solver='lbfgs')
model_softmax.fit(X_train, y_train)
print(f'OvR 模型系数: {model_ovr.coef_}')
print(f'Softmax 模型系数: {model_softmax.coef_}')
6.3 与其他分类算法的对比
Logistic 回归虽然简单,但在某些情况下可能不如其他复杂的分类算法,如支持向量机(SVM)、随机森林和神经网络。对比这些算法的优缺点:
- 支持向量机(SVM):在高维空间中寻找最优分类超平面,适用于复杂的数据集,但计算复杂度高。
- 随机森林:集成多棵决策树,提高模型的准确性和稳定性,但解释性差。
- 神经网络:强大的非线性建模能力,适用于大规模数据,但训练时间长且需要大量计算资源。
示例代码:
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
# 训练 SVM 模型
svm_model = SVC()
svm_model.fit(X_train, y_train)
svm_pred = svm_model.predict(X_test)
svm_accuracy = accuracy_score(y_test, svm_pred)
# 训练随机森林模型
rf_model = RandomForestClassifier()
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)
rf_accuracy = accuracy_score(y_test, rf_pred)
# 训练神经网络模型
nn_model = MLPClassifier(max_iter=1000)
nn_model.fit(X_train, y_train)
nn_pred = nn_model.predict(X_test)
nn_accuracy = accuracy_score(y_test, nn_pred)
print(f'SVM 准确率: {svm_accuracy}')
print(f'随机森林准确率: {rf_accuracy}')
print(f'神经网络准确率: {nn_accuracy}')
通过这些进阶话题的介绍,大侠们可以更全面地理解 Logistic 回归及其在不同场景下的应用与对比。
[ 抱个拳,总个结 ]
在这篇文章中,我们深入探讨了 Logistic 回归这一强大的分类算法。以下是对各个部分内容的简要回顾:
1. 引言
我们介绍了 Logistic 回归的定义和应用场景。Logistic 回归通过 Sigmoid 函数将线性组合映射到概率值,从而实现二分类任务,广泛应用于信用评分、医学诊断、市场营销等领域。
2. 数学基础
我们回顾了线性回归的基本概念,讨论了线性回归在分类问题中的局限,并引入了 Sigmoid 函数和对数似然函数,为 Logistic 回归的数学基础打下了坚实的基础。
3. 模型构建
我们详细介绍了数据准备与预处理的步骤,包括数据清洗、特征选择和数据标准化。然后,我们通过使用梯度下降法训练 Logistic 回归模型,并展示了模型的参数估计方法。
4. 模型评估
我们通过混淆矩阵、精度、召回率、F1 值和 ROC 曲线等指标,全面评估了 Logistic 回归模型的性能。这些指标和可视化方法帮助我们更好地理解模型的分类效果。
5. 实战示例
在实战示例中,我们使用一个结合武侠元素的数据集,演示了如何使用 Python 构建、训练和评估 Logistic 回归模型。通过具体代码示例,帮助大侠们更直观地理解模型的应用。
6. 进阶话题
我们探讨了正则化与过拟合、多分类问题中的 Logistic 回归以及与其他分类算法的对比。这些进阶话题扩展了大侠们对 Logistic 回归的理解,并提供了在实际应用中的更多选择。
[ 算法金,碎碎念 ]
全网同名,日更万日,让更多人享受智能乐趣
烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;
同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖