SVMを最適化して、バイナリ分類での偽陰性を回避


9

私はScikit学習を使用してSVMバイナリ分類器をトレーニングしています。

私の問題の性質上、私は偽陰性を避ける必要があります。何も無料ではないので、偽陰性の数を減らすために偽陽性率を高くしても大丈夫です。どうすればそれができますか(理想的にはScikit学習で)

つまり、SVM分類器を使用して偽陰性を最小限に抑えるにはどうすればよいでしょうか。偽陰性よりも偽陽性を優先するためにハイパーパラメータを調整する方法はありますか?


2
SVMを最適化する方法を変更する必要はありません。観測値を否定または肯定として宣言する決定値を変更するだけです。好みに合わせて調整してください。
Sycoraxは、モニカを2017

@Sycorax詳細について教えてください。
Pierre-Antoine

3
SVMの出力は、実数、つまり超平面からの(符号付きの)距離です。決定関数は、のためにと言っている、それは肯定的です。それ以外の場合、特定のについては負の値です。を変更して、混同行列の内容/ TPR、FPR、FNR、TNRの推定値を変更できます。バツバツ>ccc
Sycoraxは、モニカを2017

1
この質問は、sklearnでこれを行う方法ではなく、より一般的な統計または数学の原則を強調した場合、より正直に話題になると思います。(私のコメントは、その核心において、この質問は本質的に統計的であることを実証していると思います。)
Sycoraxは、Reinstate Monicaを

Sycoraxの提案に従って編集してください。コメントの輪郭を描かれた回答が示すように、それはここで回答可能になります。
Glen_b-モニカを2017

回答:


4

SVMバイナリ分類器のScikit学習実装では、他のコメント/返信が示唆しているように、カットオフしきい値を設定できません。クラスの確率を与えるのではなく、デフォルトのカットオフを適用してクラスのメンバーシップを与えます(例:1または2)。

偽陰性を最小限に抑えるには、陽性クラスとしてラベル付けされたトレーニングサンプルに高い重みを設定できます。デフォルトでは、すべてのクラスの重みが1に設定されています。これを変更するには、hyper-parameterを使用しますclass_weight

理想的には、カットオフの選択を避け、分類子に基づいて決定するときに適用するカットオフを決定できるエンドユーザーにクラス確率を提供するだけです。

分類子を比較するためのより良いメトリックは、適切なスコアリング関数です。https://en.wikipedia.org/wiki/Scoring_ruleおよびscore()svm分類子モジュールのメソッドを参照してくださいsklearn.svm.SVC


1

多くの予測モデルと同様に、SVMは確率スコアを出力し、確率にしきい値を適用して、正または負のラベルに変換します。

@Sycoraxがコメントで述べたように、カットオフしきい値を調整して、偽陽性と偽陰性の間のトレードオフを調整できます。

これがRの例です。

library(kernlab)
library(mlbench)
graphics.off()
set.seed(0)

d=mlbench.2dnormals(500)
plot(d)
# using 2nd order polynominal expansion
svp <- ksvm(d$x,d$classes,type="C-svc",kernel="polydot",
            kpar=list(degree=2),C=10,prob.model=T)
plot(svp)

p=predict(svp,d$x, type="prob")[,1]

cut_off=0.5
caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))

cut_off=0.8
caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))

を変更するcut_offと、混同行列(偽陽性、偽陰性など)が変化することに注意してください。

> caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))
Confusion Matrix and Statistics

          Reference
Prediction   1   2
         1 253  16
         2  38 193

               Accuracy : 0.892           
                 95% CI : (0.8614, 0.9178)
    No Information Rate : 0.582           
    P-Value [Acc > NIR] : < 2.2e-16       

                  Kappa : 0.7813          
 Mcnemar's Test P-Value : 0.004267        

            Sensitivity : 0.8694          
            Specificity : 0.9234          
         Pos Pred Value : 0.9405          
         Neg Pred Value : 0.8355          
             Prevalence : 0.5820          
         Detection Rate : 0.5060          
   Detection Prevalence : 0.5380          
      Balanced Accuracy : 0.8964          

       'Positive' Class : 1               


> cut_off=0.8

> caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))
Confusion Matrix and Statistics

          Reference
Prediction   1   2
         1 223  46
         2  10 221

               Accuracy : 0.888          
                 95% CI : (0.857, 0.9143)
    No Information Rate : 0.534          
    P-Value [Acc > NIR] : < 2.2e-16      

                  Kappa : 0.7772         
 Mcnemar's Test P-Value : 2.91e-06       

            Sensitivity : 0.9571         
            Specificity : 0.8277         
         Pos Pred Value : 0.8290         
         Neg Pred Value : 0.9567         
             Prevalence : 0.4660         
         Detection Rate : 0.4460         
   Detection Prevalence : 0.5380         
      Balanced Accuracy : 0.8924         

       'Positive' Class : 1      
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.