我正在使用R class包中的knn metod创建一个knn分类模型:
impens_test_pred <- knn(train = train_set, test = test_set, cl = train_set_labels$cleavage, k = 5)
impens_test_pred2 <- knn(train = train_set, test = test_set, cl = train_set_labels$cleavage, k = 5)
但是当我为模型调用ggmodels.CrossTable
时,混淆表是不同的:
CrossTable(x = test_set_labels$cleavage, y = impens_test_pred, prop.chisq=FALSE)
CrossTable(x = test_set_labels$cleavage, y = impens_test_pred2, prop.chisq=FALSE)
|-------------------------|-----------|-----------|-----------|
|test_set_labels$cleavage | FALSE | TRUE | Row Total |
|-------------------------|-----------|-----------|-----------|
| FALSE | 266 | 1 | 267 |
| | 0.996 | 0.004 | 0.853 |
| | 0.875 | 0.111 | |
| | 0.850 | 0.003 | |
|-------------------------|-----------|-----------|-----------|
| TRUE | 38 | 8 | 46 |
| | 0.826 | 0.174 | 0.147 |
| | 0.125 | 0.889 | |
| | 0.121 | 0.026 | |
|-------------------------|-----------|-----------|-----------|
| Column Total | 304 | 9 | 313 |
| | 0.971 | 0.029 | |
|-------------------------|-----------|-----------|-----------|
|-------------------------|-----------|-----------|-----------|
|test_set_labels$cleavage | FALSE | TRUE | Row Total |
|-------------------------|-----------|-----------|-----------|
| FALSE | 266 | 1 | 267 |
| | 0.996 | 0.004 | 0.853 |
| | 0.869 | 0.143 | |
| | 0.850 | 0.003 | |
|-------------------------|-----------|-----------|-----------|
| TRUE | 40 | 6 | 46 |
| | 0.870 | 0.130 | 0.147 |
| | 0.131 | 0.857 | |
| | 0.128 | 0.019 | |
|-------------------------|-----------|-----------|-----------|
| Column Total | 306 | 7 | 313 |
| | 0.978 | 0.022 | |
|-------------------------|-----------|-----------|-----------|
为什么knn会为同一数据返回两个不同的模型?我做错了什么?
谢谢!
答案 0 :(得分:3)
设置R的随机数生成器的种子,这对于创建可以再现的模拟或随机对象非常有用。
如果您尝试使用
运行相同的模型 set.seed(123)
它应该返回相同的结果。
答案 1 :(得分:1)
使用set.seed
时请注意以下行为:
set.seed(123)
sample(1:9, 1) # will always return 3
sample(1:9, 1) # will always return 8
因此,如果您希望两个样本相同,则必须将种子设置两次:
set.seed(123)
sample(1:9, 1) # returns 3
set.seed(123)
sample(1:9, 1) # returns 3 again
此行为自然会扩展到使用随机化的sample
以外的函数。因此,如果您希望knn
两次执行完全相同的操作,则还需要将种子设置两次。