Scikit-learn: LabelBinarizer 和 LabelEncoder 适合和转换与流水线不兼容的签名

创建于 2014-04-26  ·  6评论  ·  资料来源: scikit-learn/scikit-learn

当我尝试在管道中使用LabelBinarizerLabelEncoder时出现此错误:

sklearn/pipeline.pyc in fit_transform(self, X, y, **fit_params)
    141         Xt, fit_params = self._pre_transform(X, y, **fit_params)
    142         if hasattr(self.steps[-1][-1], 'fit_transform'):
--> 143             return self.steps[-1][-1].fit_transform(Xt, y, **fit_params)
    144         else:
    145             return self.steps[-1][-1].fit(Xt, y, **fit_params).transform(Xt)

TypeError: fit_transform() takes exactly 2 arguments (3 given)

这似乎是因为类的fittransform签名与大多数其他估计器不同,并且只接受一个参数。

我认为这是一个非常简单的修复(只需将签名更改为def(self, X, y=None) ),我很乐意为其发送拉取请求,但我想检查是否有任何其他原因导致签名是他们是我没想到的方式。

最有用的评论

我看到这个页面上有很多负面反应。 我认为长期以来对 LabelBinarizer 和 LabelEncoder 的用途存在误解。 这些是针对目标的,而不是针对特征的。 尽管不可否认,它们是在我之前设计的(并且命名不当)。

尽管我认为用户长期以来一直在为此目的使用 CountVectorizer(或带有dataframe.to_dict(orient='records') DictVectorizer,如果您来自数据帧),但我们最近合并了一个CategoricalEncoder (#9151 ) 到 master 中,尽管这可能会在发布之前被卷入 OneHotEncoer 和新的 OrdinalEncoder (#10521)。

我希望这能满足明显不满的民众的需求。

我必须说,作为一个近五年来一直自愿为这个项目的开发提供大量空闲时间的人(最近也被雇用来从事这个项目),看到了负面反应的严重程度,而不是建设性的贡献去图书馆挺伤感的。 虽然我上面的回答是你应该写一个新的类似流水线的东西,而不是一个新的用于分类输入的转换器,这是我的一个误解(并且应该/可以被其他人纠正),我希望在工作时可以理解维护这个项目的巨大工作量。

所有6条评论

我认为你解决这个问题是正确的。

自2014年4月26日19时37分,HXU [email protected]写道:

当我尝试在 a 中使用 LabelBinarizer 和 LabelEncoder 时出现此错误
管道:

sklearn/pipeline.pyc in fit_transform(self, X, y, *_fit_params)
141 Xt,fit_params = self._pre_transform(X,y,*_fit_params)
第142话
144 其他:
145 返回 self.steps[-1][-1].fit(Xt, y, *_fit_params).transform(Xt)
类型错误:fit_transform() 正好需要 2 个参数(给出 3 个)

这似乎是因为类的拟合和变换签名https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/label.py#L85与大多数其他估计器不同,只接受一个论点。

我认为这是一个非常简单的解决方法(只需将签名更改为 def(self,
X, y=None)) 我很乐意为其发送拉取请求,但我想
检查签名是否有任何其他原因
是我没想到的。


直接回复本邮件或在 Gi tHub上查看
.

在 #3113 中,我们决定不修复此问题,因为标签编码并不真正属于Pipeline

@jnothman ,只是想知道:如果我碰巧需要对管道中的分类特征进行矢量化,我应该怎么做?

您最好编写自己的Pipeline-like代码(可能继承自现有代码)来处理您的特定情况。

我没有在管道中使用 LabelBinarizer,而是实现了我自己的转换器:

class CustomBinarizer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None,**fit_params):
        return self
    def transform(self, X):
        return LabelBinarizer().fit(X).transform(X)

似乎行得通!

编辑:

这是一个更好的解决方案:
https://github.com/scikit-learn/scikit-learn/pull/7375/files#diff -1e175ddb0d84aad0a578d34553f6f9c6

我看到这个页面上有很多负面反应。 我认为长期以来对 LabelBinarizer 和 LabelEncoder 的用途存在误解。 这些是针对目标的,而不是针对特征的。 尽管不可否认,它们是在我之前设计的(并且命名不当)。

尽管我认为用户长期以来一直在为此目的使用 CountVectorizer(或带有dataframe.to_dict(orient='records') DictVectorizer,如果您来自数据帧),但我们最近合并了一个CategoricalEncoder (#9151 ) 到 master 中,尽管这可能会在发布之前被卷入 OneHotEncoer 和新的 OrdinalEncoder (#10521)。

我希望这能满足明显不满的民众的需求。

我必须说,作为一个近五年来一直自愿为这个项目的开发提供大量空闲时间的人(最近也被雇用来从事这个项目),看到了负面反应的严重程度,而不是建设性的贡献去图书馆挺伤感的。 虽然我上面的回答是你应该写一个新的类似流水线的东西,而不是一个新的用于分类输入的转换器,这是我的一个误解(并且应该/可以被其他人纠正),我希望在工作时可以理解维护这个项目的巨大工作量。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mikeroberts3000 picture mikeroberts3000  ·  102评论

jhennrich picture jhennrich  ·  61评论

jorisvandenbossche picture jorisvandenbossche  ·  63评论

joelkuiper picture joelkuiper  ·  108评论

thomasjpfan picture thomasjpfan  ·  60评论