你已经建立了一个模型。但它有多好?

在本课中,你将学习如何使用模型验证来衡量模型的质量。衡量模型质量是迭代改进模型的关键。

What is Model Validation

你几乎需要评估你构建的每个模型。在大多数(但并非所有)应用中,模型质量的相关指标是预测准确度。换句话说,模型的预测是否接近实际情况。

许多人在衡量预测准确度时犯了一个很大的错误。他们使用训练数据进行预测,然后将这些预测与训练数据中的目标值进行比较。你稍后会看到这种方法的问题以及如何解决它,但让我们先思考一下如何做到这一点。

你首先需要以一种易于理解的方式概括模型质量。如果你比较 10,000 栋房屋的预测价值和实际价值,你可能会发现预测结果有好有坏。浏览一万个预测值和实际值的列表毫无意义。我们需要将其总结为一个指标。

有很多指标可以概括模型的质量,但我们先从平均绝对误差(也称为MAE)开始。让我们从最后一个词“误差”开始,来详细分析一下这个指标。

每栋房屋的预测误差为:

error=actual−predicted

因此,如果一栋房子的价格为 150,000 美元,而您预测其价格为 100,000 美元,则误差为 50,000 美元。

使用 MAE 指标,我们取每个误差的绝对值。这会将每个误差转换为正数。然后,我们取这些绝对误差的平均值。这是我们衡量模型质量的指标。简而言之,可以表示为

平均而言,我们的预测偏差约为 X。

要计算 MAE,我们首先需要一个模型。该模型构建在下面的隐藏单元格中,您可以点击“代码”按钮查看。

# Data Loading Code Hidden Here
import pandas as pd

# Load data
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# Filter rows with missing price values
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
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
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(X, y)

建立模型后,我们将按以下方式计算平均绝对误差:

In [2]:

from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)

Out[2]:

434.71594577146544

The Problem with “In-Sample” Scores

我们刚刚计算出的指标可以称为“样本内”得分。我们只使用了一个房屋“样本”来构建和评估模型。以下是这样做的弊端。

想象一下,在庞大的房地产市场中,门的颜色与房价无关。

然而,在你用于构建模型的数据样本中,所有带有绿色门的房屋都非常昂贵。该模型的任务是找到预测房价的模式,因此它会看到这种模式,并且始终会预测带有绿色门的房屋价格较高。

由于这种模式源自训练数据,因此该模型在训练数据中看起来是准确的。

但是,如果当模型遇到新数据时,这种模式不成立,那么在实际使用中,该模型将非常不准确。

由于模型的实际价值来自于对新数据的预测,因此我们会衡量模型在未用于构建模型的数据上的性能。最直接的方法是从模型构建过程中排除一些数据,然后用这些数据来测试模型在之前从未见过的数据上的准确性。这些数据被称为验证数据

Coding It

scikit-learn 库中有一个函数“train_test_split”,可以将数据拆分成两部分。我们将使用其中一部分数据作为训练数据来拟合模型,并使用另一部分数据作为验证数据来计算“mean_absolute_error”。

代码如下:

In [3]:

from sklearn.model_selection import train_test_split

# split data into training and validation data, for both features and target
# The split is based on a random number generator. Supplying a numeric value to
# the random_state argument guarantees we get the same split every time we
# run this script.
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(train_X, train_y)

# get predicted prices on validation data
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
265806.91478373145

Wow!

您的样本内数据的平均绝对误差约为 500 美元。样本外数据的平均绝对误差超过 25 万美元。

这是一个几乎完全正确的模型与一个在大多数实际应用中无法使用的模型之间的差异。作为参考,验证数据中的平均房屋价值为 110 万美元。因此,新数据中的误差约为平均房屋价值的四分之一。

有很多方法可以改进此模型,例如通过实验寻找更优的特征或不同的模型类型。

Your Turn

在我们考虑改进这个模型之前,请先亲自尝试一下**模型验证**。