在R中用尖号实现K个最近的邻居

时间:2019-03-04 00:36:04

标签: r r-caret knn

我正在尝试使用插入符号在R中为此数据集构建一个基本的KNN模型,但是它似乎不起作用(或者可能是吗?)最后,在混淆矩阵中,它仅使“否”预测,没有“是”,这似乎是错误的。您如何正确执行此操作?

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              

> 

1 个答案:

答案 0 :(得分:0)

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

如何解决它仍然是一个不重要的话题。我可以列举一些可能性。最常见的一种是使用交叉验证。它可能并不总是有效,但尝试时不会受到伤害。或者您可以使用一些惩罚来调整您的优化目标,当前您只是在优化精度。第三,您可以对代表性不足的课程进行升采样,直到达到平衡为止。