我试图创建一个带有LabelEncoder的管道来转换分类值。
cat_variable = Pipeline(steps = [
('imputer',SimpleImputer(strategy = 'most_frequent')),
('lencoder',LabelEncoder())
])
num_variable = SimpleImputer(strategy = 'mean')
preprocess = ColumnTransformer (transformers = [
('categorical',cat_variable,cat_columns),
('numerical',num_variable,num_columns)
])
odel = RandomForestRegressor(n_estimators = 100, random_state = 0)
final_pipe = Pipeline(steps = [
('preprocessor',preprocess),
('model',model)
])
scores = -1 * cross_val_score(final_pipe,X_train,y,cv = 5,scoring = 'neg_mean_absolute_error')
但这是在抛出一个TypeError:
TypeError: fit_transform() takes 2 positional arguments but 3 were given
在进一步的参考资料中,我发现像LabelEncoders这样的变压器不应该与功能一起使用,而应该只在预测目标上使用。
类sklearn.preprocessing.LabelEncoder 编码值介于0和n_classes 1之间的目标标签。 这个转换器应该用来编码目标值,即y,而不是输入X。
我的问题是,为什么我们不能在特性变量上使用LabelEncoder,还有其他有这种情况的变压器吗?
发布于 2020-07-14 09:58:53
LabelEncoder可用于规范标签或转换非数字标签.对于输入分类,您应该使用OneHotEncoder。
不同之处:
le = preprocessing.LabelEncoder()
le.fit_transform([1, 2, 2, 6])
array([0, 0, 1, 2])
enc = OneHotEncoder(handle_unknown='ignore')
enc.fit_transform([[1], [2], [2], [6]]).toarray()
array([[1., 0., 0.],
[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.]])
发布于 2022-01-31 08:28:47
根据设计,LabelEncoder
必须用于目标变量,而不是功能变量。这意味着.fit()
类的.transform()
和.fit_transform()
方法的签名不同于用于特性的转换器之一。
fit_transform(y)对fit_transform(X,y)或类似的 fit(self,y) vs fit(self,X,y=None) x-变换(self,y) vs transform(self,X) - fit_transform(self,y) vs fit_transform(self,X,y=None) 分别用于标签编码器样变压器(即用于目标的变压器)和适用于特征的变压器。
同样的设计也适用于LabelBinarizer
和MultiLabelBinarizer
。我建议阅读“用户指南”中的转换预测目标(y)段落。
这就是说,下面是描述在Pipeline
或ColumnTransformer
中使用ColumnTransformer
时会发生什么的几个注意事项
Pipeline
和ColumnTransformer
是关于数据的转换和拟合,而不是目标。他们以某种方式“假定”目标已经处于估计器可以使用的状态。TypeError: fit_transform() takes 2 positional arguments but 3 were given
的具体原因如下(从ColumnTransformer
的角度来看):当在ColumnTransformer
站点上调用.fit_transform()
或.fit()
时,方法._fit_transform()
依次在X
和y
上调用,并触发._fit_transform_one()
调用,此时出现错误。实际上,它在.fit_transform()
站点上调用了transformer
(您的LabelEncoder
);这里使用的是不同的方法签名:
使用_print_elapsed_time(message_clsname,message):if hasattr(转换器,"fit_transform"):res = transformer.fit_transform(X,y,**fit_params) if: res = transformer.fit(X,y,**fit_params).transform(X)
实际上,.fit_transform()
是在(self, X, y)
上调用的(.给出了3个参数),同时只期望(self, y)
(.取两个位置参数)。按照Pipeline
类中的代码,可以看到同样的情况。OrdinalEncoder
(来自0.20版)。对于这一建议,我建议阅读OrdinalEncoder与LabelEncoder的区别。发布于 2022-01-29 11:30:01
您可以对分类变量使用OrdinalEncoder
。
https://stackoverflow.com/questions/62892086
复制相似问题