为啥 cross_val_predict 比适合 KNeighborsClassifier 慢得多?

Posted

技术标签:

【中文标题】为啥 cross_val_predict 比适合 KNeighborsClassifier 慢得多?【英文标题】:Why is cross_val_predict so much slower than fit for KNeighborsClassifier?为什么 cross_val_predict 比适合 KNeighborsClassifier 慢得多? 【发布时间】:2019-06-15 17:29:15 【问题描述】:

在 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。

【问题讨论】:

【参考方案1】:

cross_val_predict 进行拟合和预测,因此它可能需要比拟合更长的时间,但我没想到要长 64 倍

【讨论】:

【参考方案2】:

KNN 也被称为惰性算法,因为在拟合期间它什么都不做,只是保存输入数据,特别是根本没有学习。

在预测期间,每个测试数据点都会进行实际距离计算。因此,您可以理解,在使用cross_val_predict 时,KNN 必须对验证数据点进行预测,这使得计算时间更长!

【讨论】:

这真的很有帮助而且很有道理,谢谢!我针对初始模型学习在输入数据集上运行了一个简单的预测,预测步骤花费的时间与整个交叉验证运行的时间一样长,这很好地证实了你所说的。

以上是关于为啥 cross_val_predict 比适合 KNeighborsClassifier 慢得多?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当 cv=5 时 cross_val_predict 只返回单个预测数组

为啥交叉验证的性能比测试差?

为啥 json.loads 比 ast.literal_eval 更适合解析 JSON?

linux为啥比windows做服务器更好?

对测试数据集使用 cross_val_predict

cross_val_predict 未完成。没有错误信息