Skip to content

Kaggle 官方教程:机器学习入门4 模型验证

原文:Intro to Machine Learning > Model Validation

译者:Leytton

协议:CC BY-NC-SA 4.0

PS:水平有限,欢迎交流指正(Leytton@126.com)

你已经建立了一个模型。但是它好不好呢? 在本节课中,你将学习使用模型验证来度量模型的质量。度量模型质量是迭代改进模型的关键。

1、什么是模型验证

你将需要评估几乎所有构建的模型。在大多数应用程序中,模型质量的相关度量是预测精度。换言之,模型预测结果是否接近实际发生情况。

许多人在测量预测精度时犯了一个巨大的错误。他们用训练数据进行预测,并将预测结果与训练数据中的目标值进行比较。你很快就会发现这个弊端并且学习如何解决它,先让我们想一下该怎么做吧。

你首先需要以一种可理解的方式总结模型质量。如果你比较10000套房子的预测和实际房价,你可能会发现好坏参半。浏览10000个预测值和实际值的数据是没有意义的。我们需要将其总结为一个单一的度量。

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

每栋房子的预测误差为:

error = actual − predicted

所以,如果一栋房子实际售价15万美元,而你预测它的售价是10万美元,则误差是5万美元。

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

我们有了一个模型,下面来计算平均绝对误差:

from sklearn.metrics import mean_absolute_error

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

输出数据:

434.71594577146544

2、“样本内”分数问题

刚刚计算的测量值可以称为“样本内”分数。我们使用了单个的房屋“样本”来构建模型并对其进行评估。这就是弊端产生原因。

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

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

由于这种模式是从训练数据中推导出来的,所以模型在训练数据中会显得比较准确。 但是,如果模型使用新数据进行预测,这种模式是不成立的,在实际使用中,模型将非常不准确。

由于模型的实用价值体现在对新数据的预测,所以我们需要使用没有参与模型构建的数据,来度量模型性能。 最直接的方法是从模型构建过程中排除一些数据,然后使用这些数据来测试模型的准确性。这些数据称为验证数据

3、编程实现

scikit-learn库有一个函数train_test_split,用于将数据分成两部分。我们将使用一部分数据作为训练数据来适应模型,并将使用另一部分数据作为验证数据来计算mean_absolute_error

代码如下:

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

输出数据:

260585.51323434475

3、哇!

样本内数据的平均绝对误差是500美元。样本外价格超过25万美元。

这就是一个几乎完全正确的模型和一个不实用模型之间的区别。实际上,验证数据中的平均房屋价值为110万美元。因此,预测误差约为实际平均房价的四分之一。

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

4、去吧,皮卡丘

在我们考虑改进这个模型之前,请自己尝试模型验证

原文: https://www.kaggle.com/dansbecker/model-validation



回到顶部