你已经构建了一个模型。但它有多好呢?
在这节课中,你将学习使用模型验证来衡量你的模型的质量。衡量模型质量是迭代改进你的模型的关键。
什么是模型验证 你几乎会想要评估你构建的每一个模型。在大多数(虽然不是全部)应用中,衡量模型质量的相关指标是预测准确性。换句话说,模型的预测是否接近实际发生的情况。
许多人在测量预测准确性时犯了一个巨大的错误。他们用训练数据进行预测,然后将这些预测与训练数据中的目标值进行比较。你将看到这种方法的问题,以及如何解决它,但首先让我们考虑如何做到这一点。
你首先需要将模型质量总结成一种可理解的方式。如果你比较了对于 10,000 个房屋的预测和实际房屋价值,你可能会发现好坏预测的混合。浏览 10,000 个预测和实际值的列表将毫无意义。我们需要将这个总结为一个单一的指标。
有许多总结模型质量的指标,但我们将从一个称为平均绝对误差(也称为MAE)的指标开始。让我们从这个指标入手,从最后一个词"error"开始分解。
每个房屋的预测误差是:
error = 实际值 - 预测值 因此,如果一座房屋的成本是 $150,000,而你预测它的成本是 $100,000,那么误差就是 $50,000。
使用MAE指标时,我们取每个误差的绝对值。这将每个误差转换为正数。然后,我们取这些绝对误差的平均值。这是我们的模型质量度量。用简单的英语来说,可以表示为
平均而言,我们的预测偏差约为 X。
要计算MAE,我们首先需要一个模型。该模型已在下面的一个隐藏单元格中构建,你可以通过点击代码按钮来查看。(这里我就直接给大家看了)
# 数据加载代码已隐藏在这里
import pandas as pd
# 加载数据
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# 过滤掉价格缺失的行
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# 选择目标和特征
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea',
'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]
from sklearn.tree import DecisionTreeRegressor
# 定义模型
melbourne_model = DecisionTreeRegressor()
# 拟合模型
melbourne_model.fit(X, y)
DecisionTreeRegressor()
一旦我们有了模型,这是如何计算平均绝对误差的方法:
from sklearn.metrics import mean_absolute_error
predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
434.71594577146544
“样本内”得分的问题 刚刚计算的度量可以称为“样本内”得分。我们在构建模型和评估模型时都使用了同一个房屋的“样本”。这就是为什么这样做不好的原因。
想象一下,在庞大的房地产市场中,门的颜色与房价无关。
然而,在你用于构建模型的数据样本中,所有带有绿色门的房屋都非常昂贵。模型的任务是找到预测房价的模式,因此它会看到这个模式,并且它将始终预测绿色门的房屋价格很高。
由于这个模式是从训练数据中推导出来的,模型在训练数据中看起来是准确的。
但是如果这个模式在模型看到新数据时不成立,那么在实际使用中,该模型将非常不准确。
由于模型的实际价值来自对新数据的预测,我们在未用于构建模型的数据上衡量性能。这样做的最直接的方式是从模型构建过程中排除一些数据,然后使用这些数据测试模型在以前未见过的数据上的准确性。这些数据被称为验证数据。
编写代码
scikit-learn库有一个函数train_test_split
,可以将数据分成两部分。我们将使用其中一部分数据作为训练数据来拟合模型,使用另一部分数据作为验证数据来计算平均绝对误差。
以下是代码:
from sklearn.model_selection import train_test_split
# 将数据分割为训练数据和验证数据,分别用于特征和目标
# 分割基于一个随机数生成器。通过向random_state参数提供一个数字值,
# 可以确保每次运行此脚本时都获得相同的分割。
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=0)
# 定义模型
melbourne_model = DecisionTreeRegressor()
# 拟合模型
melbourne_model.fit(train_X, train_y)
# 在验证数据上获取预测的价格
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
265806.91478373145
哇!
你的样本内数据的平均绝对误差约为500美元。而样本外数据的误差超过了250,000美元。
这是几乎完全正确的模型和对于大多数实际目的来说无法使用的模型之间的差异。作为参考,验证数据中的平均房屋价值为110万美元。因此,在新数据中的误差约为平均房屋价值的四分之一。
有许多方法可以改进这个模型,比如尝试找到更好的特征或不同的模型类型。
轮到你了 在我们研究如何改进这个模型之前,请尝试进行自己的模型验证。