【问题标题】:ROC in Multiclass kNN多类 kNN 中的 ROC
【发布时间】:2021-02-25 20:04:55
【问题描述】:

我正在尝试对多类 knn 模型和数据集进行一些 ROC 分析

到目前为止,我有这个 kNN 模型的代码。它运作良好。
X_train_new 是一个包含 131 个数值变量(列)和 7210 个观察值的数据集。
Y_train 是我作为因素的结果变量。它是一个只有 1 列(活动)和 7210 个观察值(有 6 个可能因素)的数据集

ctrl <- trainControl(method  = "cv",
                     number  = 10)

model2 <-    train(X_train_new,
                   Y_train$activity,
                   method     = "knn",
                   tuneGrid   = expand.grid(k = 5),
                   trControl  = ctrl,
                   metric     = "Accuracy"
)

X_test_new 是一个包含 131 个数值变量(列)和 3089 个观察值的数据集。
Y_test 是我作为因子的结果变量。它是一个只有 1 列和 3089 个观测值的数据集(有 6 个可能的因素)

我运行预测函数

knnPredict_test <- predict(model2 , newdata = X_test_new )

我想对每个班级与所有班级进行一些 ROC 分析。我正在尝试

a = multiclass.roc ( Y_test$activity, knnPredict_test )

knnPredict_test 是一个带有预测类的向量:

knnPredict_test <- predict(model2 ,newdata = X_test_new )
> length(knnPredict_test)
[1] 3089
> glimpse(knnPredict_test)
 Factor w/ 6 levels "laying","sitting",..: 2 1 5 1 3 2 4 5 3 2 ...

这是我遇到的错误

Error in roc.default(response, predictor, levels = X, percent = percent,  :   
Predictor must be numeric or ordered.

【问题讨论】:

  • 错误消息似乎相当强调和信息丰富。在我看来,这似乎也完全可以理解。如果您不这么认为,那么请比您迄今为止尝试的更详细地描述如何使用无序预测器构建 ROC 曲线?

标签: r r-caret roc


【解决方案1】:

要获得 ROC,您需要一个数字预测。但是,默认情况下predict 会给你预测的类。使用type = "prob"

这是一个具有相同错误的可重现示例。

library(caret)

knnFit <- train(
  Species ~ .,
  data = iris,
  method = "knn"
)

predictions_bad <- predict(knnFit)

pROC::multiclass.roc(iris$Species, predictions_bad)
#> Error in roc.default(response, predictor, levels = X, percent = percent,  : 
#>   Predictor must be numeric or ordered.

使用type = "prob" 修复错误。

predictions_good <- predict(knnFit, type = "prob")

pROC::multiclass.roc(iris$Species, predictions_good)
#> Call:
#> multiclass.roc.default(response = iris$Species, predictor = predictions_good)
#> 
#> Data: multivariate predictor predictions_good with 3 levels of iris$Species: setosa, versicolor, virginica.
#> Multi-class area under the curve: 0.9981

【讨论】:

  • 我不需要将测试数据添加到预测函数中吗? knnPredict_test_1 &lt;- predict(model2, newdata = X_test_new, type = "prob")
  • 是的。我的例子被简化了。
猜你喜欢
  • 2013-03-08
  • 2020-01-14
  • 2013-02-27
  • 2012-07-10
  • 2012-07-29
  • 2016-08-06
  • 2018-01-02
  • 2020-10-01
  • 2021-07-30
相关资源
最近更新 更多