在 scikit-learn 中拟合数据与转换数据
Posted
技术标签:
【中文标题】在 scikit-learn 中拟合数据与转换数据【英文标题】:Fitting data vs. transforming data in scikit-learn 【发布时间】:2015-10-12 21:08:12 【问题描述】:在scikit-learn 中,所有估计器都有一个fit()
方法,并且根据它们是有监督的还是无监督的,它们也有一个predict()
或transform()
方法。
我正在为无监督学习任务编写transformer,我想知道是否有经验法则在哪里放置哪种学习逻辑。官方文档在这方面帮助不大:
fit_transform(X, y=None, **fit_params)
适应数据,然后对其进行转换。
在这种情况下,拟合数据和转换数据是什么意思?
【问题讨论】:
“根据他们是有监督的还是无监督的,他们也有predict()或transform()方法”是不是真的。这是在某处的文档中说明的吗?似乎大多数模型都有这两种方法。 【参考方案1】:正如其他答案所解释的那样,fit
不需要做任何事情(返回变压器对象除外)。在那里,所有转换器都具有相同的接口,并且可以很好地与管道之类的东西一起工作。
当然,有些转换器需要 fit
方法(想想 tf-idf、PCA ......)才能真正做事。transform
方法需要返回转换后的数据。
fit_transform
是一种链接拟合和变换操作的便捷方法。您可以通过从TransformerMixin
派生您的自定义转换器类并实现fit
和transform
来免费获得它(!)。
【讨论】:
【参考方案2】:拟合查找将用于转换数据的模型的内部参数。转换将参数应用于数据。您可以将模型拟合到一组数据,然后在完全不同的数据集上对其进行转换。
例如,您将线性模型拟合到数据以获得斜率和截距。然后使用这些参数将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)
【讨论】:
等等,那transform和predict有什么区别? 我们以PLSRegression
为例。它同时具有transform
和predict
方法。 predict(X)
将学习模型应用于X
,并返回y_pred
。 transform(X)
对X
应用降维,并返回X_reduced
。 transform(X, y)
返回 X_reduced
和 y_pred
谢谢!我在任何 braod scikit-learn 文档中都找不到您刚刚明确说明的内容。
我同意,文档不是很清楚。很高兴它有帮助。
那是否意味着可以使用 transform() 进行预测?【参考方案3】:
在这种情况下,调用fit
方法不会做任何事情。正如您在this example 中看到的那样,并非所有转换器都需要使用fit
或transform
方法实际执行某些操作。我的猜测是 scikit-learn 中的每个类都应该实现 fit、transform 和/或 predict 以使其与包的其余部分保持一致。但我想这确实有点矫枉过正。
【讨论】:
以上是关于在 scikit-learn 中拟合数据与转换数据的主要内容,如果未能解决你的问题,请参考以下文章
[机器学习与scikit-learn-31]:算法-回归-线性模拟拟合拟合非线性数据-概述
[机器学习与scikit-learn-32]:算法-回归-普通线性模型拟合非线性分布数据-分箱
[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例