Active Learning を試す(Uncertainly Sampling 編)

教師あり学習の教師データの作成はとても大変。例えば、twitter 言語判定のために、訓練・テストデータあわせて70万件のツイートに言語ラベルを振った人もいたりいなかったり。


Active Learning(能動学習) はそんな教師データ作成のコストを抑えながらモデルの性能向上を測るアプローチの1つ。
具体的には、正解なしデータの中から「こいつの正解がわかれば、モデルが改善する(はず)」というデータを選び、Oracle と呼ばれる「問い合わせれば正解を教えてくれる何か(ヒント:人間)」にそのデータを推薦、得られた正解付きデータを訓練データに追加して、以下繰り返し。


しかし「こいつの正解がわかれば、モデルが改善」を選び出す基準なんて素人考えでも何通りも思いつくわけで、実際 Active Learning のやり口は幾通りもある。
Active Learning Literature Survey (Settle 2009) ではその戦略を大きく6つに分類している。

  • 1. Uncertainly Sampling
  • 2. Query-By-Committee
  • 3. Expected Model Change
  • 4. Expected Error Reduction
  • 5. Variance Reduction
  • 6. Density-Weighted Methods


この記事では、まず 1. Uncertainly Sampling を試す。
これは「現時点のモデルで『最も不確かなデータ』を選ぶ」、柔らかく言うと「分類予測に最も自信がないものを選ぶ」ということ。
代表的な Uncertainly Sampling として、(Settle 2009) では 3 つの方法が紹介されている。ああ、ここでは教師あり学習一般ではなく、分類問題をターゲットに説明していく。

Least Confident
「最も確率の低いラベル」の確率が最も高いデータを選ぶ
Margin Sampling
(「1番目に確率の高いラベル」−「2番目に確率の高いラベル」)が最も小さいデータを選ぶ
Entropy-based Approach
予測分布のエントロピーが最も大きいデータを選ぶ


いずれも、どれか1つのラベルの確率が 1.0 であるデータは最も選ばれにくいし、全てのラベルの確率が等しいデータは最も選ばれやすい。まあ、いずれも至極妥当な印象がある。
線形分類器でこれらの戦略を取ると、選ばれるデータ点は分類平面周辺にもっぱら集中することになる。


Active Learning は理論的な評価も一部行われてはいるが、基本はヒューリスティックなアプローチということもあり、やっぱり実際に試さないことにはよくわからない。そこでまずは簡単な例としてロジスティック回帰に適用してみる。
ちなみに、2値分類ではこの3つの手法は同じデータを選択することになる(ことに気づかず、しばらく2値分類で頑張っていたのはナイショ)ので、多クラス分類をターゲットとする。


以下の様な設定で Uncertainly Sampling に分類される3手法 Least Confident, Margin Sampling, Entropy-based Approach と、baseline としてランダムにデータを選択する Random を比較した。
まずデータは再現実験しやすいよう NLTK の Reuters コーパスにて、crude, money-fx, trade, interest, ship, wheat, corn の 7 カテゴリを選び、この中の 2 つ以上のカテゴリに同時に属する文書を除外した 2256 文書を使った。
学習器は自分で実装してもいいが、何十回も学習することを考えると高速なものがいいので scikit-learn を使う。特徴量は単語(小文字化 & lemmatized)の出現数とした。 tf-idf の結果も一応見てみたが、精度に誤差程度の差しかなかったのでシンプルな方を採用した。


ここからそれぞれの戦略に従って選んだデータを訓練データに加えていくわけだが、最初に各カテゴリに1つ以上のデータがないと scikit-learn の分類器が学習してくれないので、初期データとしてランダムに1つずつ選ぶ。ちなみに、baseline(ランダム) 以外の3手法は初期値から後の選択は決定的である(評価値が同じ場合、numpy の arg 系はインデックスの一番若いものを取る)。
選択するデータは訓練データ数が 300 になるまでとし、残りのデータの正解率を毎回算出していった。


と、設定話はこれくらいにして、いよいよお楽しみの結果。
実装したスクリプトと、1回実行した時の正解率の推移グラフを挙げておく。


初期値依存なので細かい結果は毎回違うわけだが、このグラフから読み取れる通り、

  • Margin Sampling は精度が最も高く、かつほぼ安定している
  • Least Confident は最終的に Margin Sampling に近い精度に達するが、若干不安定
  • Entropy-based Approach はかなり不安定で、その精度は他の2つどころか Random を下回ることも珍しくない


という傾向は何回実行しても同じだった。
実行する前は Entropy-based に期待していたので、この結果は正直ショック。
Margin Sampling は実は ldig で訓練データを作る際にラベル付けするデータの選択(手動)にまさにこの指標を使っていたので、この指標が一番成績がいいのは少し嬉しくはある。


データやモデルにも強く依存するので、この傾向が常に成り立つとかそんなことは言えない。なんてわざわざ釘を刺す必要もないくらいだろうが、念のため。
次は Query-By-Committee を試す予定。


追記
ちょっとわかりにくいかなーと思ったので、訓練データ 100個までの推移を拡大した図を追加。

【/追記

参考文献