r语言 - 插入记号使用 knn 预测类:我是否需要为未知类提供随机类变量?



我有一个制表符分隔的文件,其中包含 70 行数据和 34 列特征,其中前 60 行如下所示:

groups x1    x2     x3    x4   x5 (etc, up to x34)
0    0.1    0.5    0.5   0.4  0.2
1    0.2    0.3    0.8   0.4  0.1
0    0.4    0.7    0.6   0.2  0.1
1    0.4    0.4    0.7   0.1  0.4

最后 10 行如下所示:

groups x1    x2     x3    x4   x5
NA    0.2    0.1    0.5   0.4  0.2
NA    0.2    0.1    0.8   0.4  0.1
NA    0.2    0.2    0.6   0.2  0.1
NA    0.2    0.3    0.7   0.1  0.4

这些组是二进制的(即每行属于组 0 或组 1(。目的是使用前 60 行作为我的训练数据集,使用后 10 行作为我的测试数据集;将最后 10 行分类为组 0 或 1。最后 10 行的类当前标记为"NA"(因为它们尚未分配给类(。

我运行了这段代码:

library(caret)
data <-read.table("data_challenge_test.tab",header=TRUE)
set.seed(3303)
train <-sample(1:60)
data.train <-data[train,]
dim(data.train)
data.test <-data[-train,]
dim(data.test)
data.train[["groups"]] = factor(data.train[["groups"]])
trctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 3)
knn_fit <- train(groups ~x1+x2+x3+x4+x5, data = data.train, method = "knn",trControl=trctrl,preProcess = c("center", "scale"),tuneLength = 10)
test_pred <- predict(knn_fit, newdata = data.test)
confusionMatrix(test_pred, data.test$groups)

test_pred输出为:

> test_pred
[1] 0 0 0 0 1 1 0 1 1 0
Levels: 0 1

混淆矩阵输出为:

> confusionMatrix(test_pred, data.test$groups)
Error in confusionMatrix.default(test_pred, data.test$groups) : 
the data cannot have more levels than the reference

然后我检查了 test_pred 和 data.test$groups 的 str

> str(test_pred)
Factor w/ 2 levels "0","1": 1 1 1 1 2 2 1 2 2 1
> str(data.test$groups)
int [1:10] NA NA NA NA NA NA NA NA NA NA

所以我明白我的错误是因为我对混淆矩阵的两个输入不是同一类型。

因此,在我的数据集中,我将"NA"列更改为随机 0 或 1(即我只是手动将前 5 个未知类随机更改为类 0,然后将后 5 个未知类更改为类 1(。

然后我重新运行了上面的代码

输出为:

> test_pred
[1] 0 0 0 0 1 1 0 1 1 0
Levels: 0 1
> confusionMatrix(test_pred, data.test$groups)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 4 2
1 1 3
Accuracy : 0.7             
95% CI : (0.3475, 0.9333)
No Information Rate : 0.5             
P-Value [Acc > NIR] : 0.1719          
Kappa : 0.4             
Mcnemar's Test P-Value : 1.0000          
Sensitivity : 0.8000          
Specificity : 0.6000          
Pos Pred Value : 0.6667          
Neg Pred Value : 0.7500          
Prevalence : 0.5000          
Detection Rate : 0.4000          
Detection Prevalence : 0.6000          
Balanced Accuracy : 0.7000          
'Positive' Class : 0  

所以我有三个问题:

  1. 最初,我所有训练数据集的类都是 0 或 1,我的测试数据集的类都被标记为 NA 或 ?。

由于上述错误,插入符号似乎不喜欢这样。当我分配我的测试数据集随机起始二进制变量而不是 NA/?,分析"有效"(因为没有错误(。

我手动随机分配给测试数据集的二进制组是否会影响混淆矩阵(或分析的任何方面?(,或者这是可以接受的?如果没有,解决方案是什么:在分析开始时,我将未分类的测试数据分配给哪个组。

  1. test_pred输出是否订购?我希望预测表的最后 10 行,test_pred的输出为:0 0 0 0 1 1 0 1 1 0。最后 10 行是否按顺序排列?

  2. 我想在解决这个问题
  3. 后可视化结果。任何人都可以推荐一个通常这样做的标准包(我是机器学习的新手(?

编辑:鉴于混淆矩阵直接使用引用和预测来计算准确性,我很确定我不能将类随机分配给未知的分类行,因为它会影响混淆矩阵的准确性。因此,希望提出替代建议。

  1. 混淆矩阵是将分类输出与实际类进行比较。因此,如果您的测试数据集没有标签,则无法绘制混淆矩阵。 还有其他方法可以检查分类算法的效果。您现在可以阅读有关AIC的信息,它类似于线性回归R平方。 如果您仍然想要混淆矩阵,请使用前 50 行进行训练,使用 50-60 行进行测试。此输出将允许您创建混淆矩阵。
  2. 是的,
  3. 输出是有序的,您可以将其列绑定到测试集。
  4. 通过绘制 ROC 曲线来完成可视化分类任务。CARET 库也应该有这个。

相关内容

最新更新