使用sklearn-KNN进行预测,使用中位数(而不是平均值)

10
Sklearn-KNN允许在计算平均x个最近邻居时设置权重(例如,uniform,distance)。
是否可以使用中位数进行预测(可能需要使用用户定义的函数),而不是使用平均值?
1个回答

12

没有内置参数来调整权重以使用中位数而不是平均值(您可以在源代码中看到,平均值是硬编码的)。但是,由于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软件包,它声称实现了加权中位数。虽然我还没有检查过,但你可能会发现它很有用! - jakevdp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接