赞
踩
嗨,亲爱的读者们,欢迎来到这个关于深度学习实战的博客!今天,我们将深入探讨一个经典的机器学习问题:波士顿房价预测。我们将使用PyTorch框架,从头到尾详细解释这个案例,旨在帮助初学者理解深度学习模型的构建和训练过程。无论你是否具有深度学习经验,这篇文章都将带你深入了解如何使用PyTorch构建一个强大的预测模型。
波士顿房价预测问题是一个典型的回归问题,目标是根据一些特征来预测波士顿地区的房价。这是一个重要的房地产应用,可以帮助购房者和开发商做出明智的决策。我们将使用PyTorch构建一个神经网络模型,该模型将根据输入的特征来预测房价。
在任何机器学习项目中,首要任务是准备数据。在这个案例中,我们将使用波士顿房价数据集,该数据集包含了506个样本和13个特征。每个样本都有一个房价的目标值,我们的目标是根据这些特征来预测目标值。
首先,让我们导入必要的库并加载数据:
import numpy as np import pandas as pd import torch import torch.nn as nn from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error # 加载数据集 from sklearn.datasets import load_boston boston = load_boston() data = pd.DataFrame(boston.data, columns=boston.feature_names) data['PRICE'] = boston.target # 分离特征和目标 X = data.drop('PRICE', axis=1) y = data['PRICE']
在上述代码中,我们首先导入了所需的Python库,并使用load_boston
函数加载了波士顿房价数据集。然后,我们将数据分成特征(X
)和目标(y
)。
接下来,我们将数据分为训练集和测试集,以便在训练模型时进行验证:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
在构建模型之前,我们需要对数据进行一些预处理步骤。首先,我们将进行特征缩放,以确保所有特征具有相似的尺度。这有助于模型更快地收敛并提高性能。我们使用StandardScaler
来标准化特征:
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
接下来,我们将数据转换为PyTorch张量,以便在模型中使用。我们还将目标值转换为张量,并将数据加载到PyTorch的DataLoader
中以进行批量处理:
X_train_tensor = torch.tensor(X_train_scaled, dtype=torch.float32)
X_test_tensor = torch.tensor(X_test_scaled, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train.values, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test.values, dtype=torch.float32)
# 创建数据加载器
batch_size = 64
train_data = torch.utils.data.TensorDataset(X_train_tensor, y_train_tensor)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, shuffle=True)
现在,我们将开始构建神经网络模型。在这个案例中,我们将创建一个简单的多层感知器(MLP)模型,它由多个全连接层组成。我们使用PyTorch的nn.Module
来定义模型:
class BostonHousingModel(nn.Module): def __init__(self, input_size): super(BostonHousingModel, self).__init__() self.fc1 = nn.Linear(input_size, 64) self.relu1 = nn.ReLU() self.fc2 = nn.Linear(64, 32) self.relu2 = nn.ReLU() self.fc3 = nn.Linear(32, 1) def forward(self, x): x = self.fc1(x) x = self.relu1(x) x = self.fc2(x) x = self.relu2(x) x = self.fc3(x) return x
在上述代码中,我们创建了一个名为BostonHousingModel
的自定义模型类,继承自nn.Module
。我们定义了三个全连接层(fc1
、fc2
、fc3
)和两个激活函数(relu1
、relu2
)。在前向传播方法forward
中,我们定义了数据在模型中的传递方式。
现在,我们已经准备好训练我们的神经网络模型了。我们将定义训练循环,选择损失函数和优化器,并开始模型的训练。
首先,我们定义损失函数。由于这是一个回归问题,我们选择均方误差(Mean Squared Error,MSE)作为损失函数。然后,我们选择优化器,这里我们使用随机梯度下降(SGD):
model = BostonHousingModel(input_size=X_train.shape[1]) # 创建模型
criterion = nn.MSELoss() # 均方误差损失
optimizer = torch.optim.SGD(model.parameters(), lr=0.001) # 随机梯度下降优化器
接下来,我们定义训练循环,并在训练集上进行多轮训练:
num_epochs = 1000 for epoch in range(num_epochs): model.train() # 设置模型为训练模式 running_loss = 0.0 for inputs, targets in train_loader: optimizer.zero_grad() # 清零梯度 outputs = model(inputs) # 前向传播 loss = criterion(outputs, targets) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 running_loss += loss.item() if (epoch + 1) % 100 == 0: print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {running_loss / len(train_loader)}')
在上述代码中,我们循环遍历多个轮次(这里选择了1000轮),在每个轮次中执行训练循环。在训练循环中,我们首先将模型设置为训练模式(model.train()
),然后循环遍历训练数据批次。对于每个批次,我们执行以下步骤:
optimizer.zero_grad()
)。optimizer.step()
)。我们还在每100轮训练后打印出损失值,以监控模型的训练进展。
训练完成后,我们需要评估模型的性能。我们将使用测试集来评估模型的预测能力,并计算均方根误差(Root Mean Squared Error,RMSE)来衡量模型的性能:
model.eval() # 设置模型为评估模式
with torch.no_grad():
y_pred = model(X_test_tensor)
rmse = torch.sqrt(criterion(y_pred, y_test_tensor))
print(f'Root Mean Squared Error (RMSE): {rmse.item()}')
在上述代码中,我们首先将模型设置为评估模式(model.eval()
),然后使用torch.no_grad()
上下文管理器来禁止梯度计算,因为我们只是在评估模型而不是训练模型。接下来,我们使用测试集来获取模型的预测值,并计算RMSE,即模型预测值与真实值之间的均方根误差。
现在,我们已经训练了一个波士顿房价预测模型,并且该模型在测试集上表现良好。我们可以将此模型用于实际应用,根据输入的特征来预测波士顿房价。以下是一个示例,展示了如何使用模型进行预测:
# 输入特征示例
sample_input = np.array([0.02731, 0.0, 7.07, 0.0, 0.469, 6.421, 78.9, 4.9671, 2.0, 242.0, 17.8, 396.9, 9.14])
sample_input_scaled = scaler.transform(sample_input.reshape(1, -1)) # 特征缩放
sample_input_tensor = torch.tensor(sample_input_scaled, dtype=torch.float32)
# 使用模型进行预测
model.eval()
with torch.no_grad():
predicted_price = model(sample_input_tensor)
print(f'Predicted Price: ${predicted_price.item() * 1000:.2f}')
在这个示例中,我们首先定义了一个输入特征示例(这里使用数据集中的一个样本)。然后,我们对输入特征进行特征缩放,将其转换为PyTorch张量,并使用训练好的模型进行预测。最后,我们将预测结果转换为实际房价。
恭喜!你已经成功构建了一个用于波士顿房价预测的深度学习模型,并且在测试集上获得了良好的性能。这个案例展示了如何使用PyTorch框架来处理回归问题,包括数据准备、特征缩放、模型构建、训练、评估和应用。
希望本文对初学者有所帮助,并激发你深入研究深度学习的兴趣。深度学习是一个令人兴奋和不断发展的领域,它在各个领域都有着广泛的应用。如果你有任何问题或需要进一步的帮助,请随时提问。继续学习和探索,祝你在深度学习的旅程中取得成功!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。