本文翻译自 kaggle learn, 也就是 kaggle 官方最快入门 kaggle 竞赛的教程, 强调 python 编程实践和数学思想(而没有涉及数学细节), 笔者在不影响算法和程序理解的基础上删除了一些不必要的废话, 英文有的时候比较啰嗦.
一. 什么是模型验证
模型验证在机器学习当中非常重要, 因为有的时候拟合出来的模型误差非常大而自己却不知道, 就会造成很大的失误. 在 kaggle 竞赛入门 (二) 当中, 我们利用决策树算法已经拟合出来了一个模型, 那么如何去验证这个模型的准确性呢? 那就是使用真实值和预测值的差值的绝对值来进行衡量, 衡量一个点的误差的代码如下:
error=actual−predicted
但是我们的数据集当中有很多的点(数据), 该怎么办呢? 那就是对每一个点都做这样的减法, 然后把所有 error 都加起来求出平均值, 这个方法的简写叫 MAE, 因为它的英语是: Mean Absolute Error(平均绝对值误差). 为了能够计算 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 了, 计算 MAE 的函数是: mean_absolute_value(原始数据集当中的 y , 预测之后的 y), 因此计算它的代码如下:
- from sklearn.metrics import mean_absolute_error
- predicted_home_prices = melbourne_model.predict(X)
- mean_absolute_error(y, predicted_home_prices)
最后输出的结果是:
434.71594577146544
二. 样本内得分
刚刚我们进行计算的是样本内得分, 也就是利用原始的数据集和预测的值进行比较, 而没有将我们的数据集分为训练集和验证集进行测试. 现在我们需要将我们的数据集分成两个集合, 一个是训练集用来训练模型, 一个是验证集, 用于衡量我们模型训练后的准确度如何. 用 sklearn 将数据分类的代码如下:
- 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))
其中的 train_X,train_y 表示的是分类后训练集的样本, val_x 和 val_y 表示的是验证集的样本, 为什么变量叫开头是 val? 因为验证集的英语是 validation data. 我们将数据进行分类的时候完全是随机分配的, 没有任何规律的, 其中的 random_state 随机种子为 0, 也可以为其他数字. 最后这一步之后我们用验证集去输出 MFA, 结果是:
259556.7211103938
这个结果和之前我们之前将所有数据当成训练集训练得到的 MAE 比起来实在是太大了!!! 这是为什么呢? 因为这说明我们之前所用的决策树算法不太好, 或者是给决策树算法选择的特征进行拟合模型时, 预测房价所用到的特征没有选择好, 比如
'Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude'这些特征可能不足以来预测房价.
来源: https://www.cnblogs.com/geeksongs/p/12636385.html