问题

sklearn 的 transform()和 predict()方法有什么区别?


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 方法,从标签或集群成员资格到特征).

在您提到的情况下,这种差异很明显,其中 predicttransform 方法都可用;例如,在 kmeans 中,predict(X) 将返回集群成员资格,但 transform(X) 将返回转换(即不同的版本) X_new 的输入特征。