【问题标题】:what is the difference between transformer and estimator in sklearn?sklearn中的transformer和estimator有什么区别?
【发布时间】:2019-07-20 19:56:48
【问题描述】:

我看到 sklearn 文档中提到了 transformer 和 estimator。

这两个词有区别吗?

【问题讨论】:

    标签: scikit-learn


    【解决方案1】:

    基本区别在于:

    • Transformer 以某种方式转换输入数据 (X)。
    • Estimator 使用输入数据 (X) 预测一个(或多个)新值 (y)。

    Transformer 和 Estimator 都应该有一个 fit() 方法,可以用来训练它们(它们学习数据的一些特征)。签名是:

    fit(X, y)
    

    fit() 不返回任何值,只是将学习到的数据存储在对象内部。

    这里X 代表样本(特征向量),y 是目标向量(X 中每个对应样本可能有一个或多个值)。请注意,y 在某些不需要它的转换器中可以是可选的,但对于大多数估计器(监督估计器)来说是强制性的。以StandardScaler 为例。它需要初始数据X 来查找数据的均值和标准差(它学习了X 的特征,不需要y)。

    每个Transformer 都应该有一个transform(X, y) 函数,类似于fit() 接受输入X 并返回X 的新转换版本(通常应该有相同数量的样本,但可能有也可能不同功能)。

    另一方面,Estimator 应该有一个predict(X) 方法,该方法应该从给定的X 输出y 的预测值。

    scikit-learn 中会有一些类同时实现transform() 和predict(),比如KMeans,在这种情况下仔细阅读文档应该可以解决你的疑惑。

    【讨论】:

    • 您的回答很有帮助。但我还有一个问题:估计器 = 变换器 + 预测器?
    • @blacksheep 预测变量是什么意思?
    • 能够做出预测的估计器
    • 估算器 = 转换器 + 预测器也是如此吗?哥们?
    • @VivekKumar .. 我刚刚在探索 sklearn 代码后回答了这个问题。你几乎是正确的。但是,不完全
    【解决方案2】:

    Transformer 是一种 Estimator,它实现了transform 方法。

    让我用我在 sklearn 实现中遇到的例子来支持这个说法。

    1. 班级sklearn.preprocessing.FunctionTransformer:

    这继承自另外两个类TransformerMixin、BaseEstimator

    1. 班级sklearn.preprocessing.PowerTransformer:

    这也继承自TransformerMixin、BaseEstimator

    据我了解,Estimator 只是根据其fit 方法中实现的逻辑来获取数据、进行一些处理并存储数据。

    注意:估计器不用于直接预测值。他们甚至没有predict 方法。

    在我对上面的陈述做更多解释之前,让我告诉你Mixin类。

    混合类:这些是实现混合设计模式的类。维基百科对此有很好的解释。你可以阅读它here。总而言之,这些是您编写的类,它们具有可用于许多不同类的方法。所以,你把它们写在一个类中,然后在许多不同的类中继承(一种组合形式。阅读这些链接 - Link1 Link2)

    在 Sklearn 中有很多 mixin 类。仅举几例 ClassifierMixin, RegressorMixin, TransformerMixin.

    这里,TransformerMixin 是 sklearn 中使用的每个 Transformer 继承的类。 TransformerMixin 类只有一个方法可以在每个转换器中重复使用,即fit_transform。

    所有的转换器都继承了两个类,BaseEstimator(有fit方法)和TransformerMixin(有fit_transform方法)。而且,每个转换器都有基于其功能的transform 方法

    我想这可以回答你的问题。现在,让我来回答一下我关于预测的 Estimator 所做的陈述。

    每个模型类都有自己的 predict 类来进行预测。

    考虑LinearRegression、KNeighborsClassifier 或任何其他模型类。它们都声明了一个predict 函数。这用于预测。不是估算器。

    【讨论】:

      【解决方案3】:

      sklearn 的用法可能有点不直观,但“估计器”并不意味着任何非常具体的东西:基本上一切都是估计器。

      来自 sklearn 词汇表:

      estimator:

      管理模型估计和解码的对象...

      估算器必须提供fit 方法,并且应该提供set_params 和get_params,尽管这些通常是通过从base.BaseEstimator 继承来提供的。

      transformer:

      支持transform 和/或fit_transform 的估算器...

      正如@VivekKumar 的回答,我认为有一种趋势是使用估算器这个词来代替sklearn 所称的“predictor”:

      支持predict 和/或fit_predict 的估算器。这包括分类器、回归器、异常检测器和聚类器...

      【讨论】:

      • fit_transoform 在 mixin 类的帮助下得到支持。
      • @InAFlash,是的,从代码库的角度来看,大多数估算器和转换器都是通过使用 mixins BaseEstimator 和 TransformerMixin 建立的(我对此表示赞同)。但我认为词汇表给出了更广泛的定义,并阐明了它们在“估计器”和“预测器”之间的区别。
      猜你喜欢
      • 1970-01-01
      • 2014-07-13
      • 2016-11-19
      • 2017-03-14
      • 2016-12-06
      • 1970-01-01
      • 2020-06-21
      • 2017-06-08
      • 2020-06-23
      相关资源
      最近更新 更多