テキスト分類問題その1 上位入賞者手法紹介

テキスト分類問題その1」コンペティションの上位入賞者の予測手法を紹介します。

1位入賞者:n.otaniさん

1 前処理

1.1 符号化された語の処理

文書中の符号語を調べて、1文字目以外のアルファベット以後を捨てる処理を行った(例: Flying: F86155b43 -> F86155)。

1.2 ベクトル化

頻度が2以下の単語を捨てた後、tf/idfでベクトル化した。この処理にはGenSimというPythonのライブラリを使った。

1.3 LSIで次元圧縮

1.2で作ったベクトルは次元が大きすぎて時間的にもメモリ的にも厳しいので、LSI(Latent Semantic Indexing)で次元を圧縮した。この処理にもGenSimを使っている。

2 学習と予測

Pythonのライブラリscikit-learnに含まれるSVMとGradient Boostingを使って学習と予測を行った。どちらのアルゴリズムにもいくつのハイパーパラメータがあるが、今回は分割数5のクロスバリデーションでスコアを調べながら決めた(これもscikit-learnに含まれる)。グリッドサーチのメモはgithubから見ることができる。

2.1 SVM

1.2(LSI無し)で作成したデータから学習と予測を行った。最もスコアのよかったパラーメータは以下(中間スコア0.996程度):

  • kernel:rbf
  • C: 4
  • gamma: 0.5

パラメータのチューニングにあたってSVM実践ガイド (A Practical Guide to Support Vector Classification) - 睡眠不足?!を参考にした。

2.2 Gradient Boosting

1.3(LSI有り)で作成したデータから学習と予測を行った。最もスコアのよかったパラーメータは以下(中間スコア0.995程度):

  • n_estimators: 50000
  • learning_rate: 2^(-9,5)
  • max_features: log2
  • max_depth: 7

LSIのトピック数は300,500,750を試したが、300を使った時のスコアが最も良かった。

3 後処理

SVMとGradient Boostingそれぞれで最もスコアの良かったデータの平均を取った。この予測データが最終提出のスコア0.9956を達成した。

ソースコード

使用したプログラム等はgithubに公開してある。

2位入賞者:Vagifさん

My approach was as follows: I trimmed all the features to 6 characters, applied tf-idf to the data, and then used a logistic regression with L2 regularization and parameter C=11. I tried other approaches, such as Naive Bayes, trees, adaboost, but logistic regression proved to have the best performance. I also tried to make ensembles of logistic regression and other classifiers however I always got worse performance with such ensembles than without them.