Kaggle竞赛入门(二):如何验证机器学习模型
本文翻译自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'这些特征可能不足以来预测房价。