使用用户定义的指标(再次)使用Sklearn kNN

时间:2016-06-04 03:29:02

标签: python scikit-learn knn

有人在这里发布了类似的问题,但我无法完成我的工作

Sklearn kNN usage with a user defined metric

我想定义我的user_metric并在KNN中使用它 我似乎有一个签名问题,但我不明白。感谢

gamma=2


def mydist2 (x,y):
    z=(x-y)
    return (z[0]^2+gamma*z[1]^2) 
neigh = KNeighborsClassifier(n_neighbors=3,metric=mydist2)

neigh.fit(traindata,train_labels)
neigh.score(testdata,test_labels)
  

def mydist2(x,y):ValueError Traceback   (最近的呼叫最后)in()   ----> 1 neigh.fit(traindata,train_labels)         2 neigh.score(testdata,test_labels)

     

C:\用户\法吉\ Anaconda2 \ lib中\站点包\ sklearn \邻居\ base.pyc   适合(自我,X,y)       801 self._y = self._y.ravel()       802    - > 803返回self._fit(X)       804       805

C:\Users\Fagui\Anaconda2\lib\site-packages\sklearn\neighbors\base.pyc
     

in _fit(self,X)           256 self._tree = BallTree(X,self.leaf_size,           257 metric = self.effective_metric_,        - > 258 ** self.effective_metric_params_)           259 elif self._fit_method =='kd_tree':           260 self._tree = KDTree(X,self.leaf_size,

sklearn/neighbors/binary_tree.pxi in sklearn.neighbors.ball_tree.BinaryTree.__init__
     

(sklearn \邻居\ ball_tree.c:8381)()

sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.DistanceMetric.get_metric
     

(sklearn \邻居\ dist_metrics.c:4032)()

sklearn/neighbors/dist_metrics.pyx in sklearn.neighbors.dist_metrics.PyFuncDistance.__init__
     

(sklearn \邻居\ dist_metrics.c:10628)()

ValueError: func must be a callable taking two arrays

作为奖励问题,我想将伽玛作为参数传递

非常感谢

3 个答案:

答案 0 :(得分:1)

我的问题非常愚蠢

语法正确

问题是python中的取幂不是用^而是用**

因此16 = 2 ** 4而不是2 ^ 4

答案 1 :(得分:0)

来自KNeighborsClassifier documentationmetric参数必须是字符串或DistanceMetric Object,并且您提供了一个函数。

要传递自己的指标,您必须指定:metric='pyfunc'并添加关键字参数func=mydist2

the similar question中:他们解释说,只有在设置algorithm='ball_tree'时才能使用自定义指标,并保留默认值“自动”。

我认为以下内容应该有效:

neigh = KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',metric='pyfunc', func=mydist2)

当谈到将gamma作为参数传递时,我会尝试:

def mydist2 (x,y, gamma=2):
    z=(x-y)
    return (z[0]^2+gamma*z[1]^2) 

并添加参数metric_params={'gamma':2}

neigh = KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',metric='pyfunc', func=mydist2, metric_params={'gamma':2} )

但我不确定,文档中没有明确的例子。

答案 2 :(得分:-1)

  

在Cython中定义一个指标,构建模块以创建库并从主代码中调用它。

Sklearn经过优化,使用cython和几个进程尽可能快地运行。编写纯Python代码,尤其是在多次调用它时,会降低代码的速度。我建议您使用cython编写自定义指标。您有一个教程,可以关注right here