调整 leaf_size 以减少 Scikit-Learn KNN 中的时间消耗

Posted

技术标签:

【中文标题】调整 leaf_size 以减少 Scikit-Learn KNN 中的时间消耗【英文标题】:Tuning leaf_size to decrease time consumption in Scikit-Learn KNN 【发布时间】:2018-10-01 21:35:16 【问题描述】:

我试图实现用于手写字符识别的 KNN,但我发现代码的执行需要大量时间。当添加值为 400 的参数 leaf_size 时,我观察到代码执行所需的时间显着减少。

原代码:

knn = KNeighborsClassifier(n_neighbors=3)

新代码:

knn = KNeighborsClassifier(n_neighbors=3,leaf_size=400)

我已经阅读了一些关于 KDtree/Balltree 的 leaf_size 参数的文档和文章,但找不到任何足够好的参考资料来说明如何安全地调整此参数而不会造成任何准确性和信息丢失。

如果有人能就上述问题分享一些见解,那就太好了。

我参考的相关文章: 1.) http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KDTree.html 2.) https://jakevdp.github.io/blog/2013/04/29/benchmarking-nearest-neighbor-searches-in-python/ 3.) http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html

【问题讨论】:

【参考方案1】:

找不到任何足够好的参考资料来说明如何安全地调整此参数而不会造成任何准确性和信息丢失。

一般来说,leaf_size 越大,算法选择的邻居越近(注意这与更高的准确度不同)。这是因为树的主要目的是减少邻居的候选人的数量。 KD-tree 和 Ball Tree 都不能保证分裂会在树中保持真正的最近点靠近。从这个意义上说,使用树意味着“信息丢失”,树越大,将真正的邻居放入错误分支的机会就越大。在极端情况下,根本没有树(称为蛮力),因此所有点都是邻居的候选点,因此算法可以保证找到精确的解决方案。

但是,至少在理论上,即使邻居的错误选择实际上也可能导致更高的分类准确度。但是几乎不可能提前说leaf_size的变化对最终的准确率有什么影响。

当添加参数 leaf_size 的值为 400 时,我观察到代码执行所花费的时间显着减少。

这很有趣,因为leaf_size 增加(默认为 30)通常会导致查询时间减少。但是有可能大部分时间都花在了构造上,在这种情况下,叶子的大小越大,这个阶段完成的速度就越快。请记住,Ball Tree 并不能保证结果树是平衡。当它高度不平衡时,构造甚至可能需要 O(N^2) 时间。在这种情况下,leaf_size 的增加非常有意义。 This post 包含关于这个问题的非常有趣的实验。

【讨论】:

如果我想准确查询给定半径r内的点的邻居,那么我应该增加还是减少leafsize @seralouk 我正在研究与 KDtree 相同的主题以进行采样,想聊聊吗?

以上是关于调整 leaf_size 以减少 Scikit-Learn KNN 中的时间消耗的主要内容,如果未能解决你的问题,请参考以下文章

Unity - 通过降低精度减少动画文件的大小

如何以编程方式在 Android 中调整麦克风音量

如何调整 Core Data 默认缓存的行为或大小?

UIView 根据边缘调整大小

使用 k-means 聚类时如何设置 spark 配置以减少洗牌?

如何在 ansible playbook 性能调整中减少 time.sleep 时间