目标是训练一个模型来预测默认变量。使用knn3()函数训练k= 13的KNN模型,并计算测试精度。
到目前为止,我解决这个问题的代码是:
# load packages
library("mlbench")
library("tibble")
library("caret")
library("rpart")
# set seed
set.seed(49607)
# load data and coerce to tibble
default = as_tibble(ISLR::Default)
# split data
dft_trn_idx = sample(nrow(default), size = 0.8 * nrow(default))
dft_trn = default[dft_trn_idx, ]
dft_tst = default[-dft_trn_idx, ]
# check data
dft_trn
# fit knn model
mod_knn = knn3(default ~ ., data = dft_trn, k = 13)
# make "predictions" with knn model
new_obs = data.frame(balance = 421, income = 28046)
predtrn = predict(mod_knn, new_obs, type = "prob")
confusionMatrix(predtrn,dft_trn)
在代码块的最后一行,我得到错误" error:data
和reference
应该是具有相同级别的因子“。我不确定我如何解决这个问题,或者这是否是测量测试准确性的正确方法。
任何帮助都是最好的,谢谢!
发布于 2020-09-25 09:22:31
首先,作为机器学习者,你做得很好,因为一个必要的步骤是将数据拆分成训练集和测试集。我发现的问题是,您正在尝试比较来自测试和训练测试的外部数据的新预测。ML的原理是在训练数据集上训练模型,然后在测试数据集上进行预测,从而最终评估性能。您已经有了相应的数据集(dft_tst
)。这里是获取混淆矩阵的代码。需要提醒的是,如果您有一个预测标签而没有要比较的真实标签,则不会计算混淆矩阵。下面是获得所需矩阵的代码:
# load packages
library("mlbench")
library("tibble")
library("caret")
library("rpart")
# set seed
set.seed(49607)
# load data and coerce to tibble
default = as_tibble(ISLR::Default)
现在,我们分成训练集和测试集:
# split data
dft_trn_idx = sample(nrow(default), size = 0.8 * nrow(default))
dft_trn = default[dft_trn_idx, ]
dft_tst = default[-dft_trn_idx, ]
我们训练模型:
# fit knn model
mod_knn = knn3(default ~ ., data = dft_trn, k = 13)
现在,关键部分是对测试集(或任何标记集)进行预测,并获得混淆矩阵:
# make "predictions" with knn model
predtrn = predict(mod_knn, dft_tst, type = "class")
为了计算混淆矩阵,预测和原始标签必须具有相同的长度:
#Confusion matrix
confusionMatrix(predtrn,dft_tst$default)
输出:
Confusion Matrix and Statistics
Reference
Prediction No Yes
No 1929 67
Yes 1 3
Accuracy : 0.966
95% CI : (0.9571, 0.9735)
No Information Rate : 0.965
P-Value [Acc > NIR] : 0.4348
Kappa : 0.0776
Mcnemar's Test P-Value : 3.211e-15
Sensitivity : 0.99948
Specificity : 0.04286
Pos Pred Value : 0.96643
Neg Pred Value : 0.75000
Prevalence : 0.96500
Detection Rate : 0.96450
Detection Prevalence : 0.99800
Balanced Accuracy : 0.52117
'Positive' Class : No
https://stackoverflow.com/questions/64056322
复制相似问题