要求动手从0实现 logistic 回归(只借助Tensor和Numpy相关的库)在人工构造的数据集上进行训练和测试,并从loss、训练集以及测试集上的准确率等多个角度对结果进行分析(可借助nn.BCELoss或nn.BCEWithLogitsLoss作为损失函数,从零实现二元交叉熵为选作)
时间: 2024-04-15 18:28:55 浏览: 320
好的,你想要实现 logistic 回归算法,只使用 Tensor 和 Numpy 相关的库,并在人工构造的数据集上进行训练和测试,并对结果进行多个角度的分析。你可以选择使用 nn.BCELoss 或 nn.BCEWithLogitsLoss 作为损失函数,也可以选择从零实现二元交叉熵。下面是一个从零实现 logistic 回归算法的示例代码:
```python
import numpy as np
import torch
import torch.nn as nn
# 构造人工数据集
np.random.seed(0)
torch.manual_seed(0)
num_samples = 1000
num_features = 5
X = np.random.randn(num_samples, num_features)
true_weights = np.array([0.5, -0.3, 1.2, -0.4, 2.1])
bias = 1.0
y_prob = 1 / (1 + np.exp(-np.dot(X, true_weights) - bias))
y = np.random.binomial(1, y_prob)
# 转换为 Tensor
X_tensor = torch.from_numpy(X).float()
y_tensor = torch.from_numpy(y).float().view(-1, 1)
# 定义 logistic 回归模型
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))
model = LogisticRegression(num_features)
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
# 前向传播和计算损失
y_pred = model(X_tensor)
loss = criterion(y_pred, y_tensor)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印训练信息
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 在训练集和测试集上进行预测
with torch.no_grad():
y_pred_train = model(X_tensor)
y_pred_train = (y_pred_train > 0.5).float()
train_accuracy = (y_pred_train == y_tensor).float().mean()
# 构造测试数据集
X_test = np.random.randn(num_samples, num_features)
y_prob_test = 1 / (1 + np.exp(-np.dot(X_test, true_weights) - bias))
y_test = np.random.binomial(1, y_prob_test)
X_test_tensor = torch.from_numpy(X_test).float()
y_test_tensor = torch.from_numpy(y_test).float().view(-1, 1)
# 在测试集上进行预测
y_pred_test = model(X_test_tensor)
y_pred_test = (y_pred_test > 0.5).float()
test_accuracy = (y_pred_test == y_test_tensor).float().mean()
# 分析结果
print(f"Train Accuracy: {train_accuracy.item():.4f}")
print(f"Test Accuracy: {test_accuracy.item():.4f}")
```
这段代码会先构造一个人工数据集,然后定义一个 logistic 回归模型,并使用二元交叉熵作为损失函数进行训练。训练过程中会打印每个 epoch 的损失值。最后,使用训练好的模型在训练集和测试集上进行预测,并计算准确率。
阅读全文