簡體   English   中英

使用中位數(而非均值)預測sklearn-KN​​N

[英]Predict with sklearn-KNN using median (instead of mean)

Sklearn-KN​​N允許在計算平均 x最近鄰居時設置權重(例如,均勻,距離)。

而不是用均值預測,是否可以用中位數預測(可能使用用戶定義的函數)?

沒有內置參數來調整權重以使用中位數而不是均值(您可以在源中看到均值是硬編碼的)。 但是因為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計算加權中值的簡單方法,但是只要該函數可用,就可以直接添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM