sklearn+python:素朴ベイズおよびテキスト分類


地味ベイズ
ベイズの定理は、条件確率、すなわち、
次に、素朴な仮定を行います.各ペアの特徴は互いに独立しています.
与えられた入力においてP(x_1,dots,x_n)は定数であり,以下の分類規則を用いる.
最大事後確率(Maximum A Posteri,MAP)を使用して、P(y)およびP(x_i|y)を推定することができる.前者は訓練集中カテゴリyの相対周波数である.
様々な素朴ベイズ分類器の違いの大部分は,P(x_i|y)分布を扱う際の仮定の違いから生じる.
P(x_i|y)は、十分なデータがある場合、データセットから統計したり、様々な分布モデルを用いて推定したりすることもできる.
かくりつぶんぷ
連続ランダム変数の確率分布を記述する関数を確率密度関数と呼ぶ.典型的な確率密度関数はGauss分布関数である.
離散ランダム変数の確率分布を記述する関数を確率質量関数と呼ぶ.典型的な確率質量関数は多項式分布関数である.テキスト分類またはスパム検出に使用できます.
この2つの分布関数を総称して確率分布関数と呼ぶ.
バーヌリガウスは多項式分布と類似しているが,予測因子としての特徴iがクラスyに現れないことを明確に罰し,多項式分布の素朴なベイズは現れなかった特徴を単純に無視しただけである.テキスト分類の例では、ワード周波数ベクトル(word occurrence vectors)のBernoulliNBは、いくつかのデータセット、特により短いドキュメントでよりよく表現される可能性がある.時間が許す場合は、両方のモデルを評価することをお勧めします.
コード:多項式分布を用いた素朴なベイズによるテキスト分類
次のコードは主に黄永昌の本から来て、私は一部の内容を整理して追加しました.コードに必要なデータベースは、ここからダウンロードできます.https://download.csdn.net/download/rendo/10287144
from time import time
from sklearn.datasets import load_files
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

#   1:        
print("loading train dataset ...")
t = time()
# load file            ,           ,       
news_train = load_files('D:/  /         /scikit-learn    -   /code/datasets/mlcomp/379/train')
print("summary: {0} documents in {1} categories.".format(
    len(news_train.data), len(news_train.target_names)))
# news_train.target    13180     ,            id
print('news_categories_names:
{},
len(target):{}, target:{}'
.format(news_train.target_names, len(news_train.target), news_train.target)) print("done in {0} seconds
"
.format(round(time() - t, 2))) # 2: TF-IDF print("vectorizing train dataset ...") t = time() vectorizer = TfidfVectorizer(encoding='latin-1') X_train = vectorizer.fit_transform((d for d in news_train.data)) print("n_samples: %d, n_features: %d" % X_train.shape) # X_train , TF-IDF , 。 # X_train 13180X130274 print("number of non-zero features in sample [{0}]: {1}".format( news_train.filenames[0], X_train[0].getnnz())) print("done in {0} seconds
"
.format(round(time() - t, 2))) # 3: print("traning models ...".format(time() - t)) t = time() y_train = news_train.target clf = MultinomialNB(alpha=0.0001) clf.fit(X_train, y_train) train_score = clf.score(X_train, y_train) print("train score: {0}".format(train_score)) print("done in {0} seconds
"
.format(round(time() - t, 2))) # 4: print("loading test dataset ...") t = time() news_test = load_files('D:/ / /scikit-learn - /code/datasets/mlcomp/379/test') print("summary: {0} documents in {1} categories.".format( len(news_test.data), len(news_test.target_names))) print("done in {0} seconds
"
.format(round(time() - t, 2))) # 5: print("vectorizing test dataset ...") t = time() # transform fit_transform。 X_test = vectorizer.transform((d for d in news_test.data)) y_test = news_test.target print("n_samples: %d, n_features: %d" % X_test.shape) print("number of non-zero features in sample [{0}]: {1}".format( news_test.filenames[0], X_test[0].getnnz())) print("done in %fs
"
% (time() - t)) # 6: 。 print("predict for {} ...".format(news_test.filenames[0])) pred = clf.predict(X_test[0]) print("predict: {0} is in category {1}".format( news_test.filenames[0], news_test.target_names[pred[0]])) print("actually: {0} is in category {1}
"
.format( news_test.filenames[0], news_test.target_names[news_test.target[0]])) # 7: print("predicting test dataset ...") t = time() pred = clf.predict(X_test) print("done in %fs" % (time() - t)) print("classification report on test set for classifier:") print(clf) print(classification_report(y_test, pred, target_names=news_test.target_names)) # 8: cm = confusion_matrix(y_test, pred) print("confusion matrix:") print(cm)

出力:
loading train dataset ...
summary: 13180 documents in 20 categories.
news_categories_names:
['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc'], 
len(target):13180, target:[18 13  1 ... 14 15  4]
done in 1.97 seconds

vectorizing train dataset ...
n_samples: 13180, n_features: 130274
number of non-zero features in sample [D:/  /         /scikit-learn    -   /code/datasets/mlcomp/379/train\talk.politics.misc\17860-178992]: 108
done in 5.35 seconds

traning models ...
train score: 0.9978755690440061
done in 0.37 seconds

loading test dataset ...
summary: 5648 documents in 20 categories.
done in 0.86 seconds

vectorizing test dataset ...
n_samples: 5648, n_features: 130274
number of non-zero features in sample [D:/  /         /scikit-learn    -   /code/datasets/mlcomp/379/test\rec.autos\7429-103268]: 61
done in 2.129905s

predict for D:/  /         /scikit-learn    -   /code/datasets/mlcomp/379/test\rec.autos\7429-103268 ...
predict: D:/  /         /scikit-learn    -   /code/datasets/mlcomp/379/test\rec.autos\7429-103268 is in category rec.autos
actually: D:/  /         /scikit-learn    -   /code/datasets/mlcomp/379/test\rec.autos\7429-103268 is in category rec.autos

predicting test dataset ...
done in 0.041888s
classification report on test set for classifier:
MultinomialNB(alpha=0.0001, class_prior=None, fit_prior=True)
                          precision    recall  f1-score   support

             alt.atheism       0.90      0.91      0.91       245
           comp.graphics       0.80      0.90      0.85       298
 comp.os.ms-windows.misc       0.82      0.79      0.80       292
comp.sys.ibm.pc.hardware       0.81      0.80      0.81       301
   comp.sys.mac.hardware       0.90      0.91      0.91       256
          comp.windows.x       0.88      0.88      0.88       297
            misc.forsale       0.87      0.81      0.84       290
               rec.autos       0.92      0.93      0.92       324
         rec.motorcycles       0.96      0.96      0.96       294
      rec.sport.baseball       0.97      0.94      0.96       315
        rec.sport.hockey       0.96      0.99      0.98       302
               sci.crypt       0.95      0.96      0.95       297
         sci.electronics       0.91      0.85      0.88       313
                 sci.med       0.96      0.96      0.96       277
               sci.space       0.94      0.97      0.96       305
  soc.religion.christian       0.93      0.96      0.94       293
      talk.politics.guns       0.91      0.96      0.93       246
   talk.politics.mideast       0.96      0.98      0.97       296
      talk.politics.misc       0.90      0.90      0.90       236
      talk.religion.misc       0.89      0.78      0.83       171

             avg / total       0.91      0.91      0.91      5648

confusion matrix:
[[224   0   0   0   0   0   0   0   0   0   0   0   0   0   2   5   0   0   1  13]
 [  1 267   5   5   2   8   1   1   0   0   0   2   3   2   1   0   0   0   0   0]
 [  1  13 230  24   4  10   5   0   0   0   0   1   2   1   0   0   0   0   1   0]
 [  0   9  21 242   7   2  10   1   0   0   1   1   7   0   0   0   0   0   0   0]
 [  0   1   5   5 233   2   2   2   1   0   0   3   1   0   1   0   0   0   0   0]
 [  0  20   6   3   1 260   0   0   0   2   0   1   0   0   2   0   2   0   0   0]
 [  0   2   5  12   3   1 235  10   2   3   1   0   7   0   2   0   2   1   4   0]
 [  0   1   0   0   1   0   8 300   4   1   0   0   1   2   3   0   2   0   1   0]
 [  0   1   0   0   0   2   2   3 283   0   0   0   1   0   0   0   0   0   1   1]
 [  0   1   1   0   1   2   1   2   0 297   8   1   0   1   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   2   2 298   0   0   0   0   0   0   0   0   0]
 [  0   1   2   0   0   1   1   0   0   0   0 284   2   1   0   0   2   1   2   0]
 [  0  11   3   5   4   2   4   5   1   1   0   4 266   1   4   0   1   0   1   0]
 [  1   1   0   1   0   2   1   0   0   0   0   0   1 266   2   1   0   0   1   0]
 [  0   3   0   0   1   1   0   0   0   0   0   1   0   1 296   0   1   0   1   0]
 [  3   1   0   1   0   0   0   0   0   0   1   0   0   2   1 280   0   1   1   2]
 [  1   0   2   0   0   0   0   0   1   0   0   0   0   0   0   0 236   1   4   1]
 [  1   0   0   0   0   1   0   0   0   0   0   0   0   0   0   3   0 290   1   0]
 [  2   1   0   0   1   1   0   1   0   0   0   0   0   0   0   1  10   7  212  0]
 [ 16   0   0   0   0   0   0   0   0   0   0   0   0   0   0  12   4   1   4 134]]