web-dev-qa-db-ja.com

Naive Bayesでtf-idfを使用する方法は?

私がここに投稿しているクエリに関する私の検索によると、私は解決策を提案する多くのリンクを持っていますが、これがどのように行われるべきかについて正確に言及していません。たとえば、次のリンクを調べました。

リンク1

リンク2

リンク

リンク4

等.

したがって、ここでは、tf-idfを使用したナイーブベイズ式をどのように使用できるかについての理解を示しています。これは次のとおりです。

単純ベイズ式:

P(Word|class)=(Word_count_in_class + 1)/(total_words_in_class+total_unique_words_in_all_classes(basically vocabulary of words in the entire training set))

tf-idfの重み付けは、上記の式で次のように使用できます。

Word_count_in_class : sum of(tf-idf_weights of the Word for all the documents belonging to that class) //basically replacing the counts with the tfidf weights of the same Word calculated for every document within that class.

total_words_in_class : sum of (tf-idf weights of all the words belonging to that class) 

total_unique_words_in_all_classes : as is.

この質問はスタックオーバーフローに何度も投稿されていますが、これまでのところ実質的な回答はありません。私が問題について考えている方法が正しいかどうか、つまり上記で示した実装が正しいかどうかを知りたいです。 NaiveBayesとtf-idfの両方の組み込み関数に付属しているPythonライブラリを使用せずに、Naive Bayesを自分で実装しているので、これを知る必要があります。実際に必要なもの単純ベイズ分類器を使用していたモデルの精度(現在は30%)を向上させることです。したがって、優れた精度を実現するためのより良い方法があれば、提案を歓迎します。

私に提案してください。私はこのドメインに不慣れです。

11
POOJA GUPTA

使用したい正確な機能とクラスを実際に提供するか、少なくとも例を提供するとよいでしょう。それらのどれも具体的に与えられていないので、私は以下があなたの問題であると仮定します:

  1. いくつかのドキュメントがあり、それぞれにいくつかの単語があります。
  2. ドキュメントをカテゴリに分類したいとします。
  3. 特徴ベクトルは、すべてのドキュメントで可能なすべての単語で構成され、各ドキュメントのカウント数の値があります。

あなたの解決策

指定したtfidfは次のとおりです。

Word_count_in_class : sum of(tf-idf_weights of the Word for all the documents belonging to that class) //basically replacing the counts with the tfidf weights of the same Word calculated for every document within that class.

total_words_in_class : sum of (tf-idf weights of all the words belonging to that class)

あなたのアプローチは合理的に聞こえます。すべての確率の合計は、tf-idf関数とは無関係に合計1になり、特徴はtf-idf値を反映します。これは、tf-idfをNBに組み込むための確実な方法のように見えると思います。

別の潜在的な解決策

この問題に頭を悩ませるのに少し時間がかかりました。これの主な理由は、確率の正規化を維持することを心配しなければならなかったことでした。 Gaussian Naive Bayesを使用すると、この問題を完全に無視するのに役立ちます。

この方法を使用したい場合:

  1. 各クラスのtf-idf値の平均、変動を計算します。
  2. 上記の平均と変動によって生成されたガウス分布を使用して、事前分布を計算します。
  3. 通常どおり(前に乗算)続行し、値を予測します。

Numpyには本質的にガウス関数があるため、これをハードコーディングするのはそれほど難しくありません。私はこれらのタイプの問題に対してこのタイプの一般的な解決策を好むだけです。

増やすための追加の方法

上記とは別に、次の手法を使用して精度を上げることもできます。

  1. 前処理:

    1. 機能の削減(通常はNMF、PCA、またはLDA)
    2. 追加機能
  2. アルゴリズム:

    ナイーブベイは高速ですが、本質的に他のアルゴリズムよりもパフォーマンスが低下します。機能の削減を実行してから、SVMやロジスティック回帰などの識別モデルに切り替える方がよい場合があります。

  3. その他.

    ブートストラップ、ブーストなど。ただし、過剰適合しないように注意してください...

うまくいけば、これは役に立ちました。不明な点がある場合はコメントを残してください

6
jrhee17

P(Word | class)= (Word_count_in_class+1)/(total_words_in_class+total_unique_words_in_all_classes(基本的にトレーニングセット全体の単語の語彙))

これはどのように合計して1になりますか?上記の条件付き確率を使用する場合、SUMは次のようになります。

P(Word1|class)+P(Word2|class)+...+P(wordn|class) = (total_words_in_class + total_unique_words_in_class)/(total_words_in_class+total_unique_words_in_all_classes)

これを修正するには、P(Word | class)は次のようになります。

(Word_count_in_class + 1)/(total_words_in_class+total_unique_words_in_classes(vocabulary of words in class))

私が間違っている場合は私を訂正してください。

2
alex

それを行うには2つの方法があると思います。

  1. Tf-idfを整数として切り捨ててから、条件付き確率に多項分布を使用します。このペーパーを参照してください https://www.cs.waikato.ac.nz/ml/publications/2004/kibriya_et_al_cr.pdf
  2. 条件付き確率の多項分布の連続バージョンであるディリクレ分布を使用します。

ガウス混合がより良いかどうかはわかりません。

1
Guojun Zhang