- 機器學習實戰:基于Scikit-Learn、Keras和TensorFlow(原書第3版)
- (法)奧雷利安·杰龍
- 1687字
- 2024-09-11 17:33:04
2.6 選擇和訓練模型
最后!你構建了問題、獲取了數據并對其進行了探索、對訓練集和測試集進行了采樣,還編寫了預處理流水線來自動清洗數據并為機器學習算法準備了數據。現在是時候選擇和訓練機器學習模型了。
2.6.1 在訓練集上訓練和評估
好消息是,多虧了之前的所有這些步驟,現在一切都變得很簡單了!你決定開始訓練一個非常基本的線性回歸模型:

完畢!你現在有了一個有效的線性回歸模型。你在訓練集上進行嘗試,查看前五個預測值并將它們與標簽進行比較:

好吧,它能正常工作,但并非總是如此。第一個預測相差甚遠(超過200 000美元!),而其他預測則更好:后兩個相差約25%,最后兩個相差不到10%。請記住,你選擇使用了RMSE作為性能度量,所以你想使用Scikit-Learn的mean_squared_error()函數測量此回歸模型在整個訓練集上的RMSE,將squared參數設置為False:

這總比沒有好,但顯然不是一個很好的分數:大多數地區的median_housing_values在120 000~265 000美元之間,因此68 628美元的典型預測誤差確實不是很令人滿意。這是模型欠擬合訓練數據的樣例。發生這種情況時,可能意味著這些特征沒有提供足夠的信息來做出良好的預測,或者模型不夠強大。正如我們在第1章中看到的,解決欠擬合的主要方法是選擇更強大的模型,為訓練算法提供更好的特征,或者減少對模型的約束。該模型未正則化,這排除了最后一個選項。你可以嘗試添加更多特征,但首先你想嘗試一個更復雜的模型,看看它是如何工作的。
你決定嘗試DecisionTreeRegressor,因為這是一個相當強大的模型,能夠在數據中發現復雜的非線性關系(決策樹在第6章中有更詳細的介紹):

現在模型已經訓練完畢,你可以在訓練集上對其進行評估:

等等,什么!一點錯誤都沒有?這個模型真的可以完美無缺嗎?當然,更有可能的是模型對數據嚴重過擬合了。你怎么能確定?正如你之前看到的,在準備好啟動你有信心的模型之前,不要接觸測試集,因此你需要使用一部分訓練集進行訓練,另一部分用于模型驗證。
2.6.2 使用交叉驗證進行更好的評估
評估決策樹模型的一種方法是使用train_test_split()函數將訓練集拆分為較小的訓練集和驗證集,然后針對較小的訓練集訓練你的模型并針對驗證集對其進行評估。這需要一些努力,但不會太困難,而且效果會很好。
一個很好的替代方法是使用Scikit-Learn的k折交叉驗證功能。以下代碼將訓練集隨機拆分為10個不重疊的子集,稱為折疊,然后對決策樹模型進行10次訓練和評估,每次選擇不同的折疊進行評估,并使用其他9次折疊進行訓練。結果是一個包含10個評估分數的數組:

Scikit-Learn的交叉驗證功能期望效用函數(越大越好)而不是代價函數(越低越好),因此評分函數實際上與RMSE相反。這是一個負值,因此你需要切換輸出的符號來獲得RMSE分數。
讓我們看看結果:

現在決策樹看起來不像之前那么好了。事實上,它的表現似乎與線性回歸模型幾乎一樣差!請注意,交叉驗證不僅可以讓你獲得模型性能的估計值,還可以測量該估計值的精確程度(即標準差)。決策樹的RMSE約為66 868,標準差約為2061。如果你只使用一個驗證集,你就不會獲得此信息。但是交叉驗證是以多次訓練模型為代價的,所以它并不總是可行的。
如果你為線性回歸模型計算相同的指標,你會發現平均RMSE為69 858,標準差為4182。所以決策樹模型的表現似乎比線性模型稍微好一點,但由于嚴重的過擬合,兩種模型差異很小。我們知道存在過擬合問題,因為訓練誤差很低(實際上為零)而驗證誤差很高。
現在讓我們嘗試最后一個模型:RandomForestRegressor。正如你將在第7章中看到的那樣,隨機森林的工作原理是在特征的隨機子集上訓練許多決策樹,然后對它們的預測進行平均。由許多其他模型組成的此類模型稱為集成:它們能夠提高基礎模型(在本例中為決策樹)的性能。代碼與之前的代碼大致相同:

讓我們看看分數:

哇,這好多了:隨機森林看起來非常適合這項任務!但是,如果你訓練RandomForest并在訓練集上測量RMSE,你會發現RMSE大約為17 474:這要低得多,這意味著仍然存在相當多的過擬合。可能的解決方案是簡化模型、對其進行約束(即對其進行正則化),或者獲取更多的訓練數據。然而,在你更深入地研究隨機森林之前,你應該嘗試來自不同類別機器學習算法的許多其他模型(例如,幾個具有不同內核的支持向量機,可能還有一個神經網絡),而不要花太多時間調整超參數。目標是選擇一些(2~5個)有前途的模型。