在 scikit-learn 中拟合数据与转换数据

Fitting data vs. transforming data in scikit-learn

scikit-learn中,所有的估计器都有一个fit()方法,并且根据它们是有监督还是无监督,它们也有一个predict()transform()方法。

我正在为无监督学习任务编写 transformer,想知道在何处放置哪种学习逻辑是否有经验法则。官方文档在这方面帮助不大:

fit_transform(X, y=None, **fit_params)
Fit to data, then transform it.

在此上下文中,拟合数据转换数据是什么意思?

在这种情况下,调用 fit 方法不会执行任何操作。正如您在 this example 中所见,并非所有转换器都需要使用 fittransform 方法实际执行某些操作。我的猜测是 scikit-learn 中的每个 class 都应该实现拟合、变换 and/or 预测,以便它与包的其余部分保持一致。不过我想这确实有点大材小用了。

拟合查找将用于转换数据的模型的内部参数。转换将参数应用于数据。您可以将模型拟合到一组数据,然后将其转换到完全不同的一组。

例如,您将线性模型拟合到数据以获得斜率和截距。然后使用这些参数将 x 的新值或现有值转换(即映射)为 y.

fit_transform 只是对同一数据执行这两个步骤。

一个 scikit 示例:您拟合数据以找到主成分。然后转换数据以查看它如何映射到这些组件:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)

X = [[1,2],[2,4],[1,3]]

pca.fit(X)

# This is the model to map data
pca.components_

array([[ 0.47185791,  0.88167459],
       [-0.88167459,  0.47185791]], dtype=float32)

# Now we actually map the data
pca.transform(X)

array([[-1.03896057, -0.17796634],
       [ 1.19624651, -0.11592512],
       [-0.15728599,  0.29389156]])

# Or we can do both "at once"
pca.fit_transform(X)

array([[-1.03896058, -0.1779664 ],
       [ 1.19624662, -0.11592512],
       [-0.15728603,  0.29389152]], dtype=float32)

正如其他答案所解释的那样,fit 不需要做任何事情(returning 转换器对象除外)。有了它,所有转换器都具有相同的接口,并且可以很好地处理管道之类的东西。
当然,一些转换器需要一个 fit 方法(想想 tf-idf,PCA...)来实际做事。
transform 方法需要 return 转换后的数据。

fit_transform 是一种链接拟合和变换操作的便捷方法。您可以通过从 TransformerMixin 派生自定义转换器 class 并实施 fittransform.

来免费获得它(!)