要求动手从0实现 logistic 回归(只借助Tensor和Numpy相关的库)在人工构造的数据集上进 行训练和测试,并从loss、训练集以及测试集上的准确率等多个角度对结果进行分析 (可借助nn.BCELoss或nn.BCEWithLogitsLoss作为损失函数,从零实现二元交叉熵为选作)
时间: 2024-04-15 13:25:19 浏览: 167
好的,我将为您提供一个从零开始实现 logistic 回归的示例代码,并使用人工构造的数据集进行训练和测试。
首先,我们需要导入必要的库:
```python
import numpy as np
import torch
import torch.nn as nn
from sklearn.model_selection import train_test_split
```
然后,我们定义 logistic 回归模型的类:
```python
class LogisticRegression:
def __init__(self, input_dim):
self.weights = torch.zeros((input_dim, 1), dtype=torch.float32)
self.bias = torch.zeros(1, dtype=torch.float32)
def forward(self, X):
linear = torch.matmul(X, self.weights) + self.bias
return torch.sigmoid(linear)
def backward(self, X, y, y_pred, lr):
m = X.shape[0]
grad_weights = torch.matmul(X.t(), (y_pred - y)) / m
grad_bias = torch.sum(y_pred - y) / m
self.weights -= lr * grad_weights
self.bias -= lr * grad_bias
def train(self, X, y, lr, num_epochs):
for epoch in range(num_epochs):
y_pred = self.forward(X)
self.backward(X, y, y_pred, lr)
def predict(self, X):
y_pred = self.forward(X)
return (y_pred >= 0.5).float()
```
接下来,我们创建一个人工构造的数据集,并进行训练和测试:
```python
# 生成数据集
np.random.seed(42)
X = np.random.randn(1000, 2)
y = np.random.randint(0, 2, (1000, 1))
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 转换为PyTorch的Tensor
X_train = torch.from_numpy(X_train).float()
y_train = torch.from_numpy(y_train).float()
X_test = torch.from_numpy(X_test).float()
y_test = torch.from_numpy(y_test).float()
# 创建模型实例并训练
model = LogisticRegression(input_dim=2)
model.train(X_train, y_train, lr=0.01, num_epochs=100)
# 在训练集和测试集上进行预测
train_preds = model.predict(X_train)
test_preds = model.predict(X_test)
# 计算准确率
train_acc = (train_preds == y_train).sum().item() / len(y_train)
test_acc = (test_preds == y_test).sum().item() / len(y_test)
print("训练集准确率:", train_acc)
print("测试集准确率:", test_acc)
```
在上述代码中,我们首先生成了一个包含1000个样本和2个特征的人工数据集。然后,使用`train_test_split`函数将数据集划分为训练集和测试集。接下来,我们将数据转换为PyTorch的Tensor,并创建一个 logistic 回归模型的实例。通过调用模型的`train`方法,可以在训练集上进行模型训练。最后,我们使用训练好的模型在训练集和测试集上进行预测,并计算准确率。
请注意,上述代码中的 logistic 回归模型是简化版本,仅包含了前向传播和反向传播的基本实现。对于更复杂的任务,您可能需要添加更多功能,如正则化、批量梯度下降等。
阅读全文