官术网_书友最值得收藏!

2.7 微調模型

假設你現在有一份有前途的模型的候選名單。你現在需要微調它們。讓我們看一下可以做到這一點的幾種方法。

2.7.1 網格搜索

一種選擇是手動調整超參數,直到找到超參數值的最佳組合。這將是一項非常乏味的工作,你可能沒有時間來探索許多組合。

相反,你可以使用Scikit-Learn的GridSearchCV類來為你做搜索。你需要做的就是告訴它你希望實驗哪些超參數以及要嘗試哪些值,它會使用交叉驗證來評估所有可能的超參數值的組合。例如,以下代碼搜索RandomForestRegressor的超參數值的最佳組合:

請注意,你可以引用流水線中的任何估計器的任何超參數,即使該估計器嵌套在多個流水線和列轉換器的深處。例如,當Scikit-Learn看到"preprocessing__geo__n_clusters"時,它會在雙下劃線處拆分此字符串,然后在流水線中查找名為"preprocessing"的估計器并找到預處理ColumnTransformer。接下來,它在此ColumnTransformer中查找名為"geo"的轉換器,并找到我們在緯度和經度屬性上使用的ClusterSimilarity轉換器。然后它找到這個轉換器的n_clusters超參數。同樣,random_forest__max_features指的是max_features名為"random_forest"的估計器的超參數,當然是RandomForest模型(max_features超參數將在第7章解釋)。

Scikit-Learn流水線中包裝預處理步驟允許你調整預處理超參數以及模型超參數。這是一件好事,因為它們經常交互。例如,增加n_clusters可能也需要增加max_features。如果擬合流水線轉換器的計算成本很高,你可以將流水線的memory超參數設置為緩存目錄的路徑:當你首次擬合流水線時,Scikit-Learn會將擬合的轉換器保存到該目錄中。如果你隨后使用相同的超參數再次擬合流水線,Scikit-Learn將只加載緩存的轉換器。

這個param_grid中有兩個字典,所以GridSearchCV將首先評估第一個字典中指定的n_clustersmax_features超參數值的所有3×3=9種組合,然后它將嘗試第二個字典中所有2×3=6種超參數值的組合。所以總共網格搜索將探索9+6=15種超參數值的組合,并且它將對每個組合訓練流水線3次,因為我們使用的是3折交叉驗證。這意味著總共會有15×3=45輪訓練!這可能需要一段時間,但完成后你可以獲得最佳的參數組合,如下所示:

在本例中,將n_clusters設置為15并將max_features設置為8能得到最佳模型。

由于15是為n_clusters評估的最大值,你可能應該嘗試使用更高的值再次搜索;分數可能會繼續提高。

你可以使用grid_search.best_estimator_來訪問最佳估計器。如果GridSearchCV使用refit=True(默認設置)做初始化,那么一旦它使用交叉驗證找到了最佳估計器,就會在整個訓練集上重新訓練它。這通常是個好主意,因為提供更多的數據可能會提高其性能。

評估分數可使用grid_search.cv_results_來獲得。這是一個字典,但是如果你將它包裝在一個DataFrame中,你會得到一個很好的列表,其中包含每個超參數組合和每個交叉驗證拆分的所有測試分數,以及所有拆分的平均測試分數:

最佳模型的平均測試RMSE分數為44 042,這比你之前使用的默認超參數值(47 019)的分數要好。恭喜,你已成功地微調了最佳模型!

2.7.2 隨機搜索

當你探索相對較少的組合時,網格搜索方法很好,就像在前面的示例中一樣,但RandomizedSearchCV通常更可取,尤其是當超參數搜索空間很大時。這個類的使用方式與GridSearchCV類大致相同,但它不是嘗試所有可能的組合,而是評估固定數量的組合,在每次迭代中為每個超參數選擇一個隨機值。這聽起來可能令人驚訝,但這種方法有幾個好處:

· 如果你的一些超參數是連續的(或離散的,但有許多可能的值),并且你讓隨機搜索運行1000次迭代,那么它會為每個超參數探索1000個不同的值,而網格搜索只會探索你列出的很少幾個值。

· 假設一個超參數實際上并沒有太大的區別,但你還不知道。如果它有10個可能的值并將其添加到網格搜索中,則訓練時間將延長10倍。但是,如果將其添加到隨機搜索中,則不會有任何區別。

· 如果有6個超參數需要探索,每個都有10個可能的值,那么網格搜索除了訓練模型一百萬次之外別無選擇,而隨機搜索總是可以運行你選擇的任意次數的迭代。

對于每個超參數,你必須提供可能的值列表或概率分布:

Scikit-Learn也有HalvingRandomSearchCVHalvingGridSearchCV超參數搜索類。它們的目標是更有效地使用計算資源,來更快地訓練或探索更大的超參數空間。它們的工作原理如下:在第一輪中,使用網格方法或隨機方法生成許多超參數組合(稱為“候選”)。然后像往常一樣使用這些候選來訓練使用交叉驗證進行評估的模型。然而,訓練使用的資源有限,這大大加快了第一輪的速度。默認情況下,“資源有限”意味著模型是在一小部分訓練集上訓練的。然而,其他限制也是有可能的,如果模型有超參數來設置它,則減少訓練迭代次數。一旦對每個候選都進行了評估,只有最好的候選才能進入第二輪,在那里它們將獲得更多的資源。經過幾輪之后,將使用全部資源對最終候選進行評估。這可能會為你節省一些調整超參數的時間。

2.7.3 集成方法

微調系統的另一種方法是嘗試性能最佳的模型組合。該組合(或“集成”)通常會比最好的單個模型表現更好——就像隨機森林比它們所依賴的單棵決策樹表現更好一樣——尤其是當單個模型犯了不同類型的錯誤時。例如,你可以訓練和微調k近鄰模型,然后創建一個僅預測隨機森林預測的均值和該模型的預測的集成模型。我們將在第7章中更詳細地討論這個主題。

2.7.4 分析最佳模型及其錯誤

通過檢查最佳模型,你通常會得到對問題的深刻見解。例如,RandomForestRegressor可以表明每個屬性對于做出準確預測的相對重要性:

讓我們對這些重要性分數進行降序排序,并將它們顯示在相應的屬性名稱旁邊:

有了這些信息,你可能想嘗試刪除一些不太有用的特征(例如,顯然只有一個ocean_proximity類別真正有用,因此你可以嘗試刪除其他類別)。

sklearn.feature_selection.SelectFromModel轉換器可以自動為你刪除最無用的特征:當你擬合它時,它會訓練一個模型(通常是隨機森林),查看它的feature_importances_屬性,然后選擇最有用的特征。然后,當你調用transform()時,它會丟棄其他特征。

你還應該查看系統產生的特定錯誤,然后嘗試理解產生這些錯誤的原因以及可以解決問題的方法:添加額外的特征或刪除無信息的特征、清洗異常值等。

現在也是確保你的模型不僅在平均水平上運行良好,而且在所有類別的地區(無論是農村還是城市、富裕地區還是貧困地區、北方還是南方、少數民族與否等)的好時機。為每個類別創建驗證集的子集需要一些工作,但這很重要:如果你的模型在整個地區類別上表現不佳,那么在問題可能解決之前不應該部署它,或者至少不應該使用它對該類別做出預測,因為它可能弊大于利。

2.7.5 在測試集上評估系統

調整模型一段時間后,你最終擁有了一個性能足夠好的系統。你已準備好在測試集上評估最終模型。這個過程沒有什么特別的,只需從測試集中獲取預測器和標簽并運行final_model來轉換數據并進行預測,然后評估這些預測:

在某些情況下,這樣的泛化誤差點估計不足以說服你啟動模型:如果它只比當前生產環境的模型好0.1%怎么辦?你可能想知道這個估計的精確度。為此,你可以使用scipy.stats.t.interval()來計算泛化誤差的95%置信區間。你得到一個相當大的區間,從39 275到43 467,而你之前的點估計值41 424大致在它的中間:

如果你做了很多超參數調整,性能通常會比你使用交叉驗證測量的性能稍差。這是因為你的系統最終會經過微調在驗證數據集上表現良好,而在未知數據集上可能表現不佳。在這個例子中情況并非如此,因為測試RMSE低于驗證RMSE,但是當它發生時,你必須抵制調整超參數來使數字在測試集上看起來不錯的誘惑,這些改進不太可能泛化到新數據。

現在是項目啟動前的階段:你需要展示你的解決方案(突出展示你學到了什么、哪些有效、哪些無效、做出了哪些假設,以及你的系統的局限性)、記錄所有內容,并創建漂亮的演示文稿與清晰的可視化和易于記憶的陳述(例如,“收入中位數是房價的首要預測指標”)。在這個加州的房屋示例中,系統的最終性能并不比專家的價格估計好多少,專家的價格估計通常要低30%,但啟動它仍然可能是一個好主意,特別是如果這可以為專家節省一些時間,那么他們就可以從事更有趣、更有成效的任務。

主站蜘蛛池模板: 白银市| 莫力| 彭山县| 肥乡县| 汨罗市| 通许县| 湟源县| 集贤县| 梅河口市| 许昌市| 包头市| 惠来县| 洱源县| 绥中县| 吉首市| 富宁县| 沅江市| 柞水县| 十堰市| 赣州市| 洛宁县| 同江市| 修水县| 永顺县| 永昌县| 阿克陶县| 中江县| 娱乐| 隆德县| 长乐市| 称多县| 定日县| 林州市| 自贡市| 亚东县| 阳曲县| 平和县| 邵东县| 潍坊市| 楚雄市| 大同县|