質問

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

私はNBでAdaboostを実装しようとしましたが、それはそれほど良い結果をもたらすようには見えません(これについては文献が分かれているようです、いくつかの論文は、NBを伴うAdaboostはより良い結果をもたらさないと言います、他の論文はそうします)。 NBへの他の拡張機能を知っていますか?

役に立ちましたか?

解決

私の経験では、適切に訓練されたナイーブベイズ分類器は通常、驚くほど正確です(そして、私がEusedしたどの分類剤ビルダーよりも賢明に速いです)。

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

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

  • 何らかの種類を適用します 分類器の組み合わせ手法 (例、アンサンミング、ブースト、袋詰め);またはあなたはできます

  • 見る データ 分類器に供給されます - より多くのデータを追加したり、基本的な解析を改善したり、データから選択した機能を改良したりします。

w/r/tナイーブベイジアン分類器、パラメーターチューニングは制限されています。私はあなたのデータ、つまりあなたの前処理の品質と機能の選択に焦点を合わせることをお勧めします。

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

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

  • : :手動で、または幹ライブラリを使用していますか?人気のあるオープンソースのものは、ポーター、ランカスター、雪だるまです。たとえば、用語がある場合 プログラマー、プログラム、プログラム、プログラム 特定のデータポイントでは、ステムマーはそれらを単一のステムに減らします(おそらく プログラム)そのため、そのデータポイントの用語ベクトルは、機能プログラムの値が4になります。これはおそらくあなたが望むものです。

  • 同義語の発見: :Stemmingと同じアイデア - 関連する単語が一語に折りたたまれます。そのため、同義語ファインダーは、開発者、プログラマー、コーダー、ソフトウェアエンジニアを識別し、それらを単一の用語に巻き込むことができます

  • ニュートラルな言葉: :クラス間で頻度が類似している単語は、機能が貧弱になります


ii。機能選択

NBCSのプロトタイプのユースケースを検討してください:スパムのフィルタリング。あなたはそれがどのように失敗するかをすぐに見ることができ、それを改善する方法をすぐに見ることができます。たとえば、平均以上のスパムフィルターには、すべてのキャップの単語の頻度、タイトルの単語の頻度、タイトルの感嘆符の発生などの微妙な機能があります。加えて、 最良の機能はしばしば単一の単語ではなく、たとえば、単語のペア、またはより大きな単語グループです.

iii。特定の分類器の最適化

30クラスの代わりに使用します 「1つの多くの」スキーム- 言い換えれば、2クラスの分類器(クラスAと「他のすべて」)から始めて、「他のすべて」クラスの結果は、クラスBおよび「他のすべて」に分類するためにアルゴリズムに返されます。 。

フィッシャーの方法 (おそらく、素朴なベイズ分類器を最適化する最も一般的な方法です。)私にとって、私はフィッシャーを 正規化 (もっと正しく、 標準化)入力確率NBCは、機能の確率を使用して「全ドキュメント」確率を構築します。 Fisher Methodは、 ドキュメントの機能は、これらの機能の確率を組み合わせて、その確率とランダムな一連の機能の確率を組み合わせたものと比較します。

他のヒント

使用することをお勧めします sgdclassifier のように これ 正規化強度の観点から調整します。

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

  • 私は通常、テキスト分類の問題についてそれを見ます SVMまたはロジスティック回帰 訓練されたとき、すべてとすべてがNBを上回ります。あなたが見ることができるように スタンフォード・ピープルによるこの素敵な記事 より長いドキュメントの場合、SVMはNBを上回ります。 SVMとNBの組み合わせを使用する論文のコード(NBSVM) は ここ.

  • 次に、TFIDF式(サブリニア式TF、smooth_idfなど)を調整します。

  • ノーマライズ L2またはL1正規化(TFIDFVectorizationのデフォルト)を使用したサンプルは、異なるドキュメントの長さを補正するためです。

  • 多層パーセプトロン, 、通常、多くのテキスト分類の問題に固有の非線形性が導入されているため、NBまたはSVMよりも優れた結果が得られます。使いやすくダウンロード可能なTheano/Lasagneを使用して、非常に平行なものを実装しました ここ.

  • してみてください L1/L2/ElasticNetの正規化を調整します. 。 SGDClassifier/SVM/ロジスティック回帰に大きな違いをもたらします。

  • 使用してみてください n-grams tfidfvectorizerで構成可能です。

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

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

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

  • 最近 フェイスブック 彼らを公開しました FastText分類コード 多くのタスクで非常にうまく機能します。必ず試してみてください。

Laplacian補正を使用してadaboostを使用します。

Adaboostでは、最初にトレーニングデータセットの各データタプルに重みが割り当てられます。 intialウェイトは、を使用して設定されます init_weights 各重量を初期化する方法 1/d, 、 どこ d トレーニングデータセットのサイズです。

次に、a generate_classifiers メソッドが呼び出され、実行されます k 時代、作成 k ナイーブベイズ分類器のインスタンス。これらの分類器は重み付けされ、テストデータは各分類器で実行されます。分類器の加重「投票」の合計は、最終的な分類を構成します。

Nサイズを小さく保つことで、NBが高精度の結果をもたらします。コアでは、Nサイズが精度の低下を増やすと、

それらの間の相関が少ない機能を選択します。また、一度に機能のさまざまな組み合わせを使用してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top