PyTorch实现Logistic Regression二分类问题详解

📅 2026/8/9 13:47:21
PyTorch实现Logistic Regression二分类问题详解
1. 项目概述今天我们来聊聊PyTorch框架下的Logistic Regression二分类问题实现。作为深度学习入门系列的第5篇这个内容特别适合刚接触机器学习的开发者。Logistic Regression虽然名字里带回归但实际上是解决分类问题的经典算法在金融风控、医疗诊断、垃圾邮件过滤等领域都有广泛应用。我刚开始学深度学习时就是从Logistic Regression入手的。相比复杂的神经网络它结构简单但包含了深度学习的核心思想——前向传播、损失计算和反向传播。用PyTorch实现它能帮助我们理解框架的基本工作流程为后续学习更复杂的模型打下坚实基础。2. 核心原理解析2.1 Logistic Regression数学基础Logistic Regression的核心是sigmoid函数σ(z) 1/(1e^{-z})。这个函数的神奇之处在于它能把任意实数映射到(0,1)区间正好可以解释为概率值。当z0时σ(z)0.5这就是我们的决策边界。在实际应用中z通常是我们熟悉的线性函数z w^T x b。这里的w是权重向量b是偏置项x是输入特征。通过训练调整w和b模型就能学会区分不同类别的样本。2.2 二分类问题特点二分类问题的输出只有两种可能通常表示为0和1这正好与sigmoid函数的输出范围匹配。在实际项目中我们经常会遇到这样的场景邮件分类垃圾邮件/正常邮件金融欺诈检测欺诈/正常交易医疗诊断患病/健康PyTorch实现时我们需要特别注意损失函数的选择。对于二分类问题Binary Cross Entropy (BCE)是最常用的损失函数它衡量了预测概率与真实标签之间的差异。3. PyTorch实现详解3.1 环境准备与数据加载首先确保已安装正确版本的PyTorch。建议使用Anaconda创建虚拟环境conda create -n pytorch_env python3.8 conda activate pytorch_env conda install pytorch torchvision torchaudio -c pytorch对于二分类问题我们可以使用PyTorch内置的数据集也可以自定义数据。这里以乳腺癌数据集为例from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 加载数据 data load_breast_cancer() X, y data.data, data.target # 数据标准化 scaler StandardScaler() X scaler.fit_transform(X) # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 转换为PyTorch张量 import torch X_train torch.FloatTensor(X_train) X_test torch.FloatTensor(X_test) y_train torch.FloatTensor(y_train).reshape(-1,1) y_test torch.FloatTensor(y_test).reshape(-1,1)3.2 模型定义在PyTorch中定义Logistic Regression模型非常简单import torch.nn as nn class LogisticRegression(nn.Module): def __init__(self, input_dim): super(LogisticRegression, self).__init__() self.linear nn.Linear(input_dim, 1) def forward(self, x): return torch.sigmoid(self.linear(x))这个模型的核心就是一个全连接层(nn.Linear)加上sigmoid激活函数。注意输出维度是1而不是2因为二分类问题我们只需要预测一个类别的概率另一个类别的概率就是1减去这个值。3.3 训练过程训练流程是深度学习的标准范式# 初始化模型 model LogisticRegression(X_train.shape[1]) criterion nn.BCELoss() # 二分类交叉熵损失 optimizer torch.optim.SGD(model.parameters(), lr0.01) # 训练循环 epochs 100 for epoch in range(epochs): # 前向传播 outputs model(X_train) loss criterion(outputs, y_train) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 每10个epoch打印一次损失 if (epoch1) % 10 0: print(fEpoch [{epoch1}/{epochs}], Loss: {loss.item():.4f})这里有几个关键点需要注意学习率(lr)的选择很重要太大可能导致震荡太小收敛慢每次迭代前要用zero_grad()清空梯度否则梯度会累积BCE损失要求预测值和真实值都在[0,1]范围内3.4 模型评估训练完成后我们需要评估模型性能with torch.no_grad(): # 禁用梯度计算 y_pred model(X_test) y_pred_class y_pred.round() # 概率转类别 accuracy (y_pred_class y_test).float().mean() print(fTest Accuracy: {accuracy.item()*100:.2f}%)对于二分类问题除了准确率我们还应该关注混淆矩阵(True Positive, False Positive等)精确率(Precision)和召回率(Recall)ROC曲线和AUC值4. 实战技巧与常见问题4.1 数据不平衡处理实际项目中经常遇到类别不平衡问题。比如在欺诈检测中正常交易远多于欺诈交易。这时可以使用加权交叉熵损失pos_weight torch.tensor([10.0]) # 少数类权重 criterion nn.BCEWithLogitsLoss(pos_weightpos_weight)对少数类过采样或多数类欠采样使用F1-score等更适合不平衡数据的评估指标4.2 特征工程技巧虽然深度学习可以自动学习特征但好的特征工程仍能提升模型性能数值特征标准化/归一化类别特征进行one-hot编码检查并处理缺失值必要时进行特征选择去除冗余特征4.3 超参数调优几个关键超参数及其调优建议学习率可以从0.01开始尝试观察损失曲线批量大小小批量(32-256)通常效果较好优化器SGD简单但需要调参Adam自适应学习率更方便正则化添加L2正则化防止过拟合4.4 GPU加速如果数据量较大可以使用GPU加速device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) X_train, y_train X_train.to(device), y_train.to(device)记得在评估时也要把测试数据移到相同设备上。5. 项目扩展与进阶掌握了基础实现后可以考虑以下扩展方向5.1 多分类问题虽然本文聚焦二分类但Logistic Regression也可以扩展到多分类使用softmax代替sigmoid输出维度等于类别数使用CrossEntropyLoss代替BCELoss5.2 与其他模型结合Logistic Regression可以作为更复杂模型的组成部分神经网络的最后一层集成学习中的基分类器与其他特征转换方法结合5.3 部署应用训练好的模型可以部署到生产环境使用TorchScript保存模型转换为ONNX格式跨平台使用开发简单的Web接口提供服务在实际项目中我经常发现初学者容易忽视数据预处理的重要性。记得有一次我花了大量时间调参但模型效果不佳最后发现是因为没有对数据进行标准化。这个教训让我明白好的数据质量比复杂的模型更重要。