2. 逻辑回归二分类

任务说明

本案例使用PyTorch实现逻辑回归模型,对鸢尾花数据集进行二分类。选用数据集中前两类(setosa和versicolor)的萼片长度与花瓣长度两个特征,训练模型区分两种鸢尾花,并评估分类准确率。

实现代码

import torch
import torch.nn as nn
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 1. 加载数据并筛选前两类
iris = load_iris()
X = iris.data[:100, [0, 2]]  # 取前100个样本(两类),使用萼片长度和花瓣长度
y = iris.target[:100]        # 标签为0和1

# 2. 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# 3. 特征标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 转换为PyTorch张量
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)

# 4. 定义逻辑回归模型
class LogisticRegression(nn.Module):
    def __init__(self, input_dim):
        super().__init__()
        self.linear = nn.Linear(input_dim, 1)

    def forward(self, x):
        return torch.sigmoid(self.linear(x))

model = LogisticRegression(input_dim=2)
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 5. 训练模型
epochs = 200
for epoch in range(epochs):
    model.train()
    outputs = model(X_train)
    loss = criterion(outputs, y_train)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 50 == 0:
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

# 6. 评估模型
model.eval()
with torch.no_grad():
    test_outputs = model(X_test)
    predicted = (test_outputs >= 0.5).float()
    accuracy = (predicted == y_test).float().mean().item()

print(f'测试集准确率: {accuracy:.4f}')

代码说明

代码首先从sklearn加载鸢尾花数据集,筛选出前100个样本(对应setosa和versicolor两类),选取萼片长度(特征0)和花瓣长度(特征2)作为输入特征。按7:3比例划分训练集与测试集,并使用StandardScaler对特征做标准化处理。

模型结构为单层线性变换后接Sigmoid激活函数,输出为样本属于正类(versicolor)的概率。损失函数采用二元交叉熵(BCELoss),优化器使用随机梯度下降(SGD),学习率设为0.1。训练共200轮,每50轮打印一次损失值。

评估阶段将测试集输出概率大于等于0.5的样本判为正类,计算预测标签与真实标签的匹配比例作为准确率。

运行与验证

运行环境需安装PyTorch、scikit-learn和numpy。直接执行上述脚本即可完成训练与评估。训练过程中损失值应逐步下降并趋于收敛;最终打印的测试集准确率在合理范围内(通常不低于0.9),说明模型成功区分两类鸢尾花。可通过调整学习率或训练轮数观察准确率变化,验证模型收敛行为。

逻辑回归二分类数据流 鸢尾花数据 100样本 × 2特征 标签:0 / 1 数据预处理 训练/测试划分 7:3 StandardScaler标准化 逻辑回归模型 Linear(2→1) + Sigmoid BCELoss + SGD 训练200轮 评估 准确率 反向传播更新权重 预测判定规则 输出概率 ≥ 0.5 → 类别1 (versicolor) 输出概率 < 0.5 → 类别0 (setosa) 输入特征 特征0:萼片长度 (cm) 特征2:花瓣长度 (cm) 验证观测点 训练损失逐步下降 → 测试准确率反映泛化能力 → 两类鸢尾花在所选特征空间线性可分