为啥 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_predict
和 cv=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 只返回单个预测数组