TypeError:__init __()获得了意外的关键字参数'categorical_features'

时间:2019-12-25 07:29:00

标签: python-3.x ipython spyder

Spyder(python 3.7)

我在这里遇到以下错误。我已经从anaconda提示符下更新了所有库。但是无法找到问题的解决方案。

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
labelencoder_X_2 = LabelEncoder()

X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
onehotencoder = OneHotEncoder(categorical_features = [1])
X = onehotencoder.fit_transform(X).toarray()
Traceback (most recent call last):

File "<ipython-input-4-05deb1f02719>", line 2, in <module>
onehotencoder = OneHotEncoder(categorical_features = [1])

TypeError: __init__() got an unexpected keyword argument 'categorical_features'

10 个答案:

答案 0 :(得分:11)

因此,根据您的代码,您必须:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer

# Country column
ct = ColumnTransformer([("Country", OneHotEncoder(), [1])], remainder = 'passthrough')
X = ct.fit_transform(X)

# Male/Female
labelencoder_X = LabelEncoder()
X[:, 2] = labelencoder_X.fit_transform(X[:, 2])

了解了如何删除第一个LabelEncoder,您不再需要在列上同时应用编码的标签和一个热编码器。

(我假设您的示例来自ML Udemy课程,第一列是国家/地区列表,第二列是男性/女性二进制选择)

答案 1 :(得分:4)

    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)

由于最新版本的sklearn库删除了onehotencoder类的 categorical_features 参数。建议将ColumnTransformer类用于分类数据集。有关进一步的说明,请参阅sklearn的官方文档。

答案 2 :(得分:2)

根据documentation,这是__init__行:

class sklearn.preprocessing.OneHotEncoder(categories='auto', drop=None, sparse=True, dtype=<class 'numpy.float64'>, handle_unknown='error')

您可以看到init没有获得变量categorical_features

您有一个类别标志:

  

类别“自动”或类似数组的列表,默认=“自动”   每个功能的类别(唯一值):

     

“自动”:根据训练数据自动确定类别。

     

list:Categories [i]保存在第i列中期望的类别。   传递的类别不应在内部混合字符串和数字值   单一功能,如果是数值,则应排序。

     

使用的类别可以在 categories _ 属性中找到。

     

属性:数组的 categories_list 每个功能的类别   在拟合过程中确定(按X和   对应于transform的输出)。这包括   下拉列表中指定的类别(如果有)。

答案 3 :(得分:2)

from sklearn.preprocessing import OneHotEncoder, LabelEncoder

from sklearn.compose import ColumnTransformer

label_encoder_x_1 = LabelEncoder()
X[: , 2] = label_encoder_x_1.fit_transform(X[:,2])
transformer = ColumnTransformer(
    transformers=[
        ("OneHot",        # Just a name
         OneHotEncoder(), # The transformer class
         [1]              # The column(s) to be applied on.
         )
    ],
    remainder='passthrough' # donot apply anything to the remaining columns
)
X = transformer.fit_transform(X.tolist())
X = X.astype('float64')

像魅力一样工作:)

答案 4 :(得分:2)

假设这是Udemy的ML课程的问题 完整的代码 我确实按照上面评论中的Antoine Jaussoin的建议用列变压器替换了标签编码器1。

分类数据

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

您的“性别”列现在将具有索引

 labelencoder_x_2=LabelEncoder()
 X[:,4]=labelencoder_x_2.fit_transform(X[:,4])

避免虚拟变量陷阱

 X=X[:, 1:]

答案 5 :(得分:0)

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder

labelencoder_X_1 = LabelEncoder()
X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
labelencoder_X_2 = LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])

# remove categorical_features, it works 100% perfectly
onehotencoder = OneHotEncoder()
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:]

答案 6 :(得分:0)

您需要在sklearn上添加另一个调用类,这将消除1列以避免假人陷阱。

digraph G {
  "DUT0" -> "DUT1" [headlabel="1", taillabel="2"];
  "DUT1":n -> "DUT1" [ headlabel="3"];
}

祝您工作愉快!

答案 7 :(得分:0)

这只是onehotencoder的一个扩展。 如果X有很多列。

代替

ct = ColumnTransformer([("encoder", OneHotEncoder(), list(categorical_features))], remainder = 'passthrough')

X = ct.fit_transform(X)

答案 8 :(得分:0)

替换以下代码

# onehotencoder = OneHotEncoder(categorical_features = [1])
# X = onehotencoder.fit_transform(X).toarray()
# X = X[:, 1:]

具有以下代码段,并且您的代码必须

labelencoder_X_2 = LabelEncoder()

X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])

columnTransformer = ColumnTransformer([('encoder', OneHotEncoder(), [1])], remainder = 'passthrough')
X = np.array(columnTransformer.fit_transform(X), dtype = np.float64)
X = X[:, 1:]

假设您正在从udemy学习深度学习。

答案 9 :(得分:0)

R1R2

X = np.array(X,dtype = float)

只需添加额外的一行即可将其从对象数组中转换出来。