sklearn中的Pipeline

快到皖裡來發表於2021-02-19

在使用sklean處理一個機器學習例項時,可能會經過資料縮放、特徵合併以及模型學習擬合等過程;並且,當問題更為複雜時,所應用到的演算法以及模型則較為繁雜。

與此同時,經過實踐發現,在忽略一些細節的前提下,可以通過將這些資料處理步驟結合成一條演算法鏈,以更加高效地完成整個機器學習流程;由此,管道(pipeline)概念與機制應運而生。

pipeline概念

所謂管道,即由一系列資料轉換步驟或待擬合模型(如果有,則模型必須處於管道末端)構成的加工鏈條。
下面以例項釋之:

未使用管道(pipeline)前

從上圖小例項中可以看出,程式中著重有兩個資料處理流程,一個是資料縮放MinMaxScaler(),另一個是模型擬合svm.fit(X_train_scaled, y_train),並且兩個步驟具有明顯的先後順序,還是分開操作。

使用管道(pipeline)後

從上圖中可以看出,程式將之前的兩個步驟結合到一個管道(pipe)中,此後只需將訓練資料與測試資料流經管道,則相應的資料轉換和模型擬合與應用流程會更加高效且簡潔地完成。

為什麼使用管道

可能有同學指出,管道只是能簡化程式碼,但也不是缺其不可。實際上,管道的作用不僅在於簡化程式碼,更在於一些關鍵的資料轉換步驟需要管道機制加持,比如交叉驗證

看下圖,是使用傳統處理流程進行交叉驗證的圖示;
可以看到,在圖的上半部分表示交叉驗證區域中,進行資料縮放處理時,同時用到了訓練資料與驗證資料,但是這是不符合要求的;
即使是驗證資料的縮放,也要使用經訓練資料擬合過後的MinMaxScaler(),而驗證資料本身不應該參與到MinMaxScaler()擬閤中,這樣會洩露驗證資料包含的資訊,從而導致驗證結果偏離實際。

所以,符合要求的交叉驗證圖示應類似於下圖

如果要手動實現上述劃分是異常麻煩的,因為需要人工干預每一次的交叉驗證操作;但如果用到pipeline,則實現的程式碼非常簡潔,只不過把網格搜尋的估計器置換成構建的管道(pipe),部分關鍵程式碼如下圖:

可以看到,在pipeline的加持下,機器學習的步驟更加清晰明瞭,並且所實現的功能越來越多。

相關文章