【问题标题】:fit() vs fit_predict() metthods in sklearn KMeanssklearn KMeans 中的 fit() 与 fit_predict() 方法
【发布时间】:2021-06-21 21:27:25
【问题描述】:
我们在sklearn.cluster.KMeans上制作模型有两种方法。第一个是fit(),另一个是fit_predict()。我的理解是,当我们在KMeans 模型上使用fit() 方法时,它会给出一个属性labels_,它基本上保存了关于哪个观察属于哪个集群的信息。 fit_predict() 也有labels_ 属性。
所以我的问题是,
- 如果
fit() 满足需求,那么为什么他们是fit_predict()?
- 在编写代码时
fit() 和fit_predict() 是否可以互换?
【问题讨论】:
标签:
python
scikit-learn
k-means
【解决方案1】:
在scikit-learn中,有fit和fit_transform等类似的东西。
Fit 和 predict 或 labels_ 对于集群来说是必不可少的。
因此fit_predict 只是高效的代码,其结果与拟合和预测(或标签)的结果相同。
另外,拟合的聚类模型在确定样本的聚类标签时只使用一次。
【解决方案2】:
KMeans 只是sklearn 拥有的众多模型之一,并且许多模型共享相同的 API。基本功能是fit,它使用示例来教授模型,predict,它使用fit 获得的知识来回答有关潜在新值的问题。
KMeans 将在训练期间自动预测所有输入数据的集群,因为这样做是算法不可或缺的。为了提高效率,它保留了它们,因为预测原始数据集的标签非常普遍。因此,fit_predict 增加的很少:它调用fit,然后返回.labels_。 fit_predict 只是一个调用fit 的便捷方法,然后返回训练数据集的标签。 (fit_predict 没有 labels_ 属性,它只是给你标签。)
但是,如果您想在一组数据上训练您的模型,然后使用它来快速(并且不更改已建立的集群边界)获得原始数据中没有的数据点的答案,您需要使用predict,而不是fit_predict。
在其他模型中(例如sklearn.neural_network.MLPClassifier),训练可能是一项非常昂贵的操作,因此您可能不想每次想要预测某事时都重新训练模型;此外,也可以不假定预测结果是作为预测的一部分生成的。或者,如上所述,您只是不想更改模型以响应新数据。在这些情况下,您无法从 fit 的结果中获得预测:您需要使用要获得预测的数据调用 predict。
还要注意labels_ 用下划线标记,这是“不要碰这个,它是私有的”的 Python 约定(在没有实际访问控制的情况下)。只要有可能,您应该改用已建立的 API。