首页 > 解决方案 > sklearn中权重设置为距离的KNN

问题描述

我正在处理 UCI 眼动 eeg 数据,KNN并将weights参数设置为distance. 下面是我的代码:

test_scores = []
train_scores = []
for i in range(1,7):

    knn = KNeighborsClassifier(i,weights="distance")

    knn.fit(X_train,y_train)

    test_scores.append(knn.score(X_test,y_test))
    train_scores.append(knn.score(X_train,y_train))

现在对于训练精度,它为所有 k 值提供 1.0 的输出,如下所示:

[1.0, 1.0, 1.0, 1.0, 1.0, 1.0]

更新 #1 与此示例相同

from sklearn.datasets import load_boston
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import scale

boston = load_boston()

y = boston.target
X = scale(boston.data)
print(X.shape)
knn = KNeighborsRegressor(n_neighbors=5, weights='distance')
knn.fit(X[:-100,:], y[:-100])
knn.score(X[:-100,:], y[:-100])

当权重设置为距离时,模型的行为是否直观?任何人都可以演示如何分配此权重并帮助更好地理解工作吗?

标签: pythonmachine-learningscikit-learnknn

解决方案


在与同事讨论时找到了答案。是的,当 KNN 分类器的权重参数设置为距离时,很直观地得到 1 作为训练结果,因为当训练数据用于测试模型的训练分数时,离测试点最近的点就变成了点本身。它们之间的距离为 0。现在,由于使用距离倒数来为投票份额(权重 = 距离参数)赋予权重,距离 0 使 n/0 = inf 得分到最近的点(点本身),因此训练结果为总是正确的,因为对最近点的无限投票使模型预测正确的类。

这是一个简短的解释,但可以从KNN的 scikit learn 文档中深入研究这个概念


推荐阅读