数学建模学习-逻辑回归(Logistic Regression)教程(22)
写在最前
注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码,很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体使用时,同学们要根据实际情况选择是否在论文中添加可视化图片。
系列教程计划持续更新,同学们可以免费订阅专栏,内容充足后专栏可能付费,提前订阅的同学可以免费阅读,同时相关代码获取可以关注博主评论或私信。
目录
算法简介
逻辑回归(Logistic Regression)是一种常用的统计学习方法,主要用于解决分类问题。尽管其名字中带有"回归",但它实际上是一种分类方法。逻辑回归通过建立一个逻辑函数(sigmoid函数)将线性回归模型的输出映射到[0,1]区间,从而实现二分类。
算法特点
- 简单直观:模型结构简单,易于理解和实现
- 可解释性强:模型参数具有明确的统计学解释
- 计算效率高:训练速度快,适合大规模数据
- 输出概率:不仅给出分类结果,还能输出概率值
- 适用广泛:在医疗诊断、金融风控等领域应用广泛
- 易于正则化:可以方便地添加正则化项防止过拟合
数学原理
逻辑回归的核心是sigmoid函数:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
其中z是线性函数:
z = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n = w T x + b z = w_0 + w_1x_1 + w_2x_2 + ... + w_nx_n = w^Tx + b z=w0+w1x1+w2x2+...+wnxn=wTx+b
逻辑回归的损失函数(对数似然损失):
J ( w ) = − 1 m ∑ i = 1 m [ y ( i ) log ( h w ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h w ( x ( i ) ) ) ] J(w) = -\frac{1}{m}\sum_{i=1}^m[y^{(i)}\log(h_w(x^{(i)})) + (1-y^{(i)})\log(1-h_w(x^{(i)}))] J(w)=−m1i=1∑m[y(i)log(hw(x(i)))+(1−y(i))log(1−hw(x(i)))]
其中:
- m是样本数量
- y^(i)是第i个样本的真实标签
- h_w(x^(i))是模型对第i个样本的预测概率
代码实现
环境准备
首先需要安装必要的Python库:
# requirements.txt
numpy>=1.21.0
matplotlib>=3.4.3
scikit-learn>=0.24.2
数据准备
我们使用sklearn的make_classification函数生成示例数据:
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成示例数据
X, y = make_classification(n_samples=100, n_features=2, n_redundant=0,
n_informative=2, random_state=1,
n_clusters_per_class=1)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
模型训练
使用sklearn的LogisticRegression类实现模型训练:
from sklearn.linear_model import LogisticRegression
# 创建并训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 在测试集上评估
accuracy = model.score(X_test, y_test)
print(f"模型准确率: {accuracy:.4f}")
可视化分析
- 决策边界可视化:
# 创建网格点以绘制决策边界
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.1),
np.arange(y_min, y_max, 0.1))
# 预测网格点的类别
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制决策边界和数据点
plt.figure(figsize=(10, 8))
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
- ROC曲线分析:
from sklearn.metrics import roc_curve, auc
# 计算ROC曲线
y_pred_proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label=f'ROC曲线 (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--')
- 模型收敛过程:
# 计算不同迭代次数下的损失函数值
max_iter_range = range(1, 101, 10)
loss_values = []
for n_iter in max_iter_range:
model_temp = LogisticRegression(max_iter=n_iter)
model_temp.fit(X_train, y_train)
loss = -model_temp.score(X_train, y_train)
loss_values.append(loss)
实例分析
在本例中,我们生成了一个二分类数据集,包含100个样本,每个样本有2个特征。通过可视化决策边界,我们可以清晰地看到模型是如何将两个类别分开的。模型在测试集上达到了100%的准确率,这表明对于这个简单的数据集,逻辑回归模型表现出色。
从ROC曲线可以看出,模型的AUC值接近1,说明模型具有很好的分类性能。收敛过程图显示了模型在训练过程中损失函数的变化,我们可以看到损失函数随着迭代次数的增加而逐渐减小,最终趋于稳定。
结果分析
-
模型参数:
- 截距(bias):-0.2712
- 特征系数:[-3.03383954, 0.09429485]
- 这些参数反映了每个特征对分类结果的影响程度
-
模型性能:
- 准确率:100%
- AUC值:1.00
- 这表明模型在这个简单的二分类问题上表现完美
-
决策边界:
- 从决策边界图可以看出,模型成功地找到了一个清晰的分界线
- 两个类别的样本被很好地分开
-
收敛性能:
- 模型在较少的迭代次数内就达到了收敛
- 损失函数呈现平滑的下降趋势
总结
逻辑回归是一个简单但强大的分类算法,特别适合二分类问题。它的主要优势在于:
- 模型简单,训练速度快
- 可解释性强,每个特征的重要性可以通过系数大小直观理解
- 不容易过拟合,泛化能力较好
- 可以输出概率值,便于进行风险控制
在实际应用中,逻辑回归常用于:
- 医疗诊断(疾病预测)
- 金融风控(信用评估)
- 市场营销(用户购买预测)
- 垃圾邮件分类等场景
需要注意的是,逻辑回归也有其局限性:
- 只能处理线性可分的问题
- 对特征之间的关系建模能力有限
- 对异常值比较敏感
在实际应用中,我们可以通过特征工程、正则化等方法来改善模型性能。同时,也可以考虑使用核方法将逻辑回归扩展到非线性问题。
同学们如果有疑问可以私信答疑,如果有讲的不好的地方或可以改善的地方可以一起交流,谢谢大家。