使用housing_renamed.csv中的数据构建两个不同的神经网络模型预测value_per_sq_ft:使用3折交叉验证来评价这两个不同的模型的好坏,要求使用torch
时间: 2024-02-13 22:02:54 浏览: 65
神经网络做预测
好的,我会为您提供一个使用 PyTorch 构建神经网络模型的代码,并使用3折交叉验证来评价模型的好坏。下面是完整的代码:
```python
import pandas as pd
import numpy as np
import torch
from torch.utils.data import Dataset, DataLoader
from sklearn.model_selection import KFold
# 加载数据
data = pd.read_csv('housing_renamed.csv')
# 划分特征和标签
X = data.drop(columns=['value_per_sq_ft']).values
y = data['value_per_sq_ft'].values
# 定义数据集类
class HousingDataset(Dataset):
def __init__(self, X, y):
self.X = torch.tensor(X, dtype=torch.float32)
self.y = torch.tensor(y, dtype=torch.float32)
def __len__(self):
return len(self.X)
def __getitem__(self, idx):
return self.X[idx], self.y[idx]
# 定义神经网络模型
class Net(torch.nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(Net, self).__init__()
self.fc1 = torch.nn.Linear(input_dim, hidden_dim)
self.fc2 = torch.nn.Linear(hidden_dim, output_dim)
self.relu = torch.nn.ReLU()
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 定义训练函数
def train(model, dataloader, optimizer, criterion):
model.train()
train_loss = 0.0
for inputs, targets in dataloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs.squeeze(), targets)
loss.backward()
optimizer.step()
train_loss += loss.item() * inputs.size(0)
return train_loss / len(dataloader.dataset)
# 定义测试函数
def test(model, dataloader, criterion):
model.eval()
test_loss = 0.0
with torch.no_grad():
for inputs, targets in dataloader:
outputs = model(inputs)
loss = criterion(outputs.squeeze(), targets)
test_loss += loss.item() * inputs.size(0)
return test_loss / len(dataloader.dataset)
# 定义交叉验证函数
def cross_validation(X, y, n_splits, input_dim, hidden_dim, output_dim, lr, epochs):
kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
for i, (train_idx, test_idx) in enumerate(kf.split(X, y)):
print('Fold %d:' % (i+1))
train_dataset = HousingDataset(X[train_idx], y[train_idx])
test_dataset = HousingDataset(X[test_idx], y[test_idx])
train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_dataloader = DataLoader(test_dataset, batch_size=32, shuffle=False)
model = Net(input_dim, hidden_dim, output_dim)
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
criterion = torch.nn.MSELoss()
for epoch in range(epochs):
train_loss = train(model, train_dataloader, optimizer, criterion)
test_loss = test(model, test_dataloader, criterion)
print('Epoch %d, Train loss: %.4f, Test loss: %.4f' % (epoch+1, train_loss, test_loss))
# 设置模型参数
input_dim = X.shape[1]
hidden_dim_1 = 16
hidden_dim_2 = 8
output_dim = 1
lr = 0.001
epochs = 50
n_splits = 3
# 进行交叉验证
cross_validation(X, y, n_splits, input_dim, hidden_dim_1, output_dim, lr, epochs)
cross_validation(X, y, n_splits, input_dim, hidden_dim_2, output_dim, lr, epochs)
```
上面的代码中,我们首先加载数据并划分特征和标签。然后,我们定义了一个 `HousingDataset` 类来实现数据集的封装。接着,我们定义了一个简单的神经网络模型 `Net`,其中包含两个全连接层和一个 ReLU 激活函数。接下来,我们定义了训练函数 `train` 和测试函数 `test`,并使用交叉验证函数 `cross_validation` 对模型进行训练和评估。
在 `cross_validation` 函数中,我们使用了 `KFold` 函数来划分数据集,并对每一折数据进行训练和测试。在每个折中,我们首先创建训练集和测试集的 `Dataset` 和 `DataLoader`,然后创建一个新的神经网络模型、优化器和损失函数。接着,我们使用 `train` 函数对模型进行训练,并使用 `test` 函数对模型进行测试。最后,我们输出每个 epoch 的训练和测试损失。
在代码的最后,我们设置了模型参数并调用 `cross_validation` 函数两次,分别使用不同的隐藏层大小来训练和评估模型。您可以根据需要修改这些参数以获得更好的模型性能。
希望这个代码能够对您有所帮助!
阅读全文