为何相同训练测试数据下重复运行class::knn会得到不同结果?
KNN两次运行结果不一致的原因
核心原因是投票平局时的随机选择机制:当某个测试样本的k个近邻中,多个类别的得票数相等时,class包的knn()函数会随机挑选一个类别作为预测结果。这种随机性会导致相同输入下,两次运行的预测结果出现细微差异,最终反映在准确率的变化上。
比如你用k=5时,可能存在部分测试样本的近邻投票结果是2票A、2票B、1票C的情况,此时函数会在A和B中随机选一个,两次运行的随机选择结果可能不同,进而影响整体准确率。
解决办法
- 固定随机种子:在代码开头或调用
knn()前设置set.seed(),让随机选择的结果固定,这样两次运行就能得到一致的准确率。示例代码如下:
library(class) set.seed(123) # 固定随机种子,数值可任意指定 train <- sample(150, 50) iris_train <- iris[train, 1:4] iris_test <- iris[-train, 1:4] y_train <- iris[train, 5] y_test <- iris[-train, 5] knn.pred <- knn(iris_train, iris_test, y_train, k = 5) mean(knn.pred == y_test) knn.pred <- knn(iris_train, iris_test, y_train, k = 5) mean(knn.pred == y_test)
- 调整k值:选择能避免投票平局的k值,比如使用奇数k且确保多数类得票明确,减少随机选择的场景。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

