2
當計算平均值 x個最近鄰居時,Sklearn-KNN允許設置權重(例如統一,距離)。使用中位數(而不是平均值)預測sklearn-KNN
而是與預測意味着的,是否有可能與所述位數(或許還有一個用戶定義的功能)來預測?
當計算平均值 x個最近鄰居時,Sklearn-KNN允許設置權重(例如統一,距離)。使用中位數(而不是平均值)預測sklearn-KNN
而是與預測意味着的,是否有可能與所述位數(或許還有一個用戶定義的功能)來預測?
沒有內置參數來調整權重以使用中位數而不是平均值(您可以看到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來計算加權中值的簡單方法,但只要添加了該函數就可以直接添加該函數。
剛剛找到[wquantiles](https://pypi.python.org/pypi/wquantiles)包聲稱實施加權中值。我沒有檢查出來,但你可能會覺得它有用! – jakevdp