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