2017-12-19 24 views
0

インターネットには非常に複雑な例があります。私は自分のコードにそれらを適用できませんでした。私は14の独立変数と1つの従属変数からなるデータセットを持っています。私はRで分類しています。私のコードは以下の通りです:Rのnaive bayes分類アルゴリズムのrocカーブ解析はどのように実装できますか?

dataset <- read.table("adult.data", sep = ",", na.strings = c(" ?")) 
colnames(dataset) <- c("age", 
         "workclass", 
         "fnlwgt", 
         "education", 
         "education.num", 
         "marital.status", 
         "occupation", 
         "relationship", 
         "race", 
         "sex", 
         "capital.gain", 
         "capital.loss", 
         "hours.per.week", 
         "native.country", 
         "is.big.50k") 
dataset = na.omit(dataset) 

library(caret) 
set.seed(1) 
traning.indices <- createDataPartition(y = dataset$is.big.50k, p = 0.7, list = FALSE) 
training.set <- dataset[traning.indices,] 
test.set <- dataset[-traning.indices,] 

################################################################### 
## Naive Bayes 
library(e1071) 
classifier = naiveBayes(x = training.set[,-15], 
            y = training.set$is.big.50k) 

prediction = predict(classifier, newdata = test.set[,-15]) 

cm <- confusionMatrix(data = prediction, reference = test.set[,15], 
         positive = levels(test.set$is.big.50k)[2]) 

accuracy <- sum(diag(as.matrix(cm)))/sum(as.matrix(cm)) 

sensitivity <- sensitivity(prediction, test.set[,15], 
          positive = levels(test.set$is.big.50k)[2]) 

specificity <- specificity(prediction, test.set[,15], 
          negative = levels(test.set$is.big.50k)[1]) 

私はこれを試しました。出来た。間違いはありますか?変換プロセスに問題はありますか? (as.numeric()メソッドの場合)
ライブラリ(ROCR) pred <予測(as.numeric(予測)as.numeric(test.set [、15])) perf <パフォーマンス= "tpr"、x.measure = "fpr") plot(perf、main = "NBのROC曲線"、 col = "青"、lwd = 3) abline(a = 0、b = 1、lwd = 2、LTY = 2)

+0

あなたは 'brms' Rパッケージを知っていますか? – patL

+0

私は分類をしています。回帰パッケージです。 @patL – FK7

答えて

0

これを試してください:

set.seed(1) 
library(data.table) 
amount = 100 
dataset = data.table(
    x = runif(amount, -1, 1) 
    ,y = runif(amount, -1, 1) 
) 
# inside the circle with radius 0.5? -> true, otherwise false 
dataset = dataset[, target := (sqrt(x^2 + y^2) < 0.5)] 
plot(dataset[target == F]$x, dataset[target == F]$y, col="red", xlim = c(-1, 1), ylim = c(-1, 1)) 
points(dataset[target == T]$x, dataset[target == T]$y, col="green") 

library(caret) 

traning.indices <- createDataPartition(y = dataset$target, p = 0.7, list = FALSE) 
training.set <- dataset[traning.indices,] 
test.set <- dataset[-traning.indices,] 

################################################################### 
## Naive Bayes 
library(e1071) 
classifier = naiveBayes(x = training.set[,.(x,y)], 
         y = training.set$target) 

prediction = predict(classifier, newdata = test.set[,.(x,y)], type="raw") 
prediction = prediction[, 2] 
test.set = test.set[, prediction := prediction] 

TPrates = c() 
TNrates = c() 
thresholds = seq(0, 1, by = 0.1) 
for (threshold in thresholds) { 
    # percentage of correctly classified true examples 
    TPrateForThisThreshold = test.set[target == T & prediction > threshold, .N]/test.set[target == T, .N] 
    # percentage of correctly classified false examples 
    TNrateForThisThreshold = test.set[target == F & prediction <= threshold, .N]/test.set[target == F, .N] 

    TPrates = c(TPrates, TPrateForThisThreshold) 
    TNrates = c(TNrates, TNrateForThisThreshold) 
} 

plot(1-TNrates, TPrates, type="l") 

備考:

「確率的予測」の予測がある場合にのみ、ROC曲線をプロットすることができます。たとえTRUEまたはFALSEしかないものを予測したいとしても、0と1の間の数値) - >予測ラインに 'type = "raw"'を入れる必要があります。は、予測が 'TRUE'または 'FALSE'ではなく、0から1の間の数字で、TRUE/FALSEの予測は'numericPrediction> = 0.5'すなわち、確率が閾値を超える場合、それは「TRUE」と予測され、そうでない場合は「FALSE」と予測される。

「0.5」は予測変数の正しい値ですか?それは0.7または0.1ではありませんか?正しい!私たちは、どの閾値が正しいかを知ることはできません。それで、私たちは「すべてを試してみました」(私は0、0.1、0.2、...、0.9、1を試しただけです)、これらのすべてのしきい値を持つ混乱行列を作成します。このようにして、プレディクタがどのようにしてを実行するかを、しきい値とは独立して見ることができます。線が完全な分類器(矩形、すなわち100%が1特異性の0%で呼び出される)の方向に「盛り上がる」場合、分類器はより良好に実行される。

軸を解釈する!

Y軸は、実際にポジティブな例のどれがプレディクタが検出したのですか?

X軸の意味:予測子が予測を費やしたのはどれほど無駄でしたか?

I.e.本当の例が見つかった場合(例えば、病気を予測する場合は、実際に病気にかかっているすべての患者が実際に検出されるようにしなければなりません。そうでなければ、予測子全体が取り消されます)。しかし、みんなを「真」と予測するだけでは助けにならない!治療は有害であるか、単に費用がかかります。したがって、我々はプレーヤーに対抗しなければならない(リコール=検出された真理の率、1スペック=予測子の無駄の割合)ROC曲線上の各点は、考え得る1つの予測子である。今度は、ROC曲線上のポイントを選択し、このポイントの原因となったしきい値を確認し、最後にこのしきい値を使用する必要があります。

0

ROC曲線が機能するには、しきい値またはハイパーパラメータが必要です。

ベイズ分類器の数値出力はあまりにも信頼性が低い(バイナリ決定は通常OKですが)傾向があり、明らかなハイパーパラメータはありません。あなたは、あなたの事前確率を扱うことができます(バイナリ問題でのみ!)をパラメータとして使用し、それに対するROC曲線をプロットします。

しかし、いずれの手段によっても、カーブが存在するためには、カーブパラメータtからTPR、FPRまでのマップが必要です。たとえば、あなたの前にすることができます。

関連する問題