逻辑回归(Logistic Regression)的详细介绍及Python代码示例

一、逻辑回归算法简介

1. 基本概念
  • 目标:解决二分类问题(可扩展至多分类),通过概率预测样本属于某类的可能性。

  • 核心思想 :将线性回归的输出通过Sigmoid函数映射到[0,1]区间,表示概率。

  • 数学模型

    • P(y=1∣x):样本属于类别1的概率

    • w0,w1,...,wn​:模型参数

    • 决策边界:当概率 ≥ 0.5时预测为类别1,否则为类别0。

2. 损失函数(交叉熵损失)
  • p^(i):预测概率 P(y=1∣x(i))

  • 损失函数衡量预测概率与真实标签的差异。

3. 参数求解
  • 梯度下降:通过迭代优化参数最小化损失函数:

  • 偏导数推导:


二、Python代码示例

1. 使用NumPy手动实现逻辑回归
复制代码
import numpy as np
import matplotlib.pyplot as plt

# 生成二分类数据
np.random.seed(42)
X = np.random.randn(100, 2)  # 特征:100个样本,2个特征
y = (X[:, 0] + 2*X[:, 1] > 0).astype(int)  # 标签:基于线性关系的二分类

# 添加偏置项
X_b = np.c_[np.ones((100, 1)), X]

# 定义Sigmoid函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 梯度下降优化
def logistic_regression(X, y, learning_rate=0.1, n_iters=1000):
    m, n = X.shape
    w = np.random.randn(n, 1)
    
    for _ in range(n_iters):
        z = X.dot(w)
        p = sigmoid(z)
        gradient = X.T.dot(p - y.reshape(-1, 1)) / m
        w -= learning_rate * gradient
    return w

# 训练模型
w = logistic_regression(X_b, y, learning_rate=0.1, n_iters=1000)
print("权重:", w.ravel())  # 示例输出:[0.5, 1.2, 2.1]

# 预测函数
def predict(X, w, threshold=0.5):
    return (sigmoid(X.dot(w)) >= threshold).astype(int)

# 可视化决策边界
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max, 100),
                       np.linspace(x2_min, x2_max, 100))
X_grid = np.c_[xx1.ravel(), xx2.ravel()]
X_grid_b = np.c_[np.ones((X_grid.shape[0], 1)), X_grid]
probs = sigmoid(X_grid_b.dot(w)).reshape(xx1.shape)

plt.contourf(xx1, xx2, probs, levels=[0, 0.5, 1], cmap=plt.cm.RdYlBu, alpha=0.6)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.RdYlBu)
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.title("逻辑回归决策边界")
plt.show()
2. 使用Scikit-learn实现
复制代码
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

# 创建模型(默认使用L2正则化)
model = LogisticRegression(penalty='none')  # 禁用正则化
model.fit(X, y)

# 输出参数
print("截距(w0):", model.intercept_)  # 示例:[0.5]
print("权重(w1, w2):", model.coef_)     # 示例:[1.2, 2.1]

# 预测
y_pred = model.predict(X)

# 评估
print("准确率:", accuracy_score(y, y_pred))  # 示例:0.95
print("混淆矩阵:\n", confusion_matrix(y, y_pred))

三、关键知识点

1. 应用场景
  • 垃圾邮件检测(是/否垃圾)

  • 疾病诊断(患病/健康)

  • 客户流失预测(流失/留存)

2. 注意事项
  • 特征缩放:逻辑回归虽无需严格缩放,但梯度下降时标准化可加速收敛。

  • 正则化:防止过拟合(L1正则化可稀疏化特征,L2正则化更稳定)。

  • 多分类扩展

    • OvR(One-vs-Rest):训练多个二分类器。

    • Softmax回归 :直接处理多分类(见LogisticRegression(multi_class='multinomial'))。

3. 模型评估指标
  • 准确率(Accuracy):适用于类别平衡数据。

  • 精确率(Precision)与召回率(Recall):关注假阳性或假阴性。

  • ROC-AUC曲线:评估模型在不同阈值下的表现。


四、扩展:正则化逻辑回归

复制代码
from sklearn.linear_model import LogisticRegressionCV

# 使用L1正则化(稀疏权重)
model_l1 = LogisticRegressionCV(penalty='l1', solver='liblinear', cv=5)
model_l1.fit(X, y)
print("L1正则化权重:", model_l1.coef_)

# 使用L2正则化(默认)
model_l2 = LogisticRegressionCV(penalty='l2', cv=5)
model_l2.fit(X, y)
print("L2正则化权重:", model_l2.coef_)
相关推荐
wj3055853789 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
吃好睡好便好9 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李9 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅9 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
qingfeng154159 小时前
企业微信机器人开发:如何实现自动化与智能运营?
人工智能·python·机器人·自动化·企业微信
x_yeyue12 小时前
三角形数
笔记·算法·数论·组合数学
彦为君13 小时前
Agent 安全:从权限提示到沙箱隔离
python·ai·ai编程
念何架构之路13 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星13 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi