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_predict
with cv=3
正在进行 3 倍交叉验证,所以我希望它适合模型 3 次,因此至少需要 ~3 倍的时间,但我不明白为什么需要 64 倍!
为了检查它是否特定于我的环境,我在 Colab 笔记本中运行了相同的内容 - 差异不那么极端(15 倍),但仍远高于我预期的 ~3 倍:
我错过了什么?为什么cross_val_predict比仅仅拟合模型慢得多?
如果重要,我正在运行scikit-learn 0.20.2。
KNN
也被称为惰性算法,因为在拟合过程中它什么都不做,只是保存输入数据,特别是根本没有学习。
在预测期间,每个测试数据点都会进行实际距离计算。因此,您可以理解,当使用cross_val_predict
时,KNN
必须在验证数据点上进行预测,这使得计算时间更长!
cross_val_predict做拟合和预测,所以可能需要更长的时间,而不仅仅是拟合,但我没想到要长 64 倍