web-dev-qa-db-ja.com

単純ベイズ分類器の精度を向上させる方法は?

単純ベイズ分類器を使用して、数千のドキュメントを30の異なるカテゴリに分類しています。 Naive Bayes Classifierを実装し、いくつかの機能選択(ほとんどは役に立たない単語のフィルタリング)で、テスト精度30%、トレーニング精度45%を得ました。これはランダムよりもはるかに優れていますが、私はそれがより良いことを望んでいます。

私はNBでAdaBoostを実装しようとしましたが、かなり良い結果が得られないようです(これについては文献が分かれているようです、一部の論文はAdaBoostがNBで良い結果を与えない、 do)。NBの精度が向上する可能性のある他の拡張機能を知っていますか?

65
wmute

私の経験では、適切に訓練されたNaive Bayes分類器は通常驚くほど正確です(そして非常に高速に訓練します-これまでに使用した分類器ビルダーよりも著しく高速です)。

したがって、分類子の予測を改善したい場合は、いくつかの場所を調べることができます。

  • 分類器を調整する(分類器の調整可能なパラメーターを調整する);

  • 何らかの分類分類子の組み合わせ手法を適用します(たとえば、アセンブル、ブースティング、バギング)。またはあなたはできます

  • the dataを分類器に送ります。データを追加するか、基本的な解析を改善するか、データから選択した機能を調整します。

w/r/tナイーブベイジアン分類器、パラメーター調整は制限されています。データ、つまり前処理の品質と機能の選択に集中することをお勧めします。

I。データ解析(前処理)

生データは各データポイントの生テキストの文字列のようなものであり、一連の処理ステップにより、各データポイントの構造化ベクトル(1D配列)に各オフセットが1つの特徴に対応するように変換します(通常はWord)、そのオフセットの値は周波数に対応します。

  • stemming:手動で、またはステミングライブラリを使用して?人気のあるオープンソースは、ポーター、ランカスター、スノーボールです。したがって、たとえば、特定のデータポイントに用語programmer、program、progamming、programmedがある場合、ステマーはそれらを単一のステム(おそらくprogram)ので、そのデータポイントの用語ベクトルは、機能プログラムに対して4の値を持ちます。

  • 同義語の発見:ステミングと同じ考え-関連する単語を単一の単語に折り畳む。シノニムファインダーは、開発者、プログラマー、コーダー、ソフトウェアエンジニアを識別し、それらを1つの用語にまとめることができます

  • 中立的な単語:クラス間で類似した頻度の単語は貧弱な特徴を作ります


II。機能の選択

nBCの典型的なユースケースを検討します。スパムをフィルタリングします。それがどのように失敗するかをすぐに見ることができ、同じようにすぐにそれを改善する方法を見ることができます。たとえば、平均以上のスパムフィルターには、すべての大文字の単語の頻度、タイトルの単語の頻度、タイトルの感嘆符の発生などの微妙な特徴があります。さらに、最良の特徴は、多くの場合、単一の単語ではなく、単語のペア、またはより大きな単語グループです。

III。特定の分類子の最適化

30クラスの代わりに'one-against-many'スキーム-を使用します。つまり、2クラスのクラシファイア(クラスAと「その他」)から始め、「他のすべてのクラスは、クラスBおよび「すべてのその他」などに分類するためのアルゴリズムに返されます。

フィッシャーメソッド(おそらくナイーブベイズ分類器を最適化する最も一般的な方法です。)私にとって、フィッシャーはnormalizing(より正確には、standardizing)入力確率NBCは特徴確率を使用して「ドキュメント全体」の確率を構築します。 Fisherメソッドは、ドキュメントのeach特徴のカテゴリの確率を計算し、これらの特徴確率を組み合わせ、その組み合わせた確率をランダムセットの確率と比較します機能の。

101
doug

this のようにSGDClassifierを使用することを推奨し、正則化強度の観点から調整します。

また、 TFIFVectorizer のパラメーターを調整して、使用しているTFIDFの式を調整してください。

  • 私は通常、テキスト分類の問題の場合、1対すべてがNBよりも優れている場合、SVMまたはLogistic Regressioinを参照します。 スタンフォードの人々によるこの素敵な記事で見ることができるように/ 長いドキュメントについてはSVMはNBよりも優れています。 SVMとNB([〜#〜] nbsvm [〜#〜])の組み合わせを使用する論文のコードは here

  • 次に、TFIDFの式を調整します(例:sublinear tf、smooth_idf)。

  • Normalize異なるドキュメントの長さを補正するため、サンプルをl2またはl1正規化(Tfidfvectorizationのデフォルト)で使用します。

  • Multilayer Perceptron、多くのテキスト分類問題に固有の非線形性が導入されているため、通常はNBまたはSVMよりも良い結果が得られます。 Theano/Lasagneを使用して、 here で簡単にダウンロードできる高度な並列処理を実装しました。

  • l1/l2/elasticnet正則化の調整を試してください。 SGDClassifier/SVM/Logistic Regressionに大きな違いをもたらします。

  • Tfidfvectorizerで設定可能なn-gramsを使用してみてください。

  • 文書に構造がある場合(たとえば、titlesがある場合)、異なる部分に異なる機能を使用することを検討してください。たとえば、ドキュメントのタイトルでWord1が発生した場合、ドキュメントにtitle_Word1を追加します。

  • ドキュメントの長さを機能として使用することを検討してください(例:単語や文字の数)。

  • ドキュメントについてmeta informationの使用を検討してください(作成時刻、作成者名、ドキュメントのURLなど)。

  • 最近、Facebookが公開した FastText分類コード は、多くのタスクで非常によく機能します。必ず試してください。

5
Ash

AdaBoostとともにラプラシアン補正を使用します。

AdaBoostでは、最初にトレーニングデータセットの各データTupleに重みが割り当てられます。初期の重みは、init_weightsメソッドを使用して設定されます。このメソッドは、各重みを1/dに初期化します。ここで、dはトレーニングデータセットのサイズです。

次に、generate_classifiersメソッドが呼び出され、k回実行され、NaïveBayes分類子のkインスタンスが作成されます。次に、これらの分類子に重みが付けられ、各分類子でテストデータが実行されます。分類子の加重「投票」の合計が最終分類を構成します。

0
user4959