逻辑回归(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_)
相关推荐
rannn_1115 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer5 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
leisoo80975 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan20225 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
不会代码的小猴5 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站6 小时前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
AI备案指南-满满6 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤6 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝6 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林7 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展