go to index

Model Validation

read time 8 min read
Kaggle Intro Machine Learning

Model Validation

你已经构建了一个模型,但他的表现如何呢?

在本课程中,你将学习使用 **model validation(模型验证)**来衡量你的模型的质量。衡量模型质量是迭代改进你的模型的关键。

What is Model Validation

你们几乎需要评估你所构建的每一个模型。在大多数(尽管不是全部)应用中,模型质量的相关衡量标准是预测准确性。换句话说,模型的预测是否接近实际发生的情况。

许多人在衡量预测准确性时常犯一个巨大的错误。他们用训练数据进行预测,并将这些预测与训练数据中的目标值进行比较。你很快就会看到这种方法的问题以及如何解决它,但让我们先想想我们会怎么做。

你首先需要将模型质量总结为一种易于理解的方式。如果你比较了10000个房屋的预测和实际价值,你可能会找到好坏预测的混合。浏览10000个预测和实际值的列表是没有意义的。我们需要将其总结为单一指标

有许多指标可以总结模型质量,但我们将从一种称为Mean Absolute Error(平均绝对误差,也称为MAE)的指标开始。让我们从最后一个词“误差”开始分解这个指标。

每栋房子的预测误差是:

误差 = 实际值 - 预测值

所以,如果一栋房子花费了150,000美元,而你预测它将花费100,000美元,误差就是50,000美元。

使用MAE指标,我们取每个误差的绝对值。**这将每个误差转换为正数。然后我们取这些绝对误差的平均值。**这是我们衡量模型质量的方法。用简单的英语可以说成:

On average, our predictions are off by about X.

要计算MAE,我们首先需要一个模型。这个模型是在下面的隐藏单元格中构建的,你可以通过点击代码按钮来查看。

python
# 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)

Once we have a model, here is how we calculate the mean absolute error:

python
from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
# 注意,他会自动打印出误差
mean_absolute_error(y, predicted_home_prices)
plaintext
434.71594577146544

The Problem with “In-Sample” Scores

我们刚刚计算的度量可以被称为“样本内”分数。我们在构建模型和评估模型时都使用了单一的“样本”集。以下是这种方法存在的问题。

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

然而,在你用来构建模型的样本数据中,所有带绿色门的房子都非常昂贵。模型的工作是找到预测房价的模式,所以它会看到这个模式,并总是为带绿色门的房子预测高价。

由于这个模式是从训练数据中推导出来的,模型在训练数据中看起来会非常准确。

但如果这个模式在模型看到新数据时不成立,那么模型在实际使用中就会非常不准确。

由于模型的实际价值来自于对新数据进行预测,我们通过在模型构建过程中未使用的数据上进行性能度量。实现这一点的最直接方法是从模型构建过程中排除一些数据,然后使用这些数据来测试模型在它以前未见过的数据上的准确性。这些数据被称为validation data(验证数据)

Coding It

scikit-learn库有一个名为train_test_split的函数,可以将数据分成两部分。我们将使用其中一部分数据作为训练数据来拟合模型,另一部分数据将作为验证数据来计算平均绝对误差(mean absolute error)。

以下是如何使用这个函数的示例代码:

python
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))
plaintext
265806.91478373145

Wow!

你的样本内数据的平均绝对误差约为500美元。样本外数据的误差则超过250,000美元。

这是一个几乎完全准确的模型与一个对大多数实际用途来说不可用的模型之间的差异。作为参考,验证数据中房屋的平均价值为110万美元。因此,新数据中的误差约为平均房屋价值的四分之一。

有许多方法可以改进这个模型,例如尝试找到更好的特征或不同类型的模型。

Exercise:

Step 1: Split Your Data

使用 train_test_split 函数来分割你的数据。

给它传递参数 random_state=1,这样检查函数在验证你的代码时就知道应该期待什么结果。

回想一下,你的特征已经加载在 DataFrame X 中,你的目标变量已经加载在 y 中。

python
# Import the train_test_split function and uncomment
# from _ import _
from sklearn.model_selection import train_test_split
# fill in and uncomment
# train_X, val_X, train_y, val_y = ____
train_X, val_X, train_y, val_y = train_test_split(X,y,random_state = 1)
# Check your answer
step_1.check()

Step 2: Specify and Fit the Model

创建一个 DecisionTreeRegressor 模型并将其拟合到相关数据。在创建模型时再次将 random_state 设置为 1。

python
# You imported DecisionTreeRegressor in your last exercise
# and that code has been copied to the setup code above. So, no need to
# import it again

# Specify the model
iowa_model = DecisionTreeRegressor(random_state = 1)

# Fit iowa_model with the training data.
iowa_model = iowa_model.fit(train_X,train_y)

# Check your answer
step_2.check()

Step 3: Make Predictions with Validation data

python
# Predict with all validation observations
val_predictions = iowa_model.predict(val_X)

Step 4: Calculate the Mean Absolute Error in Validation Data

python
from sklearn.metrics import mean_absolute_error
val_mae = mean_absolute_error(val_y,val_predictions)

# uncomment following line to see the validation_mae
print(val_mae)