使用housing_renamed.csv中的数据构建两个不同的神经网络模型预测value_per_sq_ft:使用3折交叉验证来评价这两个不同的模型的好坏,要求使用torch
时间: 2024-02-06 20:12:41 浏览: 136
好的,我明白了。为了回答你的问题,我将分为以下几个步骤:
1. 加载数据集
2. 数据集预处理
3. 构建两个不同的神经网络模型
4. 定义损失函数和优化器
5. 利用3折交叉验证来评价模型的好坏
以下是详细的步骤:
1. 加载数据集
首先,我们需要使用 pandas 库来加载数据集:
```python
import pandas as pd
df = pd.read_csv('housing_renamed.csv')
```
2. 数据集预处理
接下来,我们需要对数据集进行预处理,包括将数据集分为训练集和测试集,并将数据进行归一化处理:
```python
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 将数据集分为训练集和测试集
train_data, test_data = train_test_split(df, test_size=0.2)
# 对训练集和测试集进行归一化处理
scaler = StandardScaler()
train_data = scaler.fit_transform(train_data)
test_data = scaler.transform(test_data)
```
3. 构建两个不同的神经网络模型
我们将构建两个简单的神经网络模型,一个包含一个隐藏层,另一个包含两个隐藏层。
```python
import torch
import torch.nn as nn
class Net1(nn.Module):
def __init__(self):
super(Net1, self).__init__()
self.fc1 = nn.Linear(13, 8) # 输入层到隐藏层
self.fc2 = nn.Linear(8, 1) # 隐藏层到输出层
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
class Net2(nn.Module):
def __init__(self):
super(Net2, self).__init__()
self.fc1 = nn.Linear(13, 8) # 输入层到第一个隐藏层
self.fc2 = nn.Linear(8, 4) # 第一个隐藏层到第二个隐藏层
self.fc3 = nn.Linear(4, 1) # 第二个隐藏层到输出层
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
```
4. 定义损失函数和优化器
我们使用均方误差(MSE)作为损失函数,并使用 Adam 优化器进行优化:
```python
criterion = nn.MSELoss()
optimizer1 = torch.optim.Adam(net1.parameters(), lr=0.01)
optimizer2 = torch.optim.Adam(net2.parameters(), lr=0.01)
```
5. 利用3折交叉验证来评价模型的好坏
最后,我们将使用 3 折交叉验证来评价模型的好坏:
```python
from sklearn.model_selection import KFold
# 设置 k 折交叉验证
k = 3
kf = KFold(n_splits=k)
# 初始化损失
loss1_list = []
loss2_list = []
# 进行 k 折交叉验证
for train_index, test_index in kf.split(train_data):
# 分离训练集和验证集
x_train, x_val = train_data[train_index], train_data[test_index]
y_train, y_val = train_data[train_index], train_data[test_index]
# 将数据转换为张量
x_train = torch.tensor(x_train, dtype=torch.float32)
x_val = torch.tensor(x_val, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32)
y_val = torch.tensor(y_val, dtype=torch.float32)
# 训练模型 1
net1 = Net1()
optimizer1 = torch.optim.Adam(net1.parameters(), lr=0.01)
for epoch in range(100):
y_pred = net1(x_train)
loss = criterion(y_pred, y_train)
optimizer1.zero_grad()
loss.backward()
optimizer1.step()
loss1_list.append(criterion(net1(x_val), y_val).item())
# 训练模型 2
net2 = Net2()
optimizer2 = torch.optim.Adam(net2.parameters(), lr=0.01)
for epoch in range(100):
y_pred = net2(x_train)
loss = criterion(y_pred, y_train)
optimizer2.zero_grad()
loss.backward()
optimizer2.step()
loss2_list.append(criterion(net2(x_val), y_val).item())
# 输出结果
print('Model 1 average validation loss:', sum(loss1_list) / len(loss1_list))
print('Model 2 average validation loss:', sum(loss2_list) / len(loss2_list))
```
这里我们使用了 100 个 epoch 进行训练,你可以根据你的需求进行修改。最后,输出结果将给出每个模型的平均验证损失。
阅读全文