1. 程式人生 > >Kaggle競賽入門(二):如何驗證機器學習模型

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'這些特徵可能不足以來預測房價。