sklearn预处理转化流水线
文章目錄
- 多個預處理步驟
- 同時處理數字和分類屬性
多個預處理步驟
正如你所見,許多數據轉換的步驟需要以正確的順序來執行。而ScikitLearn正好提供了Pipeline類來支持這樣的轉換。
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScalernum_pipeline = Pipeline([('imputer', SimpleImputer(strategy='median')),('std_scaler', StandardScaler()), ]) housing_num_tr = num_pipeline.fit_transform(housing_num)Pipeline構造函數會通過一系列名稱/估算器的配對來定義步驟序列。除了最后一個是估算器之外,前面都必須是轉換器(也就是說,必須有fit_transform()方法)。至于命名可以隨意,你喜歡就好(只要它們是獨一無二的,不含雙下劃線),它們稍后在超參數調整中會有用。
當調用流水線的fit()方法時,會在所有轉換器上按照順序依次調用fit_transform(),將一個調用的輸出作為參數傳遞給下一個調用方法,直到傳遞到最終的估算器,則只會調用fit()方法。
流水線的方法與最終的估算器的方法相同。在本例中,最后一個估算器是StandardScaler,這是一個轉換器,因此流水線有一個transform()方法,可以按順序將所有的轉換應用到數據中(這也是我們用過的fit_transform()方法)。
同時處理數字和分類屬性
到目前為止,我們分別處理了類別列和數值列。擁有一個能夠處理所有列的轉換器會更方便,將適當的轉換應用于每個列。在0.20版中,ScikitLearn為此引入了ColumnTransformer,好消息是它與pandasDataFrames一起使用時效果很好。讓我們用它來將所有轉換應用到房屋數據
from sklearn.compose import ColumnTransformer num_attribs=list(housing_num)cat_attribs=["ocean_proximity"] full_pipeline=ColumnTransformer([("num",num_pipeline,num_attribs),("cat",OneHotEncoder(),cat_attribs), ])housing_prepared=full_pipeline.fit_transform(housing)首先導入ColumnTransformer類,接下來獲得數值列名稱列表和類別列名稱列表,然后構造一個ColumnTransformer。構造函數需要一個元組列表,其中每個元組都包含一個名字、一個轉換器,以及一個該轉換器能夠應用的列名字(或索引)的列表。在此示例中,我們指定數值列使用之前定義的num_pipeline進行轉換,類別列使用OneHotEncoder進行轉換。最后,我們將ColumnTransformer應用到房屋數據:它將每個轉換器應用于適當的列,并沿第二個軸合并輸出(轉換器必須返回相同數量的行)。
請注意,OneHotEncoder返回一個稀疏矩陣,而num_pipeline返回一個密集矩陣。當稀疏矩陣和密集矩陣混合在一起時,ColumnTransformer會估算最終矩陣的密度(即單元格的非零比率),如果密度低于給定的閾值,則返回一個稀疏矩陣(通過默認值為sparse_threshold=0.3)。在此示例中,它返回一個密集矩陣。我們有一個預處理流水線,該流水線可以獲取全部房屋數據并對每一列進行適當的轉換。
總結
以上是生活随笔為你收集整理的sklearn预处理转化流水线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数值分箱与one-hot
- 下一篇: sklearn的基本用法:分类与回归