我们在
sklearn.cluster.KMeans
上制作模型有两种方法。第一个是fit()
,另一个是fit_predict()
。我的理解是,当我们在 fit()
模型上使用 KMeans
方法时,它给出了一个属性 labels_
,它基本上保存了哪个观察属于哪个集群的信息。 fit_predict()
还具有 labels_
属性。
所以我的问题是,
fit()
满足需求,那么为什么他们是 fit_predict()
?fit()
和fit_predict()
可以互换吗?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。
在 scikit-learn 中,还有
fit
和 fit_transform
等类似的东西。 Fit
和 predict
或 labels_
对于聚类至关重要。 fit_predict
只是高效的代码,其结果与拟合和预测(或标签)的结果相同。
此外,在确定样本的聚类标签时,拟合的聚类模型仅使用一次。