2017-02-13 113 views
4

我在嘗試oneHot對我的Pandas數據框的分類變量進行編碼,其中包括分類變量和連續變量。我意識到這可以通過使用熊貓.get_dummies()函數輕鬆完成,但我需要使用管道,以便稍後可以生成PMML文件。如何在Sklearn管道中執行Onehotencoding

這是創建映射器的代碼。我想編碼的分類變量存儲在名爲「傻瓜」的列表中。

from sklearn_pandas import DataFrameMapper 
from sklearn.preprocessing import OneHotEncoder 
from sklearn.preprocessing import LabelEncoder 

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies] + 
    [(d, OneHotEncoder()) for d in dummies] 
) 

而這是創建一個管道,包括映射器和線性迴歸的代碼。

from sklearn2pmml import PMMLPipeline 
from sklearn.linear_model import LinearRegression 

lm = PMMLPipeline([("mapper", mapper), 
        ("regressor", LinearRegression())]) 

當我現在儘量合身(與「功能」是一個數據幀,而「目標」系列),它提供了一個錯誤「無法字符串轉換爲浮動」。

lm.fit(features, targets) 

任何人誰可以幫我嗎?我非常渴望工作管道,包括數據的預處理......預先感謝!

回答

6

OneHotEncoder不支持字符串功能,並且使用[(d, OneHotEncoder()) for d in dummies]將其應用於所有虛擬列。使用LabelBinarizer代替:

mapper = DataFrameMapper(
    [(d, LabelBinarizer()) for d in dummies] 
) 

另一種方法是用一個第二OneHotEncoder步驟中使用的LabelEncoder

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies] 
) 

lm = PMMLPipeline([("mapper", mapper), 
        ("onehot" OnehotEncoder()), 
        ("regressor", LinearRegression())]) 
+0

非常感謝你,labelbinarizer爲我工作。我確實認爲,我現在只保留我單獨編碼的分類特徵。有沒有辦法包含原始連續功能? –

+0

是的,在'DataFrameMapper'中用'None'作爲變換器列出它們。 – dukebody