Kaggle、Python机器学习教程(四):验证模型
你已经建立了一个模型。 但它是否可用?
在本课程中,您将学习如何使用模型验证来衡量模型的质量。 测量模型质量是迭代改进模型的关键。
什么是模型验证
您将要评估您构建的几乎所有模型。在大多数(尽管不是全部)应用中,模型质量的相关度量是预测准确性。换句话说,模型的预测是否接近实际发生的情况。
在测量预测准确性时,许多人犯了一个大错误。他们使用他们的训练数据进行预测,并将这些预测与训练数据中的目标值进行比较。你会看到这种方法的问题以及如何在一瞬间解决它,但让我们先考虑一下我们如何做到这一点。
您首先需要将模型质量概括为可理解的方式。如果您比较10,000个房屋的预测和实际房屋价值,您可能会发现好的和坏的预测混合。查看10,000个预测值和实际值的列表将毫无意义。我们需要将其汇总为一个指标。
总结模型质量有许多指标,但我们将从一个称为平均绝对误差(也称为MAE)开始。让我们从最后一个单词error开始分解这个指标。
每个房子的预测错误是:
error=actual−predicted
因此,如果房子花费150,000美元并且您预计它将花费100,000美元,那么错误就是50,000美元。
使用MAE指标,我们获取每个错误的绝对值。 这会将每个错误转换为正数。 然后我们取这些绝对误差的平均值。 这是我们衡量模型质量的标准。 用简单的英语,可以说是
On average, our predictions are off by about X.
要计算MAE,我们首先需要一个模型。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import pandas as pd
# Load data
melbourne_file_path = '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()
# Fit model
melbourne_model.fit(X, y)
print("首次样本内预测:", melbourne_model.predict(X.head()))
print("实际目标值:", y.head().tolist())
一旦我们有了模型,这就是我们计算平均绝对误差的方法:
from sklearn.metrics import mean_absolute_error
predicted_home_prices = melbourne_model.predict(X)
print(mean_absolute_error(y, predicted_home_prices))
“样本内”分数的问题
我们刚刚计算的度量可以称为“样本内”得分。我们使用单个房屋“样本”来构建模型并对其进行评估。这是很糟糕的。
想象一下,在大型房地产市场,门颜色与房价无关。
但是,在用于构建模型的数据样本中,所有带绿色门的房屋都非常昂贵。该模型的工作是找到预测房价的模式,因此它将看到这种模式,它将始终预测绿色房屋的高价格。
由于该模式源自训练数据,因此模型在训练数据中看起来准确。
但是,如果模型看到新数据时这种模式不成立,那么在实际使用时该模型将非常不准确。
由于模型的实用价值来自对新数据的预测,因此我们测量未用于构建模型的数据的性能。最直接的方法是从模型构建过程中排除一些数据,然后使用它们来测试模型对以前没有见过的数据的准确性。该数据称为验证数据。
编码
scikit-learn库有一个函数train_test_split,可以将数据分成两部分。 我们将使用一些数据作为训练数据来拟合模型,我们将使用其他数据作为验证数据来计算mean_absolute_error。
这是代码:
from sklearn.model_selection import train_test_split
# 将数据拆分为训练和验证数据,用于功能和目标
# 拆分基于随机数生成器。 提供数值
# inndom_state参数保证我们每次都得到相同的分割
# 运行此脚本。
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)
# 获得验证数据的预测价格
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
哇!
样本内数据的平均绝对误差约为500美元。 样本外超过250,000美元。
这是几乎完全正确的模型与大多数实际用途无法使用的模型之间的差异。 作为参考,验证数据中的平均房屋价值为110万美元。 因此,新数据中的错误大约是平均房屋价值的四分之一。
有许多方法可以改进此模型,例如尝试查找更好的功能或不同的模型类型。