sklearn中的pipeline

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

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

pipeline概念

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

未使用管道(pipeline)前

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

使用管道(pipeline)後

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

為什麼使用管道

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

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

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

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

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