在 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 派生您的自定义转换器类并实现fittransform 来免费获得它(!)。

【讨论】:

【参考方案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 为例。它同时具有transformpredict 方法。 predict(X) 将学习模型应用于X,并返回y_predtransform(X)X 应用降维,并返回X_reducedtransform(X, y) 返回 X_reducedy_pred 谢谢!我在任何 braod scikit-learn 文档中都找不到您刚刚明确说明的内容。 我同意,文档不是很清楚。很高兴它有帮助。 那是否意味着可以使用 transform() 进行预测?【参考方案3】:

在这种情况下,调用fit 方法不会做任何事情。正如您在this example 中看到的那样,并非所有转换器都需要使用fittransform 方法实际执行某些操作。我的猜测是 scikit-learn 中的每个类都应该实现 fit、transform 和/或 predict 以使其与包的其余部分保持一致。但我想这确实有点矫枉过正。

【讨论】:

以上是关于在 scikit-learn 中拟合数据与转换数据的主要内容,如果未能解决你的问题,请参考以下文章

[机器学习与scikit-learn-31]:算法-回归-线性模拟拟合拟合非线性数据-概述

Scikit-Learn 中的分类数据转换

[机器学习与scikit-learn-32]:算法-回归-普通线性模型拟合非线性分布数据-分箱

[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例

[机器学习与scikit-learn-30]:算法-回归-普通线性模型拟合非线性分布数据-遇到的问题

Scikit-Learn 逻辑回归严重过拟合数字分类训练数据