本文翻譯自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'這些特征可能不足以來預測房價。