2017-06-05 19 views
1

naive bayesアルゴリズムに問題があり、その理由を見つけることができません。私はオンラインチュートリアルを試したので、始めにトレーニングデータを作成し始めました。下のコードでは、トレーニングデータはごくわずかですが、同じ問題です。感情分析RドイツのNaive Bayes

pos_tweets = rbind(
    c('Ich liebe das auto', 'positive'), 
    c('Diese Aussicht ist großartig', 'positive'), 
    c('toller morgen', 'positive'), 
    c('ich freue mich so', 'positive'), 
    c('du bist aber lieb, danke', 'positive') 
) 

neg_tweets = rbind(
    c('ich hasse autos', 'negative'), 
    c('der blick ist horror', 'negative'), 
    c('voll müde heute', 'negative'), 
    c('schreckliche stille', 'negative'), 
    c('er ist ein feind', 'negative') 
) 

test_tweets = rbind(
    c('Schöne Momente erlebt', 'positive'), 
    c('zusammen macht es gleich doppelt spass', 'positive'), 
    c('Yeah, toller Tag', 'positive'), 
    c('Super schöne Umgebung', 'positive'), 
    c('es zieht ein leichter wind auf, sehr angenehm', 'positive') 
) 

tweetsbind = rbind(pos_tweets, neg_tweets, test_tweets) 

matrix1= create_matrix(tweetsbind[,1], language="german", 
         removeStopwords=FALSE, removeNumbers=TRUE, 
         stemWords=FALSE) 
mat1 = as.matrix(matrix1) 

今、私は私のモデルを訓練:

classifier1 = naiveBayes(mat1[1:10,], as.factor(tweetsbind[1:10,2])) 

そして今、私はそれを使用したい:

predicted = predict(classifier1, mat1[11:15,]); predicted 

私は私のモデルに見てみると、それはかなり良い見て、負の単語ので、負のものとしてマークされ、正のものはプラスのものとしてマークされる。

しかし、モデルを使用してテストデータを分析している間は、ステートメントが明らかに陽性であり、使用された単語がトレーニングセットにも存在する場合でも、マイナスを出力します。


私の新しいコードは次のとおりです。

# search for some twitter data 
happy <- searchTwitter(":)",n = 10000, lang ='de') 
happy_text <- sapply(happy, function (x) x$getText()) 
sad <- searchTwitter(":(",n = 10000, lang ='de') 
sad_text <- sapply(sad, function (x) x$getText()) 

# create the matrix 
tweets <- rbind(sad_text[1:2500,], happy_text[1:2500,]) # if I use more training data, I get a storage error 
tweet <- as.matrix(tweets) 
matrix= create_matrix(tweet[,2], language= "german", removeStopwords=FALSE, removeNumbers=TRUE, stemWords=FALSE) 
matrixdoc = as.matrix(matrix) 

# transform to factor and train the model 
X <- as.data.frame(matrixdoc[1:5000,]) 
X$out <- as.factor(tweet[1:5000,3]) 
X <- as.data.frame(lapply(X, factor)) 
classifierstack <- naiveBayes(out ~ ., data=X) 

# predict 
predicted = predict(classifierstack, mat1[11:15,],type = "raw") 

そして、これが結果です:私のすべての入力が非常にpositivている場合でも、すべてイストnegativ、(私はそれらを変更)。

 negativ  positiv 
[1,]  1 5.828223e-176 
[2,]  1 4.110223e-244 
[3,]  1 3.274458e-244 
[4,]  1 3.534996e-176 
[5,]  1 0.000000e+00 

そして、私はこのしようとした場合:

> predict(classifierstack, "zeigt", type = "raw") 
    negativ positiv 
[1,]  0.5  0.5 

- >をそれは常に0.5 0.5を出力し、常に最後にnegativです:/

+0

あなたは 'e1071'パッケージから' naiveBayes'を使っていますか? – ekstroem

+0

はい、e1071パッケージを使用しています –

+0

更新が再現できないため、データに何が問題になるかはわかりません。 'testS'とは何ですか?元のデータ/質問について、私が下で行ったのと同じ結果を得ましたか? – ekstroem

答えて

0

あなたがトレーニングデータを欠いています。私はあなたのコードを実行した場合、私は

> predicted = predict(classifier1, mat1[11:15,]); predicted 
[1] negative negative negative positive negative 
Levels: negative positive 

だから最初の2つの要素が間違っている得る - 最後の3つは確かに、ネガティブポジティブとネガティブにする必要があります。私たちが言う、で見つかった単語の分類器情報を見れば、 doof feindeシンドは、私たちは本当に分類する何も情報がなく、最初のレベルのカテゴリ、negativeがデフォルトになりますので、そこ

       feinde 
as.factor(tweetsbind[1:10, 2]) [,1] [,2] 
         negative 0 0 
         positive 0 0 

           sind 
as.factor(tweetsbind[1:10, 2]) [,1] [,2] 
         negative 0 0 
         positive 0 0 

           doof 
as.factor(tweetsbind[1:10, 2]) [,1] [,2] 
         negative 0 0 
         positive 0 0 

を見つけます。あなたが予測したい単語とそれがうまくいくはずの単語との間に重複がある場合は、より多くの情報を提供してください。


更新あなたは

> predicted = predict(classifier1, mat1[11:15,], type="raw"); predicted 
     negative  positive 
[1,] 9.999959e-01 4.093637e-06 
[2,] 7.329224e-01 2.670776e-01 
[3,] 1.000000e+00 4.598781e-11 
[4,] 9.898881e-05 9.999010e-01 
[5,] 1.000000e+00 1.608783e-16 

を実行するなら、あなたは、個々の確率を見ることができます。 "問題"とは、入力が数値である(バイナリファクタではない)ため、(行ごとの)条件付き確率が1になる条件付き確率は表示されません。 naiveBayesのマニュアルページによると、ガウスの平均とsdsが得られます。あなたは、このような条件付き確率を取得することができます:

X <- as.data.frame(mat1[1:10,]) 
X$out <- as.factor(tweetsbind[1:10,2]) 
X <- as.data.frame(lapply(X, factor)) 
naiveBayes(out ~ ., data=X) 

これはあなたに

  hab 
Y   0 
    negative 1 
    positive 1 
      dich 
Y   0 
    negative 1 
    positive 1 
      lieb 
Y   0 1 
    negative 1.0 0.0 
    positive 0.8 0.2 

それらを与えるP(リーブ|正)ある確率とあなたが確率を反転させるためにあなたにベイズ式を必要とします。

訓練とテストの両方の項目に単語が存在しないときに少し改善が見られるようにするためのGoogleの「問題はありません」と「ナイーブベイ」(laplace引数を参照)。

+0

お返事ありがとうございます、それはすでに私の多くを助けました! あなたが説明したケース私は理解していますが、 "c( 'hab dich lieb'、 'positive')の文を見ると、トレーニングセットに文が含まれているため、通常" lieb "なぜなら、この文が否定的であることをアルゴリズムが返す理由がわからないからです。 lieb as.factor(tweetsbind [1:10、2])[、1] [、 2] 負0.0 0.0000000 正0.2 0.4472136 –

+0

ええ、確率を向上させない2つの単語があります。私は答えを更新します – ekstroem

+0

ありがとうございます、私はあなたのコードを使用する場合は、 5000トレーニングデータのつぶやきでそれを試しました >予測 negativ positiv [1] 1 2.610912e-223 [2] 1 1.147911e-223 [3] 1 2.610912e-223 [4] 1 2.610912e-223 [5] 1 8.703038 e-224 –