在scikit-learn中,所有估算工具都采用fit()
方法,并且根据它们是受监督还是无人监督,它们还具有predict()
或transform()
方法。
我正在为无监督的学习任务编写transformer,并且想知道是否有经验法则在哪里放置哪种学习逻辑。官方文档在这方面不是很有用:
fit_transform(X, y=None, **fit_params)
适合数据,然后转换它。
在这种情况下,拟合数据和转换数据的含义是什么?
答案 0 :(得分:36)
Fitting查找将用于转换数据的模型的内部参数。转换将参数应用于数据。您可以将模型拟合到一组数据,然后在完全不同的集合上对其进行转换。
例如,您将线性模型拟合到数据以获得斜率和截距。然后,您可以使用这些参数将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)
答案 1 :(得分:4)
正如其他答案所解释的那样,fit
不需要做任何事情(除了返回变换器对象)。它就是为了让所有变压器具有相同的界面,并与管道之类的东西很好地配合
当然,有些变形金刚需要fit
方法(想想tf-idf,PCA ......)才能真正做到这一点。
transform
方法需要返回转换后的数据。
fit_transform
是一种方便的方法,可以对拟合和变换操作进行链接。您可以通过从TransformerMixin
派生自定义变换器类并实现fit
和transform
来免费获得它(!)。
希望这能澄清一点。
答案 2 :(得分:2)
在这种情况下,调用fit
方法不会执行任何操作。正如您在this example中看到的那样,并非所有变换器都需要使用fit
或transform
方法实际执行某些操作。我的猜测是scikit-learn中的每个类都应该实现拟合,变换和/或预测,以使其与包的其余部分保持一致。但我想这确实是一种矫枉过正。