模型验证——机器学习4/7
评价你的模型运行情况,然后你就可以测试并比较其他代替的模型了
你已经建立了一个模型了,但是他有多好呢?
这节课,你将学习模型验证的相关知识,来评价你的模型。评价模型质量是你的模型迭代更新提升质量的关键
什么是模型验证
- 你想评价你训练的所有模型。在大多数(不是全部)应用中,有关模型质量的参数是预测的准确性。也就是说,模型预测的结果是否与实际情况相符合。
- 许多人在衡量预测准确性时总会犯巨大的错误,他们使用训练数据来做预测,然后和训练数据中的目标值进行比较。你一会儿会看到这个方法引出的问题和解决方案,我们先想想我们是怎么做的:
- 你首先需要将模型质量总结成一个能理解的方式。如果你将10,000预测的结果和真实值比较,你会发现里面的预测有好有坏。将10,000条结果从头到尾看下来是没有意义的。我么们需要将他们总结成单一的指标。
- 有许多指标都可以作为衡量模型质量的标准,我们首先总一个叫 平均绝对误差 (MAE)的指标开始。我们将这个指标拆分理解,首先是 误差:
- 预测的误差可以表示为
error=actual−predicted
-
所以,如果真实房价为 $150,000 而你的估计是 $100,000,那么误差等于 $50,000。
-
MAE标准就是说,我们将所有值的误差取绝对值,这样误差就是正数,然后我们随误差取平均。这就可以评估我们模型的质量了。简单来说就是:
我们的预测偏离真真实值的平均值
-
要算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)
- 一旦我们有了模型,我们就可以这样计算平均绝对误差:
from sklearn.metrics import mean_absolute_error
predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
434.71594577146544
“样本内”评估的问题
- 我们刚刚计算的可以被称为“样本内”评估。我们仅使用了一个样本完成了训练和评价两个任务。他的问题出在这里:
- 想象一下,在大型房地产市场上,门的颜色时域房价无关的。
- 但是在你训练模型的样本中,所有绿色门的房子都很贵。模型的工作就是找到数字中的规律,所以他发现了这一规律,然后它总时=是为绿色门的房子估高价。
- 既然这个规律从这个数据集中训练的,那么这个模型就会对这个数据集的测试总显示准确。
- 但是如果这一规律在别的数据集中站不住脚,那这个模型在实际使用时就会不准确。
- 既然模型的测试值要来自一个新的数据集,一个不是训练模型的数据集。最直接的方式就是在模型训练是排除一些数据,再用这些没见过的数据做准确性测试。这些测试的数据称 验证集。
编码
- 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
# random_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)
# get predicted prices on validation data
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
哇哦!
- 你的样本内平均绝对误差只有不到500,而样本外误差竟然超过了250,000
- 这样的差异对于一个模型来说就差不多,这个模型对于几乎所有的实际应用都是不稳定的。在这个例子里,验证集中的平均房价是11万。所以误差是平均房价的1/4
- 提升模型质量的方法有很多,例如实施更好的特征集,或使用不同的模型类型。