2016-04-26 1 views
1

e1071パッケージのnaiveBayes()関数を使用しようとしています。非ゼロのlaplace引数を追加すると、結果の確率の見積もりに変化はなく、理由はわかりません。naiveBayesが0以外のlaplace引数(パッケージe1071)を使用すると予期しない結果が発生する

例:

library(e1071) 

# Generate data 
train.x <- data.frame(x1=c(1,1,0,0), x2=c(1,0,1,0)) 
train.y <- factor(c("cat", "cat", "dog", "dog")) 
test.x <- data.frame(x1=c(1), x2=c(1)) 

# without laplace smoothing 
classifier <- naiveBayes(x=train.x, y=train.y, laplace=0) 
predict(classifier, test.x, type="raw") # returns (1, 0.00002507) 

# with laplace smoothing 
classifier <- naiveBayes(x=train.x, y=train.y, laplace=1) 
predict(classifier, test.x, type="raw") # returns (1, 0.00002507) 

私は「犬」クラスのすべての学習インスタンスがX1に0を持っているので、確率は、この場合には変更することが期待されます。

import numpy as np 
from sklearn.naive_bayes import BernoulliNB 

train_x = pd.DataFrame({'x1':[1,1,0,0], 'x2':[1,0,1,0]}) 
train_y = np.array(["cat", "cat", "dog", "dog"]) 
test_x = pd.DataFrame({'x1':[1,], 'x2':[1,]}) 

# alpha (i.e. laplace = 0) 
classifier = BernoulliNB(alpha=.00000001) 
classifier.fit(X=train_x, y=train_y) 
classifier.predict_proba(X=test_x) # returns (1, 0) 

# alpha (i.e. laplace = 1) 
classifier = BernoulliNB(alpha=1) 
classifier.fit(X=train_x, y=train_y) 
classifier.predict_proba(X=test_x) # returns (.75, .25) 

はなぜe1071中を使用して、この予想外の結果を得ています。これを確認するには、ここではPythonの

Pythonの例を使用して同じことですか?

答えて

3

ラプラスの見積もりは、数値的なものではなく、カテゴリのフィーチャにのみ有効です。ソースコードでは、数値の場合はガウス推定が使用されています。

## estimation-function 
est <- function(var) 
    if (is.numeric(var)) { 
     cbind(tapply(var, y, mean, na.rm = TRUE), 
       tapply(var, y, sd, na.rm = TRUE)) 
    } else { 
     tab <- table(y, var) 
     (tab + laplace)/(rowSums(tab) + laplace * nlevels(var)) 
    } 

したがって、あなたのデータを要因に変換し、あなたは良いです。

train.x <- data.frame(x1=c("1","1","0","0"), x2=c("1","0","1","0")) 
train.y <- factor(c("cat", "cat", "dog", "dog")) 
test.x <- data.frame(x1=c("1"), x2=c("1")) 

# without laplace smoothing 
classifier <- naiveBayes(x=train.x, y=train.y, laplace=0) 
predict(classifier, test.x, type="raw") # returns (100% for dog) 

# with laplace smoothing 
classifier <- naiveBayes(x=train.x, y=train.y, laplace=1) 
predict(classifier, test.x, type="raw") # returns (75% for dog) 
1

この上の主要な顔面。 naiveBayes()メソッドは数値変数としてx1x2を解釈しており、内部的にガウス条件付き確率分布を使用しようとしていました(私は思っています)。私の変数を要素として符号化することは私の問題を解決しました。

train.x <- data.frame(x1=factor(c(1,1,0,0)), x2=factor(c(1,0,1,0))) 
train.y <- factor(c("cat", "cat", "dog", "dog")) 
test.x <- data.frame(x1=factor(c(1)), x2=factor(c(1))) 
関連する問題