R:两个(显然相同的)knn 模型 return 不同的数据
R: Two (apparently same) knn models return different data
我正在使用 R class 包中的 knn 方法创建一个 knn class化模型:
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
时,混淆 table 是不同的:
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 returns 同一个数据有两个不同的模型?我做错了什么?
谢谢!
设置 R 的随机数生成器的种子,这对于创建可以复制的模拟或随机对象很有用。
如果您尝试 运行 与
相同的型号
set.seed(123)
它应该return 相同的结果。
使用 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
做两次完全相同的事情,你还需要设置两次种子。
我正在使用 R class 包中的 knn 方法创建一个 knn class化模型:
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
时,混淆 table 是不同的:
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 returns 同一个数据有两个不同的模型?我做错了什么?
谢谢!
设置 R 的随机数生成器的种子,这对于创建可以复制的模拟或随机对象很有用。
如果您尝试 运行 与
相同的型号set.seed(123)
它应该return 相同的结果。
使用 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
做两次完全相同的事情,你还需要设置两次种子。