Eug*_*Yan 6 python knn scikit-learn
当计算平均值 x最近邻时,Sklearn-KNN允许设置权重(例如,均匀,距离)。
相反,与预测的平均值,是否有可能与预测值(或许还有一个用户定义的函数)?
没有内置参数可调整权重以使用中位数而不是均值(您可以在源代码中看到均值是硬编码的)。但是,由于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]
Run Code Online (Sandbox Code Playgroud)
我省略了加权版本,因为我不知道一种使用numpy / scipy计算加权中位数的简单方法,但是一旦该函数可用,就可以直接添加。
| 归档时间: |
|
| 查看次数: |
1037 次 |
| 最近记录: |