在scikit-learn中,拟合数据与转换数据的区别

35
scikit-learn中,所有评估器都有一个fit()方法,并且根据它们是监督式还是无监督式,它们也有一个predict()transform()方法。
我正在编写一个无监督学习任务的转换器,想知道应该把哪种学习逻辑放在哪里。官方文档在这方面并不是很有帮助:

fit_transform(X, y=None, **fit_params)
拟合数据,然后将其转换。

在这个上下文中,“拟合数据”和“转换数据”是什么意思?

根据它们是受监督还是无监督的,它们是否具有predict()或transform()方法是真实的吗?文档中有提到吗?似乎大多数模型都同时具备这两种方法。 - Luke W
3个回答

53

拟合是找到一个模型的内部参数,该模型将用于转换数据。转换将这些参数应用于数据。您可以将模型拟合到一组数据上,然后在完全不同的一组数据上进行转换。

例如,您可以将线性模型拟合到数据中以获得斜率和截距。然后,您使用这些参数将新的或现有的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)

3
那么,转换和预测之间有什么区别呢? - user1717828
4
让我们以 PLSRegression 为例。它具有 transformpredict 方法。predict(X) 将已学习的模型应用于 X,并返回 y_predtransform(X)X 进行降维处理,并返回 X_reducedtransform(X, y) 返回 X_reducedy_pred - inversion
1
谢谢!我在任何广泛的scikit-learn文档中都找不到你刚才明确说明的内容。 - user1717828
1
我同意,文档不够清晰。很高兴它有所帮助。 - inversion
1
那么这意味着您可以使用 transform() 进行预测吗? - Andy
请问您能否提供与PCA示例相同的线性回归示例? - Viral Parmar

8
正如其他答案所解释的,fit不需要执行任何操作(除了返回转换器对象)。它存在是为了所有转换器都具有相同的接口,并与管道等内容很好地配合使用。
当然,某些转换器需要一个fit方法(例如tf-idf、PCA...)才能实际执行操作。
transform方法需要返回转换后的数据。

fit_transform是一种方便的方法,可以链接fit和transform操作。您可以通过从TransformerMixin派生自定义转换器类并实现fittransform来免费获得(!)。


3
在这种情况下,调用fit方法不会有任何作用。正如您在此示例中所看到的,不是所有转换器都需要实际使用fittransform方法。我猜想,scikit-learn中的每个类都应该实现fittransform和/或predict方法,以便与包中的其他部分保持一致。但我猜这确实有点过头了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接