1. 引入必要的库
首先,需要引入必要的库。PyTorch用于构建和训练模型,pandas和numpy用于数据处理,scikit-learn用于计算性能指标。
import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score, recall_score, f1_score
2. 加载自定义数据集
假设有一个CSV文件custom_dataset.csv
,其中包含特征(自变量)和标签(因变量)。我们使用pandas来加载数据,并进行预处理。
# 加载自定义数据集
data = pd.read_csv('custom_dataset.csv')
# 假设数据集中有多列特征和一个二分类标签
X = data.iloc[:, :-1].values.astype(np.float32) # 特征
y = data.iloc[:, -1].values.astype(np.float32) # 标签
# 将标签转换为0和1
y = np.where(y == 'positive', 1, 0)
3. 构建逻辑回归模型
使用PyTorch来构建逻辑回归模型。
# 构建逻辑回归模型
class LogisticRegression(nn.Module):
def __init__(self, num_features):
super(LogisticRegression, self).__init__()
self.linear = nn.Linear(num_features, 1)
def forward(self, x):
return torch.sigmoid(self.linear(x))
# 初始化模型
num_features = X.shape[1]
model = LogisticRegression(num_features)
4. 定义损失函数和优化器
我们使用二元交叉熵损失函数和随机梯度下降(SGD)优化器。
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
5. 训练模型
使用自定义数据集训练模型。
# 将数据转换为PyTorch的张量
X_tensor = torch.tensor(X)
y_tensor = torch.tensor(y.reshape(-1, 1))
# 训练模型
num_epochs = 100
batch_size = 32
for epoch in range(num_epochs):
for i in range(0, len(X), batch_size):
X_batch = X_tensor[i:i+batch_size]
y_batch = y_tensor[i:i+batch_size]
# 前向传播
outputs = model(X_batch)
loss = criterion(outputs, y_batch)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')
6. 保存模型
训练完成后,我们可以使用PyTorch的state_dict
方法保存模型。
# 保存模型
torch.save(model.state_dict(), 'logistic_regression_model.pth')
7. 加载模型并进行预测
在需要时,我们可以使用PyTorch的load
方法加载模型,并进行预测。
# 加载模型
model = LogisticRegression(num_features)
model.load_state_dict(torch.load('logistic_regression_model.pth'))
model.eval()
# 进行预测
with torch.no_grad():
X_test = torch.tensor(X[:5])
predictions = model(X_test)
predicted_labels = (predictions > 0.5).float().numpy().flatten()
print("Predicted Labels:", predicted_labels)
8. 性能评估
计算预测结果的精确度、召回率和F1分数。
# 假设前5个样本为测试集,真实标签如下
y_true = y[:5]
# 计算性能指标
accuracy = accuracy_score(y_true, predicted_labels)
recall = recall_score(y_true, predicted_labels)
f1 = f1_score(y_true, predicted_labels)
print(f'Accuracy: {accuracy:.4f}')
print(f'Recall: {recall:.4f}')
print(f'F1 Score: {f1:.4f}')