Kaggle競賽入門(三):用Python處理過擬合和欠擬合,得到最佳模型


本文翻譯自kaggle learn,也就是kaggle官方最快入門kaggle競賽的教程,強調python編程實踐和數學思想(而沒有涉及數學細節),筆者在不影響算法和程序理解的基礎上刪除了一些不必要的廢話,畢竟英文有的時候比較啰嗦。

一.什么是過擬合和欠擬合?

過擬合的含義就是當前模型十分符合訓練集,十分精確,用這個模型去預測目前的訓練集殘差非常小,也可以說真實值減去預測值的大小的平均值非常小,但是用這個模型去預測新的數據誤差就非常大了,因為這個模型僅適合當前的訓練集。什么是欠擬合呢?欠擬合也就正好和過擬合相反,也就是當前模型不太和訓練集想符合,我們如何找到一個既不過擬合也不欠擬合的模型呢?

下面這幅圖非常直觀,表示了哪一個點是最佳點,能夠得到我們最佳的模型:

 

 

 這張圖的橫坐標是Tree Depth,可以理解為我們模型符合訓練集的程度,藍色線條代表訓練集的Error,也就是平均誤差,紅色線條代表驗證集的平均誤差。可以看到中間這條灰色的感嘆號線這里驗證集的平均誤差是最小的,我們最終擬合出來的模型是為了能夠讓新的數據在這個模型上表現更好,而不是讓訓練集,因此紅色線得到的最小值就是我們的最好模型所在點。模型越符合訓練集,那么訓練集的平均誤差就會越來越小,反之,驗證集則會先減小后增大,因為模型最開始欠擬合,超過一定限度就是過擬合了,這也比較符合邏輯。那么我們如何用代碼來選取在驗證集最小處的最佳模型呢?

二.例子

我們用決策樹算法作為一個例子,在擬合決策樹模型時,里面有一個參數叫做max_leaf_nodes,也就是決策樹當中的最大樹葉的深度,它能夠很好的對過擬合和欠擬合進行控制,這個參數越大那么模型就越符合訓練集。這個參數就是上圖當中的Tree dapth,我們可以寫一個函數來返回平均誤差的值,代碼如下:

from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor

def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
    model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
    model.fit(train_X, train_y)
    preds_val = model.predict(val_X)
    mae = mean_absolute_error(val_y, preds_val)
    return(mae)

這樣就得到了決策樹算法的平均誤差,之后將我們的數據分解得到訓練集和驗證集:

# Data Loading Code Runs At This Point
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 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.model_selection import train_test_split

# split data into training and validation data, for both features and target
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)

我們最后可以用一個循環來比較不同max_leaf_nodes下模型的准確度,代碼如下:

# compare MAE with differing values of max_leaf_nodes
for max_leaf_nodes in [5, 50, 500, 5000]:
    my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
    print("Max leaf nodes: %d  \t\t Mean Absolute Error:  %d" %(max_leaf_nodes, my_mae))

輸出:

Max leaf nodes: 5           Mean Absolute Error:  347380
Max leaf nodes: 50           Mean Absolute Error:  258171
Max leaf nodes: 500           Mean Absolute Error:  243495
Max leaf nodes: 5000           Mean Absolute Error:  254983

因此可見,當max_leaf_nodes等於500的時候,模型最准確,誤差最小。當然我們這里僅選取了四個值,實際上需要遍歷所有的值才能夠得到最小的值,這里方便大家理解就只遍歷這幾個值了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM