當您看到本文標題時,不禁感嘆,總算是到了
訓練模型
這一節(jié)了。是啊,在之前的文章中,我們對數據進行了探索,以及對一個訓練集和一個測試集進行了采樣,也編寫了一個
預處理
管道來自動清理,準備您的數據用于機器學習
算法,然而現在,我們可以選擇并訓練模型了。
訓練集的訓練與評估
我們從一個最基本的線性回歸模型
開始:
from sklearn.linear_model import LinearRegression
lin_reg = make_pipeline(preprocessing, LinearRegression())
lin_reg.fit(housing, housing_labels)
很好,至此,我們現在算是有了一個有效的線性回歸模型
,可以在訓練集上試用它,查看前五個預測,并將它們與標簽進行比較::
第一個預測偏差很大(超過200,000美元!),而其他預測則更好,兩個預測偏差約25%,還有兩個預測
偏差不到10%。請記住,您選擇使用RMSE
作為性能測度,因此您希望使用Scikit-Learn
的mean_squared_error()
函數在整個訓練集上測量該回歸模型的RMSE
,并將平方參數設置為False
。
這總比沒有好,但顯然不是一個很好的分數,大多數地區(qū)的房屋價值中位數在120,000美元和26.5萬美元之間,所以一個典型的68628美元的預測誤差真的不是很令人滿意。這是一個模型擬合訓練數據不足的示例。當這種情況發(fā)生時,可能意味著這些特征沒有提供足夠的信息來做出好的預測,或者模型不夠強大。
正如我們在上一章中看到的,修復欠擬合的主要方法是選擇一個更強大的模型,為訓練算法提供更好的特征,或者減少對模型的約束。這個模型沒有正規(guī)化,這就排除了最后一個選項。您可以嘗試添加更多功能,但首先您要嘗試更復雜的模型,看看它是如何工作的。
您決定嘗試DecisionTreeRegressor
,因為這是一個相當強大的模型,能夠在數據中找到復雜的非線性關系(后續(xù)篇章將更詳細地介紹決策樹
):
from sklearn.tree import DecisionTreeRegressor
tree_reg = make_pipeline(preprocessing, DecisionTreeRegressor(random_state=42))
tree_reg.fit(housing, housing_labels)
現在模型已訓練完畢,您可以在訓練集中對其進行評估:
等等,難道這個模型真的很完美嗎?當然咯,更有可能的是模型嚴重地過度擬合了數據。您怎么能確定正如你前面看到的,在您準備好啟動一個您有信心的模型之前,您不想碰測試集
,所以您需要使用一部分訓練集
進行訓練,另一部分用于模型驗證。
使用交叉驗證進行更好的評估
評估決策樹
模型的一種方法是使用train_test_split()
函數將訓練集拆分為較小的訓練集和驗證集,然后針對較小的訓練集訓練您的模型,并針對驗證集對其進行評估。這是一點努力,但沒有太難,它會工作得相當不錯。
一個很好的替代方法是使用Scikit-Learn
的k_-fold
交叉驗證特性。下面的代碼隨機地將訓練集分成10個不重疊的子集,稱為fold
,然后訓練和評估決策樹
模型10次,每次選擇不同的fold
進行評估,并使用其他9個fold進行訓練。結果是一個包含10個評價分數的數組:
from sklearn.model_selection import cross_val_score
tree_rmses = -cross_val_score(tree_reg, housing, housing_labels,
scoring="neg_root_mean_squared_error", cv=10)
警告:
Scikit-Learn
的交叉驗證功能期望的是效用函數(越大越好)而不是成本函數(越低越好),所以評分函數實際上是RMSE的反面。它是一個負值,所以您需要切換輸出的符號來獲得RMSE分
數。
讓我們來看看結果吧:
現在決策樹
看起來不像以前那么好了。事實上,它的表現幾乎和線性回歸模型
一樣差!請注意,交叉驗證
不僅允許您獲得模型性能的估計值,還允許您測量該估計值的精確度(即其標準差)。決策樹的均方根誤差約為66,868,標準差約為2,061。如果只使用一個驗證集,則不會有此信息。但是交叉驗證是以多次訓練模型為代價的,所以它并不總是可行的。
如果您為線性回歸模型計算相同的度量,您將發(fā)現平均RMSE為69,858,標準差為4,182。因此,決策樹模型的性能似乎比線性模型稍微好一點,但由于嚴重的過擬合,差異很小。我們知道存在過擬合
問題,因為訓練誤差很低(實際上為零),而驗證誤差很高。
現在讓我們嘗試最后一個模型:隨機森林調節(jié)器,隨機森林的工作原理是在特征的隨機子集上訓練許多決策樹,然后平均出它們的預測值。這樣的模型組成的許多其他模型被稱為合奏:他們能夠提高性能基礎模型(在本例中為決策樹)。代碼與前面的代碼大同小異:
from sklearn.ensemble import RandomForestRegressor
forest_reg = make_pipeline(preprocessing,
RandomForestRegressor(random_state=42))
forest_rmses = -cross_val_score(forest_reg, housing, housing_labels,
scoring="neg_root_mean_squared_error", cv=10)
文章來源:http://www.zghlxwxcb.cn/news/detail-799445.html
隨機森林真的看起來非常有前途的任務!但是,如果您訓練一個RandomFores
t并測量訓練集
上的RMSE
,您將發(fā)現大約17,474:這要低得多,這意味著仍然存在大量的過度擬合。可能的解決方案是
簡化模型,約束它(即,規(guī)則化它),或得到更多的訓練數據。但是,在深入研究隨機森林之前,您應該嘗試來自各種類別機器學習算法的許多其他模型(例如,具有不同內核的多個支持向量機,可能還有一個神經網絡),而無需花費太多時間調整超參數。目標是列出幾個(兩到五個)有前途的模型。文章來源地址http://www.zghlxwxcb.cn/news/detail-799445.html
到了這里,關于選擇和訓練模型(Machine Learning 研習之十一)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!