私はいくつかのテキスト分類タスクを行っています。私が観察したことは、(sklearn's からのTfidfVectorizer
) tfidf 行列が与えられた場合、ロジスティック回帰モデルは常に MultinomialNB モデルよりも優れているということです。以下は、両方をトレーニングするための私のコードです。
X = df_new['text_content']
y = df_new['label']
X_train, X_test, y_train, y_test = train_test_split(X, y)
vectorizer = TfidfVectorizer(stop_words='english')
X_train_dtm = vectorizer.fit_transform(X_train)
X_test_dtm = vectorizer.transform(X_test)
clf_lr = LogisticRegression()
clf_lr.fit(X_train_dtm, y_train)
y_pred = clf_lr.predict(X_test_dtm)
lr_score = accuracy_score(y_test, y_pred) # perfectly balanced binary classes
clf_mnb = MultinomialNB()
clf_mnb.fit(X_train_dtm, y_train)
y_pred = clf_mnb.predict(X_test_dtm)
mnb_score = accuracy_score(y_test, y_pred) # perfectly balanced binary classes
現在 lr_score > mnb_score 常に。tfidf の用語頻度はクラス情報に基づいて計算されないため、MultinomialNB が tfidf 行列をどの程度正確に使用しているか疑問に思っています。LogisticRegression に行ったのと同じ方法で、tfidf 行列を MultinomialNB にフィードしないでください。
TfidfVectorizer
更新:との結果の違いを理解していますCountVectorizer
。また、sklearn の MultinomialNB.fit() 関数のソース コードを確認したところ、頻度に反してカウントが期待されているようです。これは、以下の私のコメントで言及されているパフォーマンスの向上についても説明します。ただし、どのような状況でも tfidf を MultinomialNB に渡すことが理にかなっているのかどうかはまだ疑問です。sklearn のドキュメントでは、その可能性について簡単に言及されていましたが、詳細についてはあまり言及されていませんでした。
どんなアドバイスでも大歓迎です!