唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

CrowdSolvingに参加中 - あるいは機械学習関連のメモ

機械学習エンジョイ勢として、CrowdSolving | データ分析・予測モデル作成のコンペサイトに参加してる時とかに調べたことなどのメモ。
まだ終わってないですが、そろそろやることが思いつかないのでとりあえずまとめときました。
一応まだモデルとか特徴量の詳細は伏せときます。

一番よかった時が2位で、今は3位ぐらいですね。
後一ヶ月以上あるので、これからどれだけ下がることやら……。

手元のクロスバリデーションの結果とLeaderboardの結果に、大きく差があったり評価尺度の上下動が連動していなかったりするので過学習しているかもしれません。
過学習の恐ろしさは↓の記事がわかりやすいですね。

どうやって評価尺度を上げる?

基本的には評価尺度を上げるには、機械学習アルゴリズムを適したものに変えるか、入力として与える特徴量を改善するかしかありません。

ちなみに私の初提出のAUCが0.60ぐらいで今が0.65ぐらいですが、上昇分はモデルの変更と素性の変更が半々ぐらいです。

どんな機械学習アルゴリズムを使うか?

ライブラリの利用

「勉強したい」とか「実装が見つからない」などの特段の理由がない限り、既存のライブラリを使用したほうがいいです。
評価尺度の計算やクロスバリデーションなど既存のライブラリを使えば関数一つでやってくれる場合が多いです。

ただし既存のライブラリでは他の人と差がつきにくいという問題があります。

線形?それとも非線形

  • データの次元数がデータ数よりも大きい場合には、線形識別器でうまく識別できることが多い。
  • 逆にデータ数が多くて、次元数が少ない場合には非線形な識別器のほうがうまくいくことが多い。

ただし線形な識別器の方がおおよそ学習が速いので、速度的な面から線形識別器を使ったほうが嬉しい場合も多いです。
学習が速いと、設定を変えて何回も実験を回せます。

確率の出力

使う機械学習アルゴリズムやライブラリによって、出力がラベルだけのもの、確率まで出してくれるものがあるので使い分けが必要です。
確率が欲しい時はロジスティック回帰などを使うものだと思っていたのですが、色々調べてみるとSVMやランダムフォレストなども確率を出力として出してくれるものがあるみたいです。

データの比率

ラベルごとのデータの比率が著しく異なっていると、機械学習アルゴリズムはうまく働かないことが多いです。

こういうときはデータをサンプリングして比率を調節するか、アルゴリズムによってはデータのラベルごとに重みを設定できるので、少ない方のラベルのデータに大きな重みを与えるといいです。

評価尺度

ちゃんと目的となる評価尺度をみて、それがよくなるようにパラメーターを選んだりしましょう。
対象の評価尺度を直接最大化してくれる機械学習アルゴリズムならなおよいかもしれません。

ハイパーパラメーター

機械学習のアルゴリズムには設定しなきゃいけないパラメーター(たとえばSVMのC)などがあり、これを適切に設定しないとよい結果が得られません。
劇的に結果が変わることもあるので、絶対に調節しましょう。

並列化しよう

並列に処理できるライブラリが多いです。
機械学習はだいたい遅いので、忘れずに並列化するようにしましょう。

機械学習アルゴリズムにどんな入力を与えるか?

この特徴量(素性)選びが非常に重要で、職人技が求められるらしいのですが、ちょっとどうしたらいいのかよくわからないです

データを見る

生データを見たり、表にしたり、グラフにしてがんばって特徴的な部分を見ます。
どの特徴に注目するかまで決まれば検定とかしてもいいかも(?)

データを見てもよくわからない

とりあえず思いついた特徴量を片っ端から識別器に突っ込んで性能が上がるかどうかを確かめます

その他注意事項

バージョン管理

私の一番よかった結果は電子の海に消えてしまいました(笑)
ちゃんとバージョン管理しておけばこういった悲しい事態は防げたはずです。

実験設定(パラメーター)の保存

実験設定がわからなくならないようにちゃんと保存しておきましょう。

まとめ

機械学習とか統計ガチ勢ではないので、間違ってる部分などがあったらご指摘ください。

SVMとかをちゃんと使うのは初めてだったので、CrowdSolvingに参加して色々と勉強になりました。
いずれ暇になったらKaggle: Go from Big Data to Big Analyticsとかにも参加したいですね。
勉強のためにkaggleのwikiとかも読んだんですが、あまり今回の役には立たなかったです。