簡體   English   中英

如何在 Sklearn Pipeline 中進行 Onehotencoding

[英]How to do Onehotencoding in Sklearn Pipeline

我正在嘗試對我的 Pandas dataframe 的分類變量進行 oneHotEncode,其中包括分類變量和連續變量。 我意識到這可以通過 pandas.get_dummies() function 輕松完成,但我需要使用管道以便稍后生成 PMML 文件。

這是創建映射器的代碼。 我想要編碼的分類變量存儲在一個名為“dummies”的列表中。

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())])

當我現在嘗試擬合時(“特征”是一個 dataframe,“目標”是一個系列),它給出了一個錯誤“無法將字符串轉換為浮點數”。

lm.fit(features, targets)

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

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

另一種方法是將LabelEncoder與第二個OneHotEncoder步驟一起使用。

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

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

LabelEncoderLabelBinarizer用於對數據的目標(標簽)進行編碼/二值化,即y向量。 當然,它們或多或少與OneHotEncoder做的事情相同,主要區別在於 Label 預處理步驟不接受矩陣,僅接受一維向量。

example = pd.DataFrame({'x':np.arange(2,14,2),
                        'cat1':['A','B','A','B','C','A'],
                        'cat2':['p','q','w','p','q','w']})
dummies = ['cat1', 'cat2']
    x cat1 cat2
0   2    A    p
1   4    B    q
2   6    A    w
3   8    B    p
4  10    C    q
5  12    A    w

例如, LabelEncoder().fit_transform(example['cat1'])有效,但LabelEncoder().fit_transform(example[dummies])拋出ValueError異常。

相反, OneHotEncoder接受多列:

from sklearn.preprocessing import OneHotEncoder

OneHotEncoder().fit_transform(example[dummies])
<6x6 sparse matrix of type '<class 'numpy.float64'>'
        with 12 stored elements in Compressed Sparse Row format>

可以使用ColumnTransformer將其合並到管道中,傳遞(或應用不同的轉換)其他列:

from sklearn.compose import ColumnTransformer

ct = ColumnTransformer([('encode_cats', OneHotEncoder(), dummies),],
                       remainder='passthrough')      
pd.DataFrame(ct.fit_transform(example), columns = ct.get_feature_names_out())
   encode_cats__cat1_A  encode_cats__cat1_B  ...  encode_cats__cat2_w  remainder__x
0                  1.0                  0.0  ...                  0.0           2.0
1                  0.0                  1.0  ...                  0.0           4.0
2                  1.0                  0.0  ...                  1.0           6.0
3                  0.0                  1.0  ...                  0.0           8.0
4                  0.0                  0.0  ...                  0.0          10.0
5                  1.0                  0.0  ...                  1.0          12.0

最后,將其放入管道中:

from sklearn.pipeline import Pipeline
Pipeline([('preprocessing', ct),
          ('regressor', LinearRegression())])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM