混同行列を用いた[R,大きな分岐]評価モデルの評価


資料
上の資料を参考にしました.

緒論

  • 混同行列は分類モデルを評価する指標である.
  • 混同行列は,解析モデルで求めた分類の予測種別とデータの実際の分類種別をクロステーブル形式に整理した行列または評価指標である.

  • 依存変数は汎用モデルであることに注意してください.
    ここではRのIonosphereデータを用いて予測値を作成する.
    混同行列を用いて両者を比較した.

    パッケージのインストール


    必要なコースはすべて事前にダウンロードされます.
    install.packages("mlbench")
    install.packages("rlang")
    install.packages("caret")
    install.packages("randomForest")
    
    library(mlbench)
    data(Ionosphere)
    df = Ionosphere

    データ配信


    「融合マトリクス」(ConfusionMatrix)はcaretパッケージに含まれています.
    seedを設定してランダム値を抽出する必要があります.
    set.seed(2)
    
    library(caret)
    idx = caret::createDataPartition(df$Class, p = 0.7)
    df_train = df[idx$Resample1, ] 
    df_test = df[-idx$Resample1, ]
    インデックス変数idxを作成します.
    p=0.7は70%を基準とする
    トレーニングデータ:7、テストデータ:3、これは7対3を意味します.
    念のため本物かどうかを検証します!
    nrow(Ionosphere)
    
    nrow(df_train)
    nrow(df_test)
    Ionosphereの合計列数は351で、両方の和が完全に一致していることがわかります.
    > nrow(Ionosphere)
    [1] 351
    > nrow(df_train)
    [1] 247
    > nrow(df_test)
    [1] 104

    ロジック回帰モデル


    今回はそれをLogistic回帰モデルに適用し,値を予測する.
    model_glm = glm(Class ~ . , data = subset(df_train, select = c(-V1, -V2)), family = "binomial")
    pred_glm_test = predict(model_glm, newdata = df_test, type = "response")
    
    head(pred_glm_test)
    前述したように,混同行列を用いるためには,従属変数がカテゴリに属さなければならない.
    また,論理回帰モデルの依存変数はカテゴリ化されているため,クラスを依存変数に設定し,残りを独立変数に設定する.
    サブセットを使用してV 1およびV 2列を削除し、論理回帰モデルを作成します.
    次は予測で、予測関数を使用します.
    論理回帰モデルmodel_glm回帰式とテストデータdf_testを追加
    predicate関数でtype=「response」と入力し、予測を行い、0~1の確率で解きます.
    > head(pred_glm_test)
            1         8        11        13        16        20 
    0.9160221 0.6103701 0.9757966 0.9897865 0.1838459 0.8888246 
    予測結果のデータ.
    pred_glm_test_class = factor(ifelse(pred_glm_test >= 0.5, 1, 0))
    levels(pred_glm_test_class) <- c("bad", "good")
    
    head(pred_glm_test_class)
    混同行列を使用するには、予測結果を因子型に変更する必要があります.
    BUMZU型にする
    ここで、中間値を0.5に設定し、0.5以上1に近い場合は「good」、0.5未満または0に近い場合は「bad」に設定します.
    > head(pred_glm_test_class)
       1    8   11   13   16   20 
    good good good good  bad good 
    Levels: bad good
    次に,この予測モデルを混同行列に入れて評価した.
    ConfusionMatrix関数の最初のパラメータは予測データであり、2番目のパラメータは実際のデータである.
    cfm_glm = caret::confusionMatrix(pred_glm_test_class, df_test$Class)
    cfm_glm
    > cfm_glm
    Confusion Matrix and Statistics
    
              Reference
    Prediction bad good
          bad   23    4
          good  14   63
                                              
                   Accuracy : 0.8269          
                     95% CI : (0.7403, 0.8941)
        No Information Rate : 0.6442          
        P-Value [Acc > NIR] : 3.278e-05       
                                              
                      Kappa : 0.5981          
                                              
     Mcnemar's Test P-Value : 0.03389         
                                              
                Sensitivity : 0.6216          
                Specificity : 0.9403          
             Pos Pred Value : 0.8519          
             Neg Pred Value : 0.8182          
                 Prevalence : 0.3558          
             Detection Rate : 0.2212          
       Detection Prevalence : 0.2596          
          Balanced Accuracy : 0.7810          
                                              
           'Positive' Class : bad             
    Accouncyから精度がわかります.
    このモデルの予測精度は0.8269であり,82.69%と考えられる.

    ランダム森林


    今回はランダムな森で予測してみましょう.
    library(randomForest)
    model_rf = randomForest(Class ~ . , data = subset(df_train, select = c(-V1, -V2) ))
    pred_rf_test = predict(model_rf, newdata = df_test, type="response")
    cfm_rf = caret::confusionMatrix(pred_rf_test, df_test$Class)
    
    head(pred_rf_test)
    儀式自体が同じなので、あまり違いはありません.ランダム森林モデルを使用するだけです.
    > head(pred_rf_test)
       1    8   11   13   16   20 
    good  bad good good  bad  bad 
    Levels: bad good
    headの結果は同じです
    しかし、混同行列の結果は異なる.
    > cfm_rf
    Confusion Matrix and Statistics
    
              Reference
    Prediction bad good
          bad   32    2
          good   5   65
                                              
                   Accuracy : 0.9327          
                     95% CI : (0.8662, 0.9725)
        No Information Rate : 0.6442          
        P-Value [Acc > NIR] : 5.263e-12       
                                              
                      Kappa : 0.8505          
                                              
     Mcnemar's Test P-Value : 0.4497          
                                              
                Sensitivity : 0.8649          
                Specificity : 0.9701          
             Pos Pred Value : 0.9412          
             Neg Pred Value : 0.9286          
                 Prevalence : 0.3558          
             Detection Rate : 0.3077          
       Detection Prevalence : 0.3269          
          Balanced Accuracy : 0.9175          
                                              
           'Positive' Class : bad   
    ランダムツリー分類の精度は93.27%,精度は0.9327であった.
    結果は,論理回帰モデルよりも優れていることを示した.