为何固定k值时class::knn()与kknn::kknn()输出结果存在差异
问题解答
编码正确性判定
你的代码没有逻辑错误,训练集/测试集拆分、入模特征、k值、距离类型、无权重核的配置完全符合一致实验的对照要求。
结果差异的核心原因
- 投票平局的处理规则不同
class::knn()在k个邻居的类别投票数相等时,会从平局类别中随机选择一个作为预测结果,输出受全局随机种子影响;kknn::kknn()在平局时默认选择因子水平排序更靠前的类别,无随机逻辑,输出固定。 - 距离并列时的截断规则不同
kknn::kknn()默认启用use.all = TRUE参数:如果第k个和第k+1个(及更多)邻居到测试样本的距离完全相等,会将所有距离并列的邻居全部纳入投票池,实际参与投票的邻居数可能大于设置的k值。class::knn()只会严格取距离最近的前k个邻居,哪怕最后几位距离相等也不会扩容投票池。
对齐结果的调整方法
你可以修改kknn的调用参数缩小二者差异:
the_knn <- kknn( Direction ~ Lag1 + Lag2, Smarket_train, Smarket_test, k = the_k, distance = 2, kernel = "rectangular", use.all = FALSE )
设置use.all = FALSE后,kknn会严格限制投票邻居数为k,此时二者仅在出现投票平局时会有结果差异,同时固定两次调用的全局随机种子即可让输出完全匹配。
内容的提问来源于stack exchange,提问作者itsMeInMiami
相关产品推荐
相关产品推荐

