python - 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])
当权重设置为距离时,模型的行为是否直观?任何人都可以演示如何分配此权重并帮助更好地理解工作吗?
解决方案
在与同事讨论时找到了答案。是的,当 KNN 分类器的权重参数设置为距离时,很直观地得到 1 作为训练结果,因为当训练数据用于测试模型的训练分数时,离测试点最近的点就变成了点本身。它们之间的距离为 0。现在,由于使用距离倒数来为投票份额(权重 = 距离参数)赋予权重,距离 0 使 n/0 = inf 得分到最近的点(点本身),因此训练结果为总是正确的,因为对最近点的无限投票使模型预测正确的类。
这是一个简短的解释,但可以从KNN的 scikit learn 文档中深入研究这个概念
推荐阅读
- c - 为什么我必须做 c-48?\a 和 %2.f 是什么意思?
- c# - 在多部分 HTTP 请求 .net 核心中将字节流式传输到远程
- reactjs - 材质 UI 可创建多选
- reactjs - 无法将道具从父级传递给子级并将其保存在子组件的状态中
- python - selenium.common.exceptions.SessionNotCreatedException:消息:未创建会话:未找到匹配的功能
- python - 如何快速获取巨大 csv 文件的最后一行(48M 行)?
- python - 使用正则表达式查找输入字符串中的所有数字序列(任意长度)
- python - 如何使用python拆分列表中的项目?
- php - 如何使用 with 关键字在 Laravel 中获取数据和关系数据?
- amazon-web-services - 令人困惑的 s3 存储桶策略上传问题