我試圖在使用knn迴歸模型時應用我自己的自定義距離度量函數。 我的數據集是名義,有序,數字和二進制類型的字段如何使用KNeighboursRegressor的自定義距離度量?
代碼的混合物:
def cus_distance(array1, array2, **kwargs):
# calculate the distance, return a float
pass
knn = neighbors.KNeighborsRegressor(weights='distance', metric=cus_distance)
# train_data is a pandas dataframe obj
knn.fit(train_data.ix[:, fields_list], train_data['time_costs'])
最後一行將導致異常:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-284-04520b227b8a> in <module>()
----> 1 knn.fit(train_data.ix[:, fields_list], train_data['time_costs'])
/usr/local/lib/python2.7/dist-packages/sklearn/neighbors/base.pyc in fit(self, X, y)
587 X, y = check_arrays(X, y, sparse_format="csr")
588 self._y = y
--> 589 return self._fit(X)
590
591
/usr/local/lib/python2.7/dist-packages/sklearn/neighbors/base.pyc in _fit(self, X)
214 self._tree = BallTree(X, self.leaf_size,
215 metric=self.effective_metric_,
--> 216 **self.effective_metric_kwds_)
217 elif self._fit_method == 'kd_tree':
218 self._tree = KDTree(X, self.leaf_size,
/usr/local/lib/python2.7/dist-packages/sklearn/neighbors/ball_tree.so in sklearn.neighbors.ball_tree.BinaryTree.__init__ (sklearn/neighbors/ball_tree.c:7983)()
/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.pyc in asarray(a, dtype, order)
318
319 """
--> 320 return array(a, dtype, copy=False, order=order)
321
322 def asanyarray(a, dtype=None, order=None):
ValueError: could not convert string to float: Unknown
我知道這個錯誤導致通過字符串值('未知'是其中之一)在我的數據集。
這讓我困惑,在我的理解中,函數cus_distance應該處理這些str值,而KNeighborsRegressor只是使用函數的返回值。
問:
*這是在KNN迴歸中使用自定義定義距離度量的正確方法嗎?
*如果是這樣,爲什麼我遇到這個異常?
*如果不是,那麼正確的方法是什麼?
那麼,如果你點擊「未知」,它會返回什麼? –
@IvoFlipse這個「it」是指函數cus_distance嗎? – simomo
是的,那就是我所指的。但似乎@jakevdp已經提供了答案 –