我使用的数据集包含大约200k个对象。每个对象都有4个特征。我用欧氏度量对它们进行K近邻(KNN)分类。过程在大约20秒内完成。
最近,我有理由使用自定义度量。可能会有更好的结果。我已经实现了自定义度量,并且KNN已经工作了一个多小时。我没等它完成。
我认为这个问题的一个原因是我的标准。我用return 1
替换我的代码。KNN还工作了一个多小时。我假设一个原因是算法Ball Tree,但是KNN与它和欧几里得度量在大约20秒内工作。
现在我不知道是怎么回事。我使用Python 3和sklearn 0.17.1。这里进程不能用自定义度量完成。我也尝试了算法brute
,但它有同样的效果。升级和降级的科学知识-学习没有任何影响。在Python 2上通过自定义度量实现分类也没有积极的效果。我在Cython上实现了这个度量(只返回1),它具有相同的效果。
def custom_metric(x: np.ndarray, y: np.ndarray) -> float:
return 1
clf = KNeighborsClassifier(n_jobs=1, metric=custom_metric)
clf.fit(X, Y)
我能用自定义度量来提升KNN的分类过程吗?
如果我的英语不清楚,很抱歉。
发布于 2017-07-05 07:04:06
Sklearn进行了优化,并使用cython和几个进程尽可能快地运行。编写纯python代码--特别是当它被多次调用时--是减慢代码速度的原因。我建议您使用cython编写自定义度量。您可以在这里学习一个教程:https://blog.sicara.com/https-medium-com-redaboumahdi-speed-sklearn-algorithms-custom-metrics-using-cython-de92e5a325c
发布于 2017-07-18 02:58:30
正如@Réda Boumahdi正确指出的那样,原因是使用python中定义的自定义度量。这是这里讨论的一个已知问题。在讨论结束时,它以“惯用修正”的形式结束。因此,建议的唯一解决方案是在cython中编写自定义度量,以避免在使用python度量时减缓GIL。
https://stackoverflow.com/questions/40287236
复制