![](/img/trans.png)
[英]How to perform OneHotEncoding in Sklearn, getting value error
[英]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())])
LabelEncoder
和LabelBinarizer
用於對數據的目標(標簽)進行編碼/二值化,即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.