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),说明模型成功区分两类鸢尾花。可通过调整学习率或训练轮数观察准确率变化,验证模型收敛行为。