【发布时间】:2019-07-20 19:56:48
【问题描述】:
我看到 sklearn 文档中提到了 transformer 和 estimator。
这两个词有区别吗?
【问题讨论】:
标签: scikit-learn
我看到 sklearn 文档中提到了 transformer 和 estimator。
这两个词有区别吗?
【问题讨论】:
标签: scikit-learn
基本区别在于:
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,在这种情况下仔细阅读文档应该可以解决你的疑惑。
【讨论】:
Transformer 是一种 Estimator,它实现了transform 方法。
让我用我在 sklearn 实现中遇到的例子来支持这个说法。
sklearn.preprocessing.FunctionTransformer:这继承自另外两个类
TransformerMixin、BaseEstimator
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 函数。这用于预测。不是估算器。
【讨论】:
sklearn 的用法可能有点不直观,但“估计器”并不意味着任何非常具体的东西:基本上一切都是估计器。
来自 sklearn 词汇表:
管理模型估计和解码的对象...
估算器必须提供
fit方法,并且应该提供set_params和get_params,尽管这些通常是通过从base.BaseEstimator继承来提供的。
支持
transform和/或fit_transform的估算器...
正如@VivekKumar 的回答,我认为有一种趋势是使用估算器这个词来代替sklearn 所称的“predictor”:
支持
predict和/或fit_predict的估算器。这包括分类器、回归器、异常检测器和聚类器...
【讨论】:
BaseEstimator 和 TransformerMixin 建立的(我对此表示赞同)。但我认为词汇表给出了更广泛的定义,并阐明了它们在“估计器”和“预测器”之间的区别。