【问题标题】:Fitting data vs. transforming data in scikit-learn在 scikit-learn 中拟合数据与转换数据
【发布时间】:2015-10-12 21:08:12
【问题描述】:

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

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

fit_transform(X, y=None, **fit_params)
适应数据,然后对其进行转换。

在这种情况下,拟合数据转换数据是什么意思?

【问题讨论】:

  • “根据他们是有监督的还是无监督的,他们也有predict()或transform()方法”是不是真的。这是在某处的文档中说明的吗?似乎大多数模型都有这两种方法。

标签: machine-learning scikit-learn


【解决方案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 以使其与包的其余部分保持一致。但我想这确实有点矫枉过正。

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 2015-03-07
      • 1970-01-01
      • 2020-10-05
      • 2017-08-13
      • 2016-04-22
      • 2018-05-26
      • 2016-11-01
      • 2014-04-29
      相关资源
      最近更新 更多