テキストの分類:異なる種類の機能の組み合わせ


19

私が取り組んでいる問題は、短いテキストを複数のクラスに分類することです。私の現在のアプローチは、tf-idf加重項頻度を使用し、単純な線形分類器(ロジスティック回帰)を学習することです。これはかなりうまく機能します(テストセットで約90%のマクロF-1、トレーニングセットで約100%)。大きな問題は、目に見えない単語/ n-gramです。

私は、他の機能、たとえば分布類似性(word2vecで計算)を使用して計算された固定サイズのベクトル、または例の他のカテゴリ機能を追加して、分類器を改善しようとしています。私の考えは、単語の袋からスパース入力フィーチャにフィーチャを追加するだけでした。ただし、これにより、テストおよびトレーニングセットのパフォーマンスが低下します。追加の機能自体は、テストセットで約80%のF-1を提供するため、不要ではありません。機能のスケーリングも役に立たなかった。私の現在の考えでは、この種の機能は(スパース)ワードオブワード機能とうまく混同されません。

質問は次のとおりです。追加機能が追加情報を提供すると仮定して、それらを組み込む最良の方法は何ですか?別々の分類子をトレーニングし、それらをある種のアンサンブル作業で組み合わせることができますか(これには、おそらく、異なる分類子の機能間の相互作用をキャプチャできないという欠点があります)。他に考慮すべき複雑なモデルはありますか?


3
更新:追加の密ベクトルをl2正規化することにより、許容可能な結果を​​達成することができました。私は、sklearn StandardScalerがそれを行うと間違って想定していました。ただし、ラベルの依存関係をモデル化したり、サブ分類子の信頼度を組み込んだりできる、より複雑なメソッドを探しています。
エルミーレ14

私は昨年同じ基本的な実験をしていたが、あなたが持っているのとまったく同じ問題に遭遇した。l2正規化プロセス後のword2vecベクトルはBOWに勝てますか?L2の正規化は行っていませんが、多くのポスト処理メソッドのセマンティックベクトルをテストしても、BOW tf / idf機能の2〜4絶対パーセントはまだ行き止まりです。私が最初に求めたのは、高密度のセマンティックベクトルを従来のBOWと組み合わせて、トピックの分類/モデリングのパフォーマンスを向上できるかどうかを確認することです。ところで:あなたが取り組んでいるデータセットは何ですか、私のものは20newsgroupです。

CIKM 2014コンペティションのデータセットを使用していました。私にとって、ベクトル表現はtf-idfの重みでBOWを打ち負かすことができませんでした。私の計画は、品質を改善するためにそれらを使用することでした。私の経験では(テキスト分類の場合)、何らかの形のtf-idf + n-gramの線形モデルが非常に強力なアプローチです。私は現在、畳み込みニューラルネットワークで実験を行っており、これらの(多かれ少なかれ)複雑なモデルでさえもビートに近づいています。
エルミーレ

To Mod:評判が50に満たないので申し訳ないので、コメント欄に書き込めません。こんにちはelmille:はい、それは私がすべてのテストで経験することです。ただし、vec + BOWヘルプという言葉はありますか?私の経験では、word vecとBOW tf-idfを連結すると(この場合、このvecは実際には記事全体の全体ベクトルであり、word-vecではなく非常に類似しています)、パフォーマンスはさらに低下します。元々はBOW + vec> BOW> vecであると思います。相互に補助的な情報が含まれているため。実際の結果は、BOW> vec> BOW + vecです。次に、標準的なスケーリングと正規化を行い、bowとvecで

回答:


13

私が正しく理解していれば、モデルには基本的に2つの形の機能があります。(1)単語のまばらなバッグとして表したテキストデータ、および(2)より伝統的な密な特徴。その場合、3つの一般的なアプローチがあります。

  1. TruncatedSVD疎データに対して次元削減(LSA viaなど)を実行してデータを密にし、特徴を単一の密行列に結合してモデルをトレーニングします。
  2. scipyのようなものを使用して、いくつかの密な特徴を疎行列に追加hstackし、単一の疎行列に入れてモデルをトレーニングします。
  3. スパーステキストデータのみを使用してモデルを作成し、その予測(分類の場合は確率)を他の密なフィーチャと密なフィーチャとして組み合わせて、モデルを作成します(つまり、積み重ねによる組み立て)。このルートを使用する場合は、モデルをトレーニングするための機能としてCV予測のみを使用することを忘れないでください。そうしないと、かなりひどくオーバーフィットする可能性があります(Pipeline必要に応じて、すべてを1つのクラスで行うことができます)。

3つのアプローチはすべて有効であり、独自の長所と短所があります。個人的には、(1)は比較的最悪であるため、通常は最悪であると感じています。また、(3)が通常は最高であり、十分に高速であり、非常に優れた予測が得られることもわかります。より広範なアンサンブルを実行する場合は、明らかにそれらの組み合わせも実行できます。

使用するアルゴリズムに関しては、基本的にすべてがそのフレームワーク内に収まります。ほとんどの場合、ロジスティック回帰は驚くほどうまく機能しますが、他の問題は、目前の問題とそれらをどの程度うまく調整するかによってより良くなる場合があります。私自身はGBMには賛成ではありませんが、要点は、好きなだけ多くのアルゴリズムを試すことができ、予測の単純な重み付きアンサンブルを行うことで、ほぼ常により良い全体的なソリューションにつながることです。


10

線形モデルは、対応する重みを掛けた特徴を単純に追加します。たとえば、各インスタンスでアクティブな3つまたは4つの1000個のスパースフィーチャ(および他のインスタンスはゼロ)と、すべてゼロ以外の20個の密なフィーチャがある場合、密なフィーチャはほとんどの場合、疎な機能による影響は、わずかな価値しか追加しません。これを確認するには、いくつかのインスタンスの特徴の重みと、それらが結果の合計にどのように影響するかを調べます。

これを修正する1つの方法は、加法モデルから離れることです。以下に候補モデルをいくつか示します。

SVMは、分離した超平面に基づいています。超平面はそれ自体が線形モデルですが、SVMはそのパラメーターを合計せず、代わりに最適な方法で特徴空間を分割しようとします。機能の数を考えると、より複雑なカーネルはデータをオーバーフィットする傾向があるかもしれませんが、線形SVMは問題なく動作するはずです。

Naive Bayesはその名前にもかかわらず、テキスト分類に良い結果を示した非常に強力な統計モデルです。まばらで密な特徴の頻度の不均衡を捉えるのに十分な柔軟性があるので、ぜひ試してみてください。

最後に、この場合、ランダムフォレストが適切なアンサンブル方法として機能する場合があります。ランダム化により、異なる種類の機能(スパース/デンス)が異なるツリーのプライマリ決定ノードとして使用されるようになります。RF /デシジョンツリーは、フィーチャ自体の検査にも適しているため、とにかくその構造に注意する価値があります。

これらのすべてのメソッドには欠点があり、これらのメソッドを使用するとゴミになることがあります。疎な機能と密な機能の組み合わせは、あまりよく研究されていないため、これらのアプローチのどれがあなたのケースに最適か教えてください。


ご回答ありがとうございます!2つのフォローアップの質問があります:) 1)SVM(線形カーネル)とNaive Bayesは、特徴と対応する重み(つまり、「加算モデル」)を合計しないという点でどのように違いますか?どちらも効果的に分離超平面を作成するので、結果は常に何らかの種類の特徴を対応する重みで乗算したものではありませんか?2)ランダムフォレストを試したいのですが、残念ながら、機能空間が大きすぎて密な形式で表現できません(私はsklearnを使用しています)。それを処理できる実装はありますか?
エルミーレ14

1)線形回帰では超平面上の関心があるため、重み付き特徴を加算して予測点を取得します。一方、SVMでは、超平面の両側の点探しています。どちらの側があなたの例であるかを単純にチェックすることで分類を行います。予測中に合計は行われません。Naive Bayesにはさまざまな種類のモデル(たとえば、二項または多項)を組み込むことができますが、基本的には、確率を乗算するのであって、追加するのではありません。
ffriend

2)このトピックでいくつかの研究を見たことがありますが、実装に遭遇したことはありません(おそらくグーグルはここにいくつかのリンクを提供します)。ただし、常に別の方法を使用することもできます。たとえば、PCAを使用して次元を削減し、削減されたデータセットに基づいてランダムフォレストを実行します。
ffriend 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.