OneHotEncoder categorical_features已贬值,如何转换特定列

Has*_*aan 4 python machine-learning one-hot-encoding

我需要将独立字段从字符串转换为算术符号。我正在使用OneHotEncoder进行转换。我的数据集有许多独立的列,其中一些是:

Country     |    Age       
--------------------------
Germany     |    23
Spain       |    25
Germany     |    24
Italy       |    30 
Run Code Online (Sandbox Code Playgroud)

我必须像编码国家列

0     |    1     |     2     |       3
--------------------------------------
1     |    0     |     0     |      23
0     |    1     |     0     |      25
1     |    0     |     0     |      24 
0     |    0     |     1     |      30
Run Code Online (Sandbox Code Playgroud)

我通过使用OneHotEncoder成功获得了欲望的转化

#Encoding the categorical data
from sklearn.preprocessing import LabelEncoder

labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

#we are dummy encoding as the machine learning algorithms will be
#confused with the values like Spain > Germany > France
from sklearn.preprocessing import OneHotEncoder

onehotencoder = OneHotEncoder(categorical_features=[0])
X = onehotencoder.fit_transform(X).toarray()
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用折旧消息categories='auto'。如果我这样做,那么将对所有独立列(例如国家/地区,年龄,工资等)进行转换。

如何仅在数据集第0列上实现转换?

CoM*_*tel 7

实际上有2条警告:

FutureWarning:整数数据的处理将在0.22版中更改。当前,类别是根据范围[0,max(values)]确定的,而将来,它们将根据唯一值来确定。如果您想要将来的行为并消除此警告,则可以指定“ categories ='auto'”。如果您在此OneHotEncoder之前使用LabelEncoder将类别转换为整数,则现在可以直接使用OneHotEncoder。

第二个:

'categorical_features'关键字在0.20版中已弃用,并将在0.22版中删除。您可以改用ColumnTransformer。
“改为使用ColumnTransformer。”,DeprecationWarning)

将来,除非您要使用“ categories ='auto'”,否则不应直接在OneHotEncoder中定义列。第一条消息还告诉您直接使用OneHotEncoder,而无需先使用LabelEncoder。最后,第二条消息告诉您使用ColumnTransformer,这就像用于列转换的Pipe。

这是您的情况的等效代码:

from sklearn.compose import ColumnTransformer 
ct = ColumnTransformer([("Name_Of_Your_Step", OneHotEncoder(),[0])], remainder="passthrough")) # The last arg ([0]) is the list of columns you want to transform in this step
ct.fit_transform(X)    
Run Code Online (Sandbox Code Playgroud)

另请参阅:ColumnTransformer文档

对于上面的例子;

编码分类数据(基本将文本更改为数值数据,即国家/地区名称) from sklearn.preprocessing import LabelEncoder, OneHotEncoder from sklearn.compose import ColumnTransformer 编码国家/地区列 labelencoder_X = LabelEncoder() X[:,0] = labelencoder_X.fit_transform(X[:,0]) ct = ColumnTransformer([("Country", OneHotEncoder(), [0])], remainder = 'passthrough') X = ct.fit_transform(X)


Pla*_*tta 6

从 0.22 版本开始,您可以编写如下相同的代码:

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([("Country", OneHotEncoder(), [0])], remainder = 'passthrough')
X = ct.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

如您所见,您不再需要使用LabelEncoder了。


Swa*_*wal 5

transformer = ColumnTransformer(
    transformers=[
        ("Country",        # Just a name
         OneHotEncoder(), # The transformer class
         [0]            # The column(s) to be applied on.
         )
    ], remainder='passthrough'
)
X = transformer.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

提醒将保留以前的数据,而第 [0] 列将被替换将被编码


小智 5

不要使用labelencoder,直接使用OneHotEncoder。

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import make_column_transformer
A = make_column_transformer(
    (OneHotEncoder(categories='auto'), [0]), 
    remainder="passthrough")

x=A.fit_transform(x)
Run Code Online (Sandbox Code Playgroud)