Kaggle 教程4 -- 验证你的模型

2019-02-22  本文已影响0人  TwinIsland

翻译自 Kaggle
翻译 by Wyatt Huang
转载请著名

你已经建立了一个模型。 但它的准确度怎么样?
在本课程中,您将学习如何使用模型验证来衡量模型的质量。 测量模型质量是改进模型的关键。

什么是模型验证?

当你在对你模型的质量进行度量的时候,模型质量的相关度量是预测准确性。换句话说,模型的预测是否接近实际发生的情况

在测量预测准确性时,许多人犯了一个大错误。他们通过对自己模型的训练数据来进行回测,并将这些预测与训练数据中的目标值进行比较。在本节课中,你会知道问什么以上的方法为什么没有意义并且知道怎么去解决它。

您首先需要将模型质量概括为可理解的方式。如果您比较10,000个房屋的预测价值实际房屋的价值,您可能会发现好的和坏的预测混合。查看10,000个预测值和实际值的列表将毫无意义。我们需要将其汇总为一个指标。

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

每个房子的预测误差(Prediction Error)是:

# 误差值 = 真实值 - 预测值
error=actual−predicted

因此,如果房子花费150,000美元并且您预计它将花费100,000美元,那么误差就是50,000美元。

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

MAE = \frac {\sum |实际值-估计值|}{数据的个数}

要计算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)

然后,我们再用MAE来计算我们模型的准确度:

from sklearn.metrics import mean_absolute_error

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

## 输出:
434.71594577146544

样本内打分的问题

我们刚刚计算的度量可称为“样本内”得分("in-sample" score)。我们使用同一个房屋的“样本”来同时构建模型并对其进行评估。这就是为什么这很糟糕。

想象一下,在大型房地产市场,门颜色与房价无关

但是,在用于构建模型的数据样本中,所有带绿色门的房屋都非常昂贵。该模型的工作是找到预测房价的模式,因此它将看到这种模式,它将始终预测绿色房屋的高价格。

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

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

由于模型的实用价值来自对新数据的预测,因此我们测量未用于构建模型的数据的性能。最直接的方法是从模型构建过程中排除一些数据,然后使用它们来测试模型对以前没有见过的数据的准确性。该数据称为验证数据

译者总结一下,上面的意思就是:你不能用你用来训练模型的数据来对模型进行评分,因为这样会造成你模型得分贼高的假象,为了避免这一情况,有一种解决方法就是把你的所有数据分为两组:训练数据测试数据,用训练数据来训练模型,再用测试数据来测试你模型的准确性,这样就能完美的避免上述问题了。

实现

scikit-learn库有一个函数train_test_split,可以将数据分成两部分。 我们将使用一些数据作为训练数据来拟合模型,我们将使用其他数据作为验证数据来计算 MAE。

这是代码:

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

## 结果
260597.04648160102

Wow!

通过上面的验证,我们可以看出样本内数据的平均绝对误差约为500美元。样本外却超过250,000美元。

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

有许多方法可以改进此模型,例如构建分支更多的决策树或者使用更好的模型。

作业

编程并计算 MAE,对自己的模型进行评估


关键词:

数据:

上一篇下一篇

猜你喜欢

热点阅读