2015-11-15 53 views

回答

2

没有内置参数来调整权重以使用中位数而不是平均值(您可以看到in the source表示均值是硬编码的)。但是因为scikit-learn估计器只是Python类,所以您可以继承KNeighborsRegressor并覆盖predict方法以执行任何您想要的操作。

这里有一个简单的例子,在那里我已经复制并粘贴原来predict()方法和改进相关的部分:

from sklearn.neighbors.regression import KNeighborsRegressor, check_array, _get_weights 

class MedianKNNRegressor(KNeighborsRegressor): 
    def predict(self, X): 
     X = check_array(X, accept_sparse='csr') 

     neigh_dist, neigh_ind = self.kneighbors(X) 

     weights = _get_weights(neigh_dist, self.weights) 

     _y = self._y 
     if _y.ndim == 1: 
      _y = _y.reshape((-1, 1)) 

     ######## Begin modification 
     if weights is None: 
      y_pred = np.median(_y[neigh_ind], axis=1) 
     else: 
      # y_pred = weighted_median(_y[neigh_ind], weights, axis=1) 
      raise NotImplementedError("weighted median") 
     ######### End modification 

     if self._y.ndim == 1: 
      y_pred = y_pred.ravel() 

     return y_pred  

X = np.random.rand(100, 1) 
y = 20 * X.ravel() + np.random.rand(100) 
clf = MedianKNNRegressor().fit(X, y) 
print(clf.predict(X[:5])) 
# [ 2.38172861 13.3871126 9.6737255 2.77561858 17.07392584] 

我已经离开了加权版本,因为我不知道的使用numpy/scipy来计算加权中值的简单方法,但只要添加了该函数就可以直接添加该函数。

+1

刚刚找到[wquantiles](https://pypi.python.org/pypi/wquantiles)包声称实施加权中值。我没有检查出来,但你可能会觉得它有用! – jakevdp

相关问题