import pandas as pd
import torch
from torch import nn
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
x = torch.tensor(data[:, -1], dtype=torch.float32)
y = torch.tensor(target, dtype=torch.float32)
x = x.unsqueeze(1)
print(x.shape)
class Model(nn.Module):
def __init__(self, n_features, n_neurons, num_classes):
super(Model, self).__init__()
self.model = nn.Sequential(
nn.Linear(n_features, num_classes),
)
def forward(self, x):
return self.model(x)
model = Model(n_features=1, n_neurons=1, num_classes=1)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
loss_function = nn.MSELoss()
for epoch in range(10000):
optimizer.zero_grad()
output = model(x)
loss_value = loss_function(output, y)
loss_value.backward()
optimizer.step()
有什么问题吗?这个最简单的线性模型经过训练可以始终预测平均值。尽管普通线性回归的预测效果要好 3 倍。此外,我已经手动使用 pytorch 实现了线性回归,一切正常。但是,使用 nn 模块的这种实现不起作用。可能是什么问题?
p.s 您可以在计算机上运行代码 - 将从 url 加载标准波士顿房价数据。
尝试了 scklearn 的默认 Linear reg,火炬手实现,一切正常,结果良好(mse < 35).