3

OKだから私はAndrew NgのMachine Learningコースを勉強しています。私は現在this chapterを読んでおり、SKLearnとPythonを使って自分自身で多項式Naive Bayes(12ページの一番下)を試してみたいと思っています。だから、アンドリューはそうMultinomialNB - 理論と実践

我々はx_iは電子メールでi番目の単語の身元を示すものと、この場合の各電子メールをエンコードする方法を提案します。したがって、x_iは、{1, . . . , |V|}の値をとる整数になりました。ここでは、|V|は 語彙(辞書)のサイズです。 nワードの電子メールは、今度はというベクトルで表され、nのベクトルで表されます.n は異なる文書で異なることがあります。例えば、電子メールが(“nips”が第三万五千単語が 辞書にある場合)、次いでx_1 = 1、及びx2 = 35000“a”最初 辞書内の単語である) “A NIPS . . . ,”で始まる場合。

ハイライトを参照してください。

これは私がPythonでやったことです。私はvocabularyを持っています。これは502語のリストです。それぞれの "電子メール"をエンコードして、Andrewが記述したのと同じ方法で表現します。例えば、 "this is sparta"というメッセージは[495, 296, 359]と "これはスパルタ"によって。[495, 296, 415, 359]

ここに問題があります。

明らかに、SKLearnのMultinomialNBは一様な形状の入力が必要です(これについてはわかりませんが、今のところ、ValueError: setting an array element with a sequence.を取得しています。入力ベクトルのサイズが同じでないためです)。

私の質問は、MultinomialNBを複数の長さのメッセージに使用するにはどうすればいいですか?出来ますか?私は何が欠けていますか?

ここで私はコードでやっているのいくつかのより多くのです:

X = posts['wordsencoded'].values 
y = posts['highview'].values 
clf = MultinomialNB() 
clf.fit(X, y) 
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True) 
print(clf.predict()) 

入力がどのようなものか:enter image description here enter image description hereenter image description here

スタックトレース:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-933-dea987cd8603> in <module>() 
     3 y = posts['highview'].values 
     4 clf = MultinomialNB() 
----> 5 clf.fit(X, y) 
     6 MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True) 
     7 print(clf.predict()) 

/usr/local/lib/python3.4/dist-packages/sklearn/naive_bayes.py in fit(self, X, y, sample_weight) 
    525    Returns self. 
    526   """ 
--> 527   X, y = check_X_y(X, y, 'csr') 
    528   _, n_features = X.shape 
    529 

/usr/local/lib/python3.4/dist-packages/sklearn/utils/validation.py in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator) 
    508  X = check_array(X, accept_sparse, dtype, order, copy, force_all_finite, 
    509      ensure_2d, allow_nd, ensure_min_samples, 
--> 510      ensure_min_features, warn_on_dtype, estimator) 
    511  if multi_output: 
    512   y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False, 

/usr/local/lib/python3.4/dist-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator) 
    371          force_all_finite) 
    372  else: 
--> 373   array = np.array(array, dtype=dtype, order=order, copy=copy) 
    374 
    375   if ensure_2d: 

ValueError: setting an array element with a sequence. 

答えて

1

はいあなたがいます思うように。固定長のベクトルで各メールをエンコードする必要があります。このベクトルは、訓練セットの各電子メールに対して502次元(あなたの場合)の単語カウントベクトルと呼ばれます。

各単語カウントベクトルには、トレーニングファイル内の502の辞書単語の頻度が含まれています。もちろん、それらのほとんどがゼロになると推測しているかもしれません。たとえば、「これはスパルタではない」というこのスパルタは、以下のようにエンコードされます。 [0,0,0,0,0、....... 0,0,2,0,0,0、......、0,0,2,0,0、.. 0,0,2,0,0、...... 2,0,0,0,0,0,0]

ここで、4つの2はすべて296番目、359番目、415番目、 502ワード長カウントベクトルの495番目のインデックス。

したがって、トレーニングセットのファイル数を示す行と、辞書の502ワードを表す特徴ベクトルマトリックスが生成されます。 インデックス 'ij'の値は、i番目のファイルの辞書のj番目の単語の出現回数になります。

この生成された電子メールのエンコーディング(特徴ベクトルマトリックス)は、トレーニングのためにMultinomialNBに与えられます。

また、クラスを予測する前に、テストメール用に同様の502長さのエンコードを生成する必要があります。

次のブログを使用して、Ling-SpamデータセットにmultinomialNBのスパムフィルタ分類子を簡単に構築できます。 blog-postは実装のためにsklearnとpythonを使います。

https://appliedmachinelearning.wordpress.com/2017/01/23/nlp-blog-post/

+0

ありがとうございます!多分私がリンクした方法とSKLearn multinomialNBは異なる方法でしょうか?私がリンクした(そして引用した)ノートでは、アルゴリズムは異なる長さで動作することができます。 –

+0

あなたが読んでいた章では、各文書の固定長エンコーディングが8ページにあり、Sklearnが多項式NBでそれをどのように実装しているかを示しています。だから、sklearnの方法は8ページのAndrew Ngによって記述されています.12-13ページのリンク先の方法は、テキスト分類のイベントモデルについて説明しています。これらの2つの方法は異なるようです。 –

+0

さて、それはNaive Bayesサブチャプターの下にあります(Naive Bayesは2です、多項式モデルは2.2章です)ので、NBの多項バリエーションであったと推測しました。 SKLearnの文書には、multinomialNBが "多項式Naive Bayes分類子"であることも記載されています。 –