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