OneHotEncoder categorical_features 已弃用,如何转换特定列

Posted

技术标签:

【中文标题】OneHotEncoder categorical_features 已弃用,如何转换特定列【英文标题】:OneHotEncoder categorical_features deprecated, how to transform specific column 【发布时间】:2019-06-18 03:08:30 【问题描述】:

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

Country     |    Age       
--------------------------
Germany     |    23
Spain       |    25
Germany     |    24
Italy       |    30 

我必须像这样对 Country 列进行编码

0     |    1     |     2     |       3
--------------------------------------
1     |    0     |     0     |      23
0     |    1     |     0     |      25
1     |    0     |     0     |      24 
0     |    0     |     1     |      30

我通过使用 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()

现在我收到了使用categories='auto' 的折旧消息。如果我这样做,则将对国家、年龄、薪水等所有独立列进行转换。

如何仅对数据集第0列进行转换?

【问题讨论】:

这是一个警告,因为在 0.22 中这些属性将不可用 好的,您是否尝试过使用值列表/数组列表,categories[i] 可能? 【参考方案1】:

实际上有两个警告:

FutureWarning:整数数据的处理将在版本中发生变化 0.22。目前,类别是根据范围 [0, max(values)] 确定的,而将来它们将根据 独特的价值观。如果你想要未来的行为并保持沉默 警告,您可以指定“categories='auto'”。如果您使用了 LabelEncoder 在此 OneHotEncoder 之前将类别转换为 整数,那么您现在可以直接使用 OneHotEncoder。

第二个:

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

以后,你不应该直接在 OneHotEncoder 中定义列,除非你想使用“categories='auto'”。第一条消息还告诉您直接使用 OneHotEncoder,而不是先使用 LabelEncoder。 最后,第二条消息告诉您使用 ColumnTransformer,它类似于用于列转换的管道。

这是您案例的等效代码:

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)    

另请参阅:ColumnTransformer documentation

对于上面的例子;

编码分类数据(基本上将文本更改为数字数据,即国家名称)

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer
#Encode Country Column
labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])
ct = ColumnTransformer([("Country", OneHotEncoder(), [0])], remainder = 'passthrough')
X = ct.fit_transform(X)

【讨论】:

我分配了 X = ct.fit_transform(X) 并且它已经转换了国家列,但它完全删除了年龄列。我如何获得两者?转换结果+年龄列数据 我进行了更正,您有 remainder 参数来确定如何处理未修改的列 好的,我现在面临的唯一问题是 ct.fit_transform(X) 正在返回数组编辑器不支持的“numpy 模块的 ndarry 对象”。这是因为它在数组中添加了 dtype='object' 。因此,如果将整个矩阵的类型转换为浮点数,就可以克服这个问题。方法对吗? 只是一个问题,因为文档也没有为我清除它......“名称”的目的是什么? Name只是步骤的名称。你可以随意命名,以后调用这一步会很有用,例如如果你只需要设置/获取一个步骤的参数【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:
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)

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

【讨论】:

【参考方案4】:

有一种方法可以使用 pandas 进行一次热编码。 蟒蛇:

import pandas as pd
ohe=pd.get_dummies(dataframe_name['column_name'])

为新形成的列命名,将其添加到您的数据框中。查看 pandas 文档here。

【讨论】:

这是我使用的另一个参数来摆脱虚拟陷阱:drop_first=True【参考方案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)

【讨论】:

【参考方案6】:

我遇到了同样的问题,以下对我有用:

OneHotEncoder(categories='auto', sparse=False)

希望对你有帮助

【讨论】:

【参考方案7】:

使用以下代码:-

from sklearn.preprocessing import OneHotEncoder

from sklearn.compose import ColumnTransformer

columnTransformer = ColumnTransformer([('encoder', OneHotEncoder(), [0])], remainder='passthrough')

X = np.array(columnTransformer.fit_transform(X), dtype = np.str)

print(X)

【讨论】:

【参考方案8】:
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
...
onehotencorder = ColumnTransformer(
   [('one_hot_encoder', OneHotEncoder(), [0])],
   remainder='passthrough'                     
)

X = onehotencorder.fit_transform(X)

【讨论】:

【参考方案9】:
# Data Preprocessing Template

# Importing the libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Importing the dataset
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:,:-1].values
y = dataset.iloc[:,3].values

# Splitting the dataset into the Training set and Test set
#from sklearn.preprocessing import Imputer
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:,1:3])
X[:,1:3] = imputer.transform(X[:,1:3])

#encoding Categorical Data
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])
onehotencoder = ColumnTransformer([("Country", OneHotEncoder(), [0])], remainder = "passthrough")
X = onehotencoder.fit_transform(X)


labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。【参考方案10】:
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
transformer = ColumnTransformer([('one_hot_encoder', OneHotEncoder(), [0])],remainder='passthrough')
x = py.array(transformer.fit_transform(x), dtype=py.float)


onehotencoder = oneHotEncoder(categorical_features=[0]) 

这段代码应该可以解决错误。

【讨论】:

【参考方案11】:

从这里更新代码时:

one_hot_encoder = OneHotEncoder(categorical_features = [0, 1, 4, 5, 6])
X_train = one_hot_encoder.fit_transform(X_train).toarray()

到这里:

ct = ColumnTransformer([('one_hot_encoder', OneHotEncoder(), [
                       0, 1, 4, 5, 6])], remainder='passthrough')
X_train = np.array(ct.fit_transform(X_train), dtype=np.float)

请注意,我必须添加dtype=np.float 来修复错误消息TypeError: can't convert np.ndarray of type numpy.object_.

我的列是[0, 1, 4, 5, 6]'one_hot_encoder' 是什么。

我的导入是:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
import numpy as np

【讨论】:

以上是关于OneHotEncoder categorical_features 已弃用,如何转换特定列的主要内容,如果未能解决你的问题,请参考以下文章

OneHotEncoder categorical_features 已弃用,如何转换特定列

sklearn.preprocessing.OneHotEncoder

在 numpy 数组上应用 onehotencoder

机器学习类别/标称(categorical)数据处理:目标编码(target encoding)

机器学习类别/标称(categorical)数据处理:序号编码(Ordinal Encoding)

机器学习类别/标称(categorical)数据处理:独热编码(One Hot Encoding)