在 R 中使用插入符实现 K 最近邻

Implementing K nearest neighbors with caret in R

我正在尝试使用插入符在 R 中为这个数据集构建一个基本的 KNN 模型,但是它似乎没有工作(或者可能是?)在最后的混淆矩阵中它只使 'no' 预测,没有 'yes' 预测,这似乎是错误的。你如何正确地做到这一点?

https://archive.ics.uci.edu/ml/datasets/Bank+Marketing

> data <- read.csv("bank-additional.csv", sep=";")
> trainIndex <- createDataPartition(data$y, p=0.7, list=FALSE, times=1)
> creditTrain <- data[trainIndex,]
> creditTest <- data[-trainIndex,]
> View(creditTrain)
> View(creditTest)
> scaler <- preProcess(creditTrain, method=c("center", "scale"))
> creditTrain <- predict(scaler, creditTrain)
> creditTest <- predict(scaler, creditTest)
> knnModel <- train(y ~ age + job + education + default, data = data, method="knn")
> creditTestPredictions <- predict(knnModel, creditTest)
> confusionMatrix(creditTestPredictions, creditTest$y)
Confusion Matrix and Statistics

          Reference
Prediction   no  yes
       no  1100  135
       yes    0    0

               Accuracy : 0.8907          
                 95% CI : (0.8719, 0.9075)
    No Information Rate : 0.8907          
    P-Value [Acc > NIR] : 0.5229          

                  Kappa : 0               
 Mcnemar's Test P-Value : <2e-16          

            Sensitivity : 1.0000          
            Specificity : 0.0000          
         Pos Pred Value : 0.8907          
         Neg Pred Value :    NaN          
             Prevalence : 0.8907          
         Detection Rate : 0.8907          
   Detection Prevalence : 1.0000          
      Balanced Accuracy : 0.5000          

       'Positive' Class : no              

> 

这是一个高度不平衡的数据集,所以如果您训练的算法对所有实例都预测为否,我不会感到惊讶。

如何修复它仍然是一个不平凡的话题。我可以列出几种可能性。最常见的一种是使用交叉验证。它可能并不总是有效,但尝试一下也无妨。或者你可以使用一些惩罚来调整你的优化目标,目前你只是在优化准确性。第三,您可以对代表性不足的 class 进行上采样,直到达到平衡。