fit()
和上面提到的两种方法的区别是非常明显的。fit
存在于 sklearn 的所有类中,并根据类拟合对象的内部变量,无论是训练模型类还是预处理器类。
然而,transform()
和 predict()
之间的区别似乎有点模糊。我见过的一个普遍规则是 - predict()
属于监督学习类,而 transform()
属于无监督学习类。
尽管如此,我还是发现了一些例外情况。K-Means(无监督算法)和 PLSRegression(有监督算法)是两类同时具有这两种方法的算法。我查阅了 K-Means 文档,了解了这两种不同方法的结果;但这两个接口的实现在文档中似乎没有具体定义。
与 fit()
一样,transform()
可以根据上下文表示不同的含义。对于预处理类,fit()
计算数据集的平均值,例如,transform
应用它。对于训练类,fit()
的行为不同并训练模型。
predict()
仍然很容易解释,我只将它包含在问题中,因为 transform()
的不同用法似乎只能用 predict()
作为比较点。
在经历了许多问题、部分文档包括开发手册、词汇表和 Hands-on ML Book 的小部分之后,这是我得出的结论 - 似乎这些接口不是故意的有一个明确的定义,并意味着对每个编写的类都灵活。
这是正确的还是我遗漏了什么?
predict
方法采用输入特征并返回质量不同的东西,即标签 y
(在监督设置中)或集群成员资格(在大多数集群设置中)。
另一方面,正如其名称所暗示的,transform
返回与其输入在性质上相似但以不同形式表示的东西,即缩放特征、PCA 特征等。通常,它们通常伴随着相应的 inverse_transform
方法将输入返回到其原始形式(虽然可以说我们无法想象 inverse_predict
方法,从标签或集群成员资格到特征).
在您提到的情况下,这种差异很明显,其中 predict
和 transform
方法都可用;例如,在 kmeans 中,predict(X)
将返回集群成员资格,但 transform(X)
将返回转换(即不同的版本) X_new
的输入特征。