# Kaggle 官方教程：机器学习入门4 模型验证
> 原文：[Intro to Machine Learning](https://www.kaggle.com/learn/intro-to-machine-learning) > [Model Validation](https://www.kaggle.com/dansbecker/model-validation)
> 
> 译者：[Leytton](https://github.com/Leytton)
> 
> 协议：[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/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，我们首先需要一个模型：

```python
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)
```
我们有了一个模型，下面来计算平均绝对误差：
```python
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`。

代码如下：
```python
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/kernels/fork/1259097)。

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