machine-learning - 如何为 KNeighborsClassifier 选择权重函数
问题描述
我正在学习 kNN 模型的超参数,并且遇到了“距离”和“均匀”权重函数参数。
我的理解是,在模型经过训练以计算预测(通过权衡邻居的投票)之后,将使用权重函数。所以我的问题如下:
我对仅用于预测(而不是在训练期间)的权重函数的理解是否正确?
似乎使用“距离”总是能提供接近 100% 的训练准确率,这是否意味着使用“距离”函数会导致过度拟合?
什么时候应该使用“距离”而不是“均匀”?
解决方案
参数weights
的使用位置
您对weights
参数的理解是正确的,它只影响预测步骤。它仅用于加权每个最近邻居的投票以确定预测标签。
完全准确地说,KNeighborsClassifier
除了将训练数据保存到内存之外,实际上并没有执行任何训练,因此显然weights
参数在这里没有发挥作用。
uniform
和之间的区别distance
预计使用weights="distance"
确实会更容易过度拟合。这样做的原因是,它可能会过度优先考虑最近的邻居,而如果其他最近的邻居距离较远,则忽略它们。weights="uniform"
另一方面(这是默认设置)确保即使一些最近的邻居离得更远一点,它们仍然对预测有同样的影响。
这很好地说明了偏差-方差权衡。实际上,distance
通过降低不太相似的数据点的权重来减少偏差,但这样做会增加方差,因为预测更多地依赖于训练样本的各个数据点。uniform
相反,它通过确保每个最近的邻居具有相同的贡献来减少方差,从而减少对单个训练数据点的依赖性,但代价是平等考虑最近的邻居,这些最近的邻居最终可能离观察结果仍然很远标签,这会导致更大的回报偏差。
总而言之,distance
当您觉得您的模型欠拟合时,您可能想要选择,这可能以许多“平均”预测为特征。
推荐阅读
- nlp - 在 google colab 上保存 gensim doc2vec 训练模型
- angular - 错误:无法处理请求 Angular 9 Universal + Firebase Function
- firebase - 我可以使用 Firebase 的身份验证来保护我自己的私有服务器上的数据吗?
- python - 我如何从屏幕pygame的每一侧产生敌人?
- oauth-2.0 - OpenID Connect:如何在客户端凭证流中添加自定义声明数据
- maven - 术语“测试”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。YML 文件
- android - 如何将字体样式添加到textview android kotlin
- html - svg边框中的iframe响应
- python-3.x - 完整的 Jupyter Notebook 性能分析
- maven-plugin - 如何在 liquibase 的另一个主更改日志文件中包含主更改日志文件