web-dev-qa-db-ja.com

(複数の)カテゴリカル機能でsklearn.naive_bayesを使用するにはどうすればよいですか?

クラスがブール値(2つの値のいずれかをとる)である問題の単純ベイズモデルを学びたい。一部の機能はブール値ですが、その他の機能はカテゴリ型であり、少数の値(〜5)をとることができます。

私のすべての機能がブール値である場合は、sklearn.naive_bayes.BernoulliNBsklearn.naive_bayes.MultinomialNBnotです。

1つの解決策は、カテゴリカル機能をブール機能に分割することです。たとえば、変数「X」が値「red」、「green」、「blue」をとる場合、「Xは赤」、「Xは緑」、「Xは青」の3つの変数を持つことができます。これは、クラスに与えられた変数の条件付き独立性の仮定に違反しているため、まったく不適切に思えます。

別の可能性は、変数を実数値変数としてエンコードすることです。ここで、0.0は赤、1.0は緑、2.0は青を意味します。それはまた、GaussianNBを使用することは完全に不適切であるように見えます(明らかな理由により)。

私がやろうとしていることは奇妙に思われるわけではありませんが、それをsklearnが提供するNaive Bayesモデルにどのように適合させるかわかりません。自分でコーディングするのは簡単ですが、可能な場合は明らかな理由で(ほとんどはバグを回避するため)sklearnを使用することを好みます。

[多項式を考えない理由を説明するために編集NBは私が欲しいものです]:

私の理解では、多項式NBの場合、特徴ベクトルはk iidサンプルでトークンが観測された回数のカウントで構成されます。

私の理解では、これはドキュメントの基になるクラスがあり、ドキュメント内の各Wordはそのクラスに固有のカテゴリ分布から抽出されると想定される分類のドキュメントに適しています。ドキュメントにはkトークンがあり、特徴ベクトルの長さは語彙サイズと等しく、特徴カウントの合計はkになります。

私の場合、いくつかのベルヌーイ変数といくつかのカテゴリカル変数があります。しかし、ここには「カウント」の概念はありません。

例:クラスは、数学が好きまたは嫌いな人です。予測因子は大学生(カテゴリカル)であり、大学院に通ったかどうか(ブール値)。

ここにはカウントがないため、これは多項式に適合しないと思います。

21
Ned Ruggeri

一部の機能はブール値ですが、その他の機能はカテゴリ型であり、少数の値(〜5)をとることができます。

これは興味深い質問ですが、実際には1つではありません。

  1. NBでカテゴリ機能を処理する方法。
  2. NB=で不均一な特徴を処理する方法(および、以下で指摘するように、2つのカテゴリ特徴でも不均一です)。
  3. sklearnでこれを行う方法。

まず、単一のカテゴリ特徴を考えます。 NBは、機能が独立していると仮定/簡略化します。これをいくつかのバイナリ変数に変換するというあなたのアイデアは、まさに ダミー変数 のアイデアです。明らかに、これらのダミー変数は、独立しています。結果に対してベルヌーイを実行するという考えNBは、暗黙的に独立性を前提としています。実際には、NBは、従属変数に直面した場合、特に多項式NBは非常に簡単な代替手段であるため、問題をNBの最悪の構成に変換しようとする理由はありません。

逆に、ダミー変数を使用して単一のカテゴリ変数を複数列のデータセットに変換した後、多項式NBを使用するとします。多項式の理論NB states

多項イベントモデルでは、サンプル(特徴ベクトル)は、多項式によって特定のイベントが生成された頻度を表します。ここで、p iはイベントiが発生する確率です。特徴ベクトル...はヒストグラムです。xi {\ displaystyle x_ {i}} x_ {i}は、特定のインスタンスでイベントiが観測された回数をカウントします。これは、通常、ドキュメントの分類に使用されるイベントモデルであり、単一のドキュメント内のWordの出現を表すイベントがあります(単語のバッグの前提を参照)。

したがって、ここでは、単一のカテゴリ変数の各インスタンスは「長さ1の段落」であり、分布は正確に多項式です。具体的には、長さ1の段落には1つの単語のみが含まれている必要があるため、各行の1つの位置に1、残りのすべてに0があり、それが頻度になります。

sklearnの多項式NBの観点からは、データセットが5列であるという事実は、独立性の仮定を意味するものではないことに注意してください。


次に、いくつかの特徴で構成されるデータセットがある場合を考えます。

  1. カテゴリー
  2. ベルヌーイ
  3. 正常

NBを使用するという非常に前提の下では、これらの変数は独立しています。したがって、次のことが可能です。

  1. ダミー変数と多項式NBを使用して、カテゴリカルデータのNB分類子eachを個別に作成します)。
  2. ベルヌーイデータのNBallの分類子を一度に作成します-これは、sklearnのベルヌーイが原因ですNBは、いくつかの単一機能のベルヌーイNBのショートカットです。
  3. すべての通常の機能については2と同じです。

独立性の定義では、インスタンスの確率は、これらの分類子によるインスタンスの確率の積です。

18
Ami Tavory
  1. CategoricalNB by scikit-learnは、naive_bayesモジュールに追加される新しいクラスです。それはナイトリービルド here にあります。

  2. Mixed Naive Bayes( https://github.com/remykarem/mixed-naive-bayes )。トレーニングデータの特徴にガウス分布とカテゴリカル(multinoulli)分布が混在していると想定できます。ライブラリは、APIがscikit-learnに類似するように作成されています。

from mixed_naive_bayes import MixedNB
X = [[0, 0],
     [1, 1],
     [2, 1],
     [1, 1],
     [0, 2]]
y = [0, 0, 1, 1, 0]
clf = MixedNB(categorical_features='all')
clf.fit(X,y)
clf.predict(X)

こちらの同様の質問で私の回答をご覧ください https://stackoverflow.com/a/58428035/4570466

0
Raimi bin Karim