首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么sklearn中的LabelEncoder只用于目标变量?

为什么sklearn中的LabelEncoder只用于目标变量?
EN

Stack Overflow用户
提问于 2020-07-14 09:31:34
回答 3查看 4.1K关注 0票数 6

我试图创建一个带有LabelEncoder的管道来转换分类值。

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
TypeError: fit_transform() takes 2 positional arguments but 3 were given

在进一步的参考资料中,我发现像LabelEncoders这样的变压器不应该与功能一起使用,而应该只在预测目标上使用。

来自文件:

类sklearn.preprocessing.LabelEncoder 编码值介于0和n_classes 1之间的目标标签。 这个转换器应该用来编码目标值,即y,而不是输入X。

我的问题是,为什么我们不能在特性变量上使用LabelEncoder,还有其他有这种情况的变压器吗?

EN

回答 3

Stack Overflow用户

发布于 2020-07-14 09:58:53

LabelEncoder可用于规范标签或转换非数字标签.对于输入分类,您应该使用OneHotEncoder

不同之处:

代码语言:javascript
运行
复制
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.]])
票数 3
EN

Stack Overflow用户

发布于 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) 分别用于标签编码器样变压器(即用于目标的变压器)和适用于特征的变压器。

同样的设计也适用于LabelBinarizerMultiLabelBinarizer。我建议阅读“用户指南”中的转换预测目标(y)段落。

这就是说,下面是描述在PipelineColumnTransformer中使用ColumnTransformer时会发生什么的几个注意事项

  • PipelineColumnTransformer是关于数据的转换和拟合,而不是目标。他们以某种方式“假定”目标已经处于估计器可以使用的状态。
  • 在这个github问题中以及其中引用的那些内容中,您可以遵循关于使管道也能够转换目标的长期讨论。在这个滑雪板常见问题中也对此进行了总结。
  • 获得TypeError: fit_transform() takes 2 positional arguments but 3 were given的具体原因如下(从ColumnTransformer的角度来看):当在ColumnTransformer站点上调用.fit_transform().fit()时,方法._fit_transform()依次在Xy上调用,并触发._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的区别
票数 2
EN

Stack Overflow用户

发布于 2022-01-29 11:30:01

您可以对分类变量使用OrdinalEncoder

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62892086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档