Kaggle官方课程链接:Model Validation
本专栏旨在Kaggle官方课程的汉化,让大家更方便地看懂。
Model Validation
测量模型的性能,以便测试和比较替代方案。
你已经建立了一个模型。但它有多好?
在本课中,您将学习使用模型验证来衡量模型的质量。衡量模型质量是迭代改进模型的关键。
什么是模型验证
你几乎要评估你构建的每一个模型。在大多数(但不是全部)应用中,模型质量的相关度量是预测准确性。换句话说,模型的预测是否会接近实际发生的情况。
许多人在测量预测准确性时犯了一个巨大的错误。他们使用训练数据进行预测,并将这些预测与训练数据中的目标值进行比较。稍后,您将看到这种方法的问题以及如何解决它,但让我们先考虑一下如何做到这一点。
您首先需要以一种易于理解的方式总结模型质量。如果你比较10000套房屋的预测和实际房屋价值,你可能会发现好的和坏的预测。浏览10000个预测值和实际值的列表是毫无意义的。我们需要将其总结为一个单一的指标。
总结模型质量有很多指标,但我们将从一个叫做平均绝对误差(也称为MAE)的指标开始。让我们从最后一个词错误开始分解这个指标。
每栋房屋的预测误差为:
error=actual−predicted
所以,如果一栋房子的价格是15万美元,而你预测它的价格是10万美元,那么误差是5万美元。
使用MAE度量,我们取每个误差的绝对值。这会将每个错误转换为正数。然后,我们取这些绝对误差的平均值。这是我们对模型质量的衡量标准。简单地说,它可以说
On average, our predictions are off by about 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)
DecisionTreeRegressor()
一旦我们有了一个模型,以下是我们如何计算平均绝对误差:
from sklearn.metrics import mean_absolute_errorpredicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
434.71594577146544
“样本内”分数问题
我们刚刚计算的度量可以称为“样本内”得分。我们使用了一个房屋“样本”来构建模型和评估它。这就是为什么这很糟糕。
想象一下,在庞大的房地产市场中,门的颜色与房价无关。
然而,在你用来构建模型的数据样本中,所有有绿色门的房子都非常昂贵。该模型的工作是找到预测房价的模式,因此它会看到这种模式,并且它总是预测绿色门房屋的高价。
由于这种模式是从训练数据中得出的,因此模型在训练数据中会显得准确。
但是,如果当模型看到新数据时,这种模式不成立,那么在实际使用中,模型将非常不准确。
由于模型的实用价值来自对新数据的预测,我们衡量了未用于构建模型的数据的性能。最直接的方法是从模型构建过程中排除一些数据,然后使用这些数据在以前从未见过的数据上测试模型的准确性。这些数据称为验证数据。
编码
scikit-learn库有一个函数train_test_split,可以将数据分为两部分。我们将使用其中一些数据作为训练数据来拟合模型,我们将使用其他数据作为验证数据来计算mean_absolute_error。
以下是代码:
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
在我们考虑改进此模型之前,请亲自尝试模型验证。