波士顿房价预测(回归问题)--python深度学习

波士顿房价预测(回归问题)

预测 20 世纪 70 年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数
据点,比如犯罪率、当地房产税率等。它包含的数据点相对较少,只有 506 个,分为 404 个训练样本和 102 个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特性是比例,取值范围为 0~ 1;有的取值范围为 1~ 12;还有的取值范围为 0~ 100,等等。

from keras.datasets import boston_housing

(train_data, train_targets), (test_data, test_targets) =  boston_housing.load_data()
train_data.shape

(404, 13)

test_data.shape

(102, 13)

13 个数值特征

  1. Per capita crime rate.人均犯罪率
  2. Proportion of residential land zoned for lots over 25,000 square feet.超过25,000平方英尺土地的住宅用地比例
  3. Proportion of non-retail business acres per town.城镇非零售经营面积占比
  4. Charles River dummy variable (= 1 if tract bounds river; 0 otherwise).查尔斯河虚拟变量(河道边界河流=1,否则0)。
  5. Nitric oxides concentration (parts per 10 million).一氧化氮浓度(千万分之一)
  6. Average number of rooms per dwelling.每套住宅的平均房间数
  7. Proportion of owner-occupied units built prior to 1940.1940年以前建造的自住单位的比例
  8. Weighted distances to five Boston employment centres.到波士顿五个就业中心的加权距离
  9. Index of accessibility to radial highways.径向公路可达性指数
  10. Full-value property-tax rate per $10,000. 每1万美元的全额房产税税率
  11. Pupil-teacher ratio by town.各镇师生比例
  12. 1000 * (Bk - 0.63) ** 2 where Bk is the proportion of Black people by town.
    1000 * (Bk - 0.63) ** 2其中Bk是按城镇划分的黑人比例
  13. % lower status of the population.人口地位降低%
# 目标是房屋价格的中位数,单位是千美元。
train_targets

房价大都在 10 000~50 000 美元。如果你觉得这很便宜,不要忘记当时是 20 世纪 70 年代中
期,而且这些价格没有根据通货膨胀进行调整。

1.数据预处理

注意,用于测试数据标准化的均值和标准差都是在训练数据上计算得到的。在工作流程中,
你不能使用在测试数据上计算得到的任何结果,即使是像数据标准化这么简单的事情也不行

# 特征的取值范围差异很大,对每个特征做标准化
mean = train_data.mean(axis=0)     # axis=0按列取均值
train_data -= mean
std = train_data.std(axis=0)
train_data /= std

test_data -= mean
test_data /= std
df.mean(axis=0)

2.模型构建

由于样本数量很少,使用一个非常小的网络

from keras import models
from keras import layers

def build_model():          # 因为需要将同一个模型多次实例化,所以用一个函数来构建模型
    model = models.Sequential()
    # input_shapez指每次输入一个样本,该样本的特征数
    model.add(layers.Dense(64, activation='relu',input_shape=(train_data.shape[1],)))   
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(1))   # 标量回归:最后一层只有一个单元,没有激活,是一个线性层
   
    model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
    return model

网络的最后一层只有一个单元,没有激活,是一个线性层。这是标量回归(标量回归是预
测单一连续值的回归)的典型设置。添加激活函数将会限制输出范围。例如,如果向最后一层
添加 sigmoid 激活函数,网络只能学会预测 0~1 范围内的值。这里最后一层是纯线性的,所以
网络可以学会预测任意范围内的值。

注意,编译网络用的是 mse 损失函数,即均方误差(MSE,mean squared error),预测值与
目标值之差的平方。这是回归问题常用的损失函数。

在训练过程中还监控一个新指标:平均绝对误差(MAE,mean absolute error)。它是预测值
与目标值之差的绝对值。比如,如果这个问题的 MAE 等于 0.5,就表示你预测的房价与实际价
格平均相差 500 美元

3.K 折交叉验证

数据点很少,验证集会非常小。验证集的划分方式可能会造成验证分数上有很大的方差,这样就无法对模型进行可靠的评估。

最佳做法是使用 K 折交叉验证。这种方法将可用数据划分为 K
个分区(K 通常取 4 或 5),实例化 K 个相同的模型,将每个模型在 K-1 个分区上训练,并在剩
下的一个分区上进行评估。模型的验证分数等于 K 个验证分数的平均值。

在这里插入图片描述

import numpy as np

k = 4
num_epochs = 100
num_val_samples = len(train_data) // k      # /除,//取整,%取余
all_scores = []
for i in range(k):
    print('processing fold #', i)

    val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples]        # 验证数据:第 k 个分区的数据
    val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]

    partial_train_data = np.concatenate(              # 训练数据:其他所有分区的数据
        [train_data[:i * num_val_samples],train_data[(i + 1) * num_val_samples:]],
        axis=0)
    partial_train_targets = np.concatenate(
        [train_targets[:i * num_val_samples],train_targets[(i + 1) * num_val_samples:]],
        axis=0)

    model = build_model()       # 构建 Keras 模型(已编译)
    model.fit(partial_train_data, partial_train_targets,      # 训练模型(静默模式verbose=0)
              epochs=num_epochs, batch_size=1, verbose=0)           # 数据量很小,设置batch_size=1

    val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)     # 在验证数据上评估模型
    all_scores.append(val_mae)

processing fold # 0
processing fold # 1
processing fold # 2
processing fold # 3

all_scores

[2.239992141723633, 2.7303361892700195, 2.727764129638672, 2.8013319969177246]

np.mean(all_scores)

2.624856114387512

让训练时间更长一点,达到 500 个轮次,记录每轮的表现

如果在一个循环中创建许多模型,则此全局状态将随着时间消耗越来越多的内存,需要清除它。调用clear_session()会释放全局状态,这有助于避免旧模型和层造成混乱

from keras import backend as K
K.clear_session()     # 重置所有由Keras产生的图层状态
import numpy as np

k = 4
num_epochs = 500
num_val_samples = len(train_data) // k      # /除,//取整,%取余
all_mae_histories = []
for i in range(k):
    print('processing fold #', i)

    val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples]        # 验证数据:第 k 个分区的数据
    val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]

    partial_train_data = np.concatenate(              # 训练数据:其他所有分区的数据
        [train_data[:i * num_val_samples],train_data[(i + 1) * num_val_samples:]],
        axis=0)
    partial_train_targets = np.concatenate(
        [train_targets[:i * num_val_samples],train_targets[(i + 1) * num_val_samples:]],
        axis=0)

    model = build_model()       # 构建 Keras 模型(已编译)
    history = model.fit(partial_train_data, partial_train_targets,    # 训练模型(静默模式verbose=0)
                validation_data=(val_data,val_targets),       
              epochs=num_epochs, batch_size=1, verbose=0)           # 数据量很小,设置batch_size=1

    mae_history = history.history['val_mae']
    all_mae_histories.append(mae_history)

processing fold # 0
processing fold # 1
processing fold # 2
processing fold # 3

# 计算所有轮次中的 K 折验证分数平均值
average_mae_history = [
    np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]

Let’s plot this:

import matplotlib.pyplot as plt

plt.plot(range(1, len(average_mae_history) + 1), average_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()

在这里插入图片描述

因为纵轴的范围较大,且数据方差相对较大,所以难以看清这张图的规律。

  • 删除前 10 个数据点,因为它们的取值范围与曲线上的其他点不同。
  • 将每个数据点替换为前面数据点的指数移动平均值,以得到光滑的曲线
# 验证 MAE 在 80 轮后不再显著降低,之后就开始过拟合
def smooth_curve(points, factor=0.9):
    smoothed_points = []
    for point in points:
        if smoothed_points:
            previous = smoothed_points[-1]
            smoothed_points.append(previous * factor + point * (1 - factor))
        else:
            smoothed_points.append(point)
    return smoothed_points

smooth_mae_history = smooth_curve(average_mae_history[10:])

plt.plot(range(1, len(smooth_mae_history) + 1), smooth_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()

在这里插入图片描述

# 训练最终模型
model = build_model()
model.fit(train_data, train_targets,
          epochs=80, batch_size=16, verbose=0)
test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)

4/4 [==============================] - 0s 988us/step - loss: 17.1250 - mae: 2.6952

test_mae_score

2.6951732635498047

在这里插入图片描述

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Pytorch是一种基于Python的开源机器学习库,常用于深度学习和神经网络。波士顿房价预测是一个经典的回归问题,利用Pytorch可以轻松构建一个神经网络模型进行预测。 首先,我们需要准备数据集。波士顿房价数据集包含506条数据,共有13个特征,包括房间数、年龄、地理位置等。此外,数据集还包含每个区域的房价中位数。我们可以使用Pytorch自带的datasets模块加载波士顿房价数据集,并将数据集分成训练集和测试集。 接下来,我们可以定义神经网络模型。在Pytorch中,通过继承nn.Module类,可以重载类的__init__和forward函数,实现自定义神经网络模型。在本例中,我们可以定义一个包含两个隐藏层和一个输出层的全连接神经网络,使用ReLU作为激活函数,最后输出预测的房价中位数。 在定义好模型之后,我们需要定义损失函数和优化器。在本例中,我们可以使用均方误差(MSE)作为损失函数,使用随机梯度下降(SGD)作为优化器。 最后,我们可以使用Pytorch的训练循环进行模型训练。在每个训练迭代中,我们将输入数据和标签传入模型,计算预测结果和损失,并根据损失反向传播来更新模型参数。在训练过程中,我们还应该监控模型在测试集上的表现,来评估模型的泛化能力。 通过Pytorch进行波士顿房价预测,我们可以快速构建一个灵活、可扩展的神经网络模型,并通过训练和调优来提高预测精度和泛化能力。 ### 回答2: PyTorch是一种开源的机器学习框架,它是一个基于Python语言的深度学习框架。它使用动态计算图,这使得它在构造网络结构方面比其他框架更加灵活和易于理解。同时,它还提供了各种丰富的工具和函数库,帮助用户快速搭建和训练深度学习模型。 波士顿房价预测是一个经典的回归问题,即根据输入的房屋特征(如面积、卧室数量、犯罪率等)来预测房价。下面介绍如何使用PyTorch实现波士顿房价预测。 1. 导入数据集 首先,我们需要导入波士顿房价数据集,并将其划分为训练集和测试集。可以使用PyTorch提供的“torchvision.datasets”库来导入数据集。代码如下: ``` from torchvision.datasets import BostonHousing from torch.utils.data import DataLoader, random_split # 导入数据集 dataset = BostonHousing(root='.', download=True) # 将数据集划分为训练集和测试集 train_dataset, test_dataset = random_split(dataset, [400, 106]) ``` 这里使用了“random_split”函数将数据集划分为400个训练样本和106个测试样本。我们将使用这些数据来训练和测试我们的模型。 2. 构建模型 接下来,我们需要构建一个神经网络模型来预测房价。在PyTorch中,我们可以使用“torch.nn”库来创建各种类型的神经网络。对于这个问题,我们可以使用一个简单的全连接神经网络。代码如下: ``` import torch.nn as nn class BostonHousingModel(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(13, 64) self.fc2 = nn.Linear(64, 32) self.fc3 = nn.Linear(32, 1) def forward(self, x): x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x model = BostonHousingModel() ``` 这里,我们定义了一个名为“BostonHousingModel”的类,它继承自PyTorch中的“nn.Module”类。在类的构造函数中,我们定义了3个全连接层,输入层有13个特征,隐层有64个节点,隐层2有32个节点,输出层有1个节点。在前向传播函数中,我们使用ReLU激活函数对每个隐层的输出进行激活,并将最终输出作为模型的输出。 3. 定义损失函数和优化器 在训练模型之前,我们需要定义一个损失函数和一个优化器。损失函数用于衡量模型输出和真实房价之间的差异,常用的损失函数是均方差损失函数。优化器用于调整模型的参数,使模型能够逐渐逼近真实房价。PyTorch中提供了各种优化器,如随机梯度下降(SGD)、Adam、Adagrad等。在这里,我们将使用Adam优化器。代码如下: ``` loss_fn = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 这里,我们使用了MSE损失函数和Adam优化器。在实例化Adam优化器时,我们向其传递模型参数和学习率。 4. 训练模型 现在,我们已经准备好训练模型了。在训练过程中,我们将输入特征和真实房价馈送到模型中,计算出模型的输出和真实房价之间的差异,然后使用反向传播算法更新模型参数。此过程将重复多个时期(epoch)直到损失收敛为止。代码如下: ``` num_epochs = 1000 for epoch in range(num_epochs): for batch in DataLoader(train_dataset, batch_size=64, shuffle=True): inputs, targets = batch predictions = model(inputs) loss = loss_fn(predictions, targets) optimizer.zero_grad() loss.backward() optimizer.step() # 打印损失 if epoch % 100 == 0: print(f"Epoch [{epoch}/{num_epochs}], Loss: {loss.item():.4f}") ``` 在代码中,我们使用了“DataLoader”类将训练数据分成批次,每个批次包含64个样本。具体来说,我们对训练数据集进行了多个迭代,每次迭代都计算一个批次的预测和损失,并对参数进行优化。最后,我们打印出每100个时期的损失。 5. 测试模型 当我们完成了模型的训练后,我们需要评估模型的性能。为此,我们使用测试集中的样本来计算模型的均方根误差(RMSE)。代码如下: ``` from sklearn.metrics import mean_squared_error # 计算测试集上的RMSE with torch.no_grad(): predictions = model(test_dataset[:][0]) rmse = mean_squared_error(test_dataset[:][1], predictions)**0.5 print(f"RMSE: {rmse:.4f}") ``` 在代码中,我们使用Sklearn库中的“mean_squared_error”函数计算模型的预测值与测试集实际值之间的MSE,然后取其平方根得到RMSE指标。 在本文中,我们介绍了如何使用PyTorch框架实现波士顿房价预测。总结下来,我们需要进行以下步骤:导入数据集、构建模型、定义损失函数和优化器、训练模型、测试模型。在实现模型过程中,我们可以使用PyTorch提供的各种工具和函数库,以加快模型的训练和调试。 ### 回答3: Pytorch是一款非常流行的深度学习框架,具有高度的灵活性和强大的计算能力,因此在房价预测等领域得到了广泛的应用。波士顿房价预测是一个经典的机器学习问题,我们可以利用Pytorch来解决。 在波士顿房价预测中,我们需要构建一个模型,输入是房屋的各种特征,包括房屋的位置、大小、朝向、房龄等,输出是该房屋的价格。在Pytorch中,我们可以利用神经网络来构建模型。具体来说,我们可以使用多层全连接神经网络,其中每个神经元都与前一层的所有神经元相连,输出层的神经元数量为1,表示预测的房价。通过不断调整神经网络的参数,训练模型,使其能够更好地拟合已知的数据,从而实现预测未知房屋的价格。 在使用Pytorch进行波士顿房价预测的过程中,我们需要注意以下几点: 1. 数据预处理:在训练模型之前,我们需要对数据进行一些预处理,包括缺失值填充、归一化等操作,以保证模型的稳定性和准确性。 2. 网络建模:我们需要根据任务的具体特点,选择合适的神经网络模型,包括神经元数量、层数、激活函数等等。 3. 训练模型:我们可以利用反向传播算法等方法对神经网络进行训练,从而得到最优的模型参数。 4. 模型评估:我们可以利用测试集等方法对训练得到的模型进行评估,以判断其在新数据上的预测性能。 总之,Pytorch是一款功能强大的深度学习框架,可以用于各种机器学习问题的解决,包括波士顿房价预测。通过对数据的处理和对神经网络模型的调整,我们可以训练出一个准确可靠的房价预测模型,为房地产等行业的发展提供帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值