【发布时间】:2019-06-07 04:38:15
【问题描述】:
我正在尝试使用 LabelEncoder 然后使用 OneHotEncoder 将分类值(在我的情况下是国家列)转换为编码值,并且能够转换分类值。但是我收到了警告,例如 OneHotEncoder 'categorical_features' 关键字已弃用“请改用 ColumnTransformer”。那么如何使用 ColumnTransformer 来达到相同的效果呢?
以下是我的输入数据集和我尝试过的代码
Input Data set
Country Age Salary
France 44 72000
Spain 27 48000
Germany 30 54000
Spain 38 61000
Germany 40 67000
France 35 58000
Spain 26 52000
France 48 79000
Germany 50 83000
France 37 67000
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
#X is my dataset variable name
label_encoder = LabelEncoder()
x.iloc[:,0] = label_encoder.fit_transform(x.iloc[:,0]) #LabelEncoder is used to encode the country value
hot_encoder = OneHotEncoder(categorical_features = [0])
x = hot_encoder.fit_transform(x).toarray()
我得到的输出是,如何使用列转换器获得相同的输出
0(fran) 1(ger) 2(spain) 3(age) 4(salary)
1 0 0 44 72000
0 0 1 27 48000
0 1 0 30 54000
0 0 1 38 61000
0 1 0 40 67000
1 0 0 35 58000
0 0 1 36 52000
1 0 0 48 79000
0 1 0 50 83000
1 0 0 37 67000
我尝试了以下代码
from sklearn.compose import ColumnTransformer, make_column_transformer
preprocess = make_column_transformer(
( [0], OneHotEncoder())
)
x = preprocess.fit_transform(x).toarray()
我能够使用上述代码对国家/地区列进行编码,但转换后 x 变量中缺少年龄和薪水列
【问题讨论】:
-
transformer = ColumnTransformer( transformers=[ ("Country", # Just a name OneHotEncoder(), # The transformer class [0] # The column(s) to be applied. ) ], rest ='passthrough' ) X = transformer.fit_transform(X)
-
您的代码/方法中的一些问题/建议: 1. 您不需要标签编码器(理想情况下,它用于响应变量)。参考:stackoverflow.com/a/63822728/5114585 2. 可以直接使用 One Hot Encoder [待续..]
-
3.对于这些数据,您也可以直接选择分类列,但要自动对所有分类列应用 OHE,您可以使用 ColumnTransformer() 或 make_column_transfer [它们略有不同。 ColumnTransformer需要步骤的命名,make_column_transformer不需要] 4. 为column Transformer选择分类变量可以通过使用列名、索引、数据类型等多种方式完成[参考sklearn文档了解更多]
标签: python scikit-learn