为什么 cross_val_predict 比适合 KNeighborsClassifier 慢得多?

Why is cross_val_predict so much slower than fit for KNeighborsClassifier?

运行 在本地 Jupyter 笔记本上使用 MNIST 数据集(28k 个条目,每张图像 28x28 像素,以下需要 27 秒

from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier(n_jobs=1)
knn_clf.fit(pixels, labels)

然而,以下需要 1722 秒,换句话说 ~64 倍长:

from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(knn_clf, pixels, labels, cv = 3, n_jobs=1)

我天真的理解是 cross_val_predictcv=3 正在进行 3 次交叉验证,所以我希望它适合模型 3 次,所以至少需要 ~3 次更长,但我不明白为什么需要 64 倍!

为了检查它是否特定于我的环境,我在 Colab notebook 中 运行 相同 - 差异不那么极端 (15x) ,但仍远高于我预期的 ~3x:

我错过了什么?为什么 cross_val_predict 比仅拟合模型慢得多?

以防万一,我是 运行 scikit-learn 0.20.2.

cross_val_predict 做了拟合和预测所以可能比拟合要花更长的时间,但我没想到要长 64 倍

KNN也被称为惰性算法,因为它在拟合时除了保存输入数据外什么都不做,具体来说根本就没有学习。

在预测过程中,实际距离计算发生在每个测试数据点上。因此,您可以理解,当使用 cross_val_predict 时,KNN 必须在验证数据点上进行预测,这会使计算时间更长!