XGBoost の lambda について
XGBoost のパラメタ lambda に関する実験を行いました。
学習データサイズを変えながら lambda の最適値を調べています。
今回使うデータはUCI Machine Learning Repository: Covertype Data Setです。
データ数 | 特徴数 | タスク | クラス数 |
---|---|---|---|
581012 | 54 | 多値分類 | 7 |
データサイズ
- テストデータサイズ: 100k
- n_train (学習データサイズ): [10k, 20k, 40k]
データは Stratified で分割しているので、きっちり10k, 20k とはなってないです。
XGBoost のパラメタ
- lambda: [0.4, 0.8, 1.6, 3.2, 6.4, 12.8, 25.6, 51.2]
- max_depth: 10, subsample: 0.8
上記以外のパラメタはデフォルト値です。
以下は疑似コードです。実際のコードはGitHub - tks0123456789/XGB_experiments
データを学習候補とテストに分割する(テストデータは固定)
- for n_train in [10k, 20k, 40k]
- 学習候補から サイズ n_train の学習データを取り出す。
- パラメタ値ごとに学習データ内で交差検証を行い最適な n_estimators を決定する
- 上で求めた n_estimators を用い学習データ全体でモデルを作る(seedを変えながら3回)
- 上のモデルでテストデータの予測をしスコア (log_loss) を計算する
一応 6.4-12.8 あたりが最適です。
より詳細な分析をするためには、学習データを取り出す回数を増やし、
モデルに含まれる決定木の複雑さ(葉の数)とウェイトの分布を調べる必要がありそうです。
Kaggle のランキング
2015/5/13 にランキングシステムが変更された。
新旧ポイント計算式
A: チームメンバー数
B: 順位
C: 参加チーム数
D: min(コンペ終了からの期間(年), 2)
t: コンペ終了からの期間(日)
新
旧
詳しくは以下を参照
ランキングの定義 https://www.kaggle.com/wiki/UserRankingAndTierSystem
変更の経緯 Improved Kaggle Rankings | No Free Hunch
変更に対する反応 Improved Kaggle Rankings
次にKaggleのランキングに関するツイートを紹介する。すべてシステム変更前のものだが、ランキングの現状をよく表している。
Beatbenchmark:コンペ参加者がForumに投稿した予測作成コード- Beat the bencnmark .. というタイトルであることが多い。以下BtBと略す。
- 出力ファイルをそのまま提出できる。
- 運営者が用意したベンチマークよりもスコアが良い。
- 多くはシンプルなコードで、あまりパラメタチューニングをしていない。
- コンペ終わりごろに高スコアのBtBが投稿されて議論になることがある。参考 Possible modification to competition rules - Code sharing | Kaggle
- 現在は1ページ目に100位まで載っているが、システム変更前は40位までだった。私は5月19日0時時点で45位
以下のTOP10% TOP25%などはコンペの順位
- 参加した分ポイントはプラスされるが、時間の経過とともに減っていくから
- TOP25%:BtBを使えば簡単にいけそう
- TOP10%:複数のBtBを組み合わせればそれほど難しくないと思う。
- TOP10: 私自身はTOP10を目指しているので、BtBは最初のとっかかりに使う程度。
- 入賞
- コンペ終了後にいつも思うことは、上位の人はたくさんのモデルをうまく組み合わせているなあということ。私はせいぜい3〜4種類しかアンサンブルさせてない。今後もう少し戦略を変えないと賞金はもらえそうにない。
- 最近だとXGBoostがすごい。初心者でも使い方を理解すれば高スコアが出せる。
そのラインを超えられると一気に順位が上がる
- 特徴抽出、異なるタイプのモデルを組み合わせるなど
Windows 7 でAnaconda(Python+いろいろ)、Theano、pylearn2のインストール(32bit)
Anaconda
http://continuum.io/downloads から
Windows 32-bitをダウンロードしてインストール
自分がDLしたバージョンは1.9.1
Theano
コマンドラインで
pip install theano
もし UnicodeDecodeError が出た場合
IPython Notebook を起動しようとして UnicodeDecodeError が出た場合 - tks のメモ と同様に
Lib/mimetypes.py 248〜251行を削除orコメントアウトする
pylearn2
GitHub - lisa-lab/pylearn2: Warning: This project does not have any current developer. See bellow. 右下の Download ZIP をダウンロードして展開し
中にある pylearn2 フォルダを Lib/site-packages の下にコピー
環境変数 PYLEARN2_DATA_PATH を適当に設定
IPython Notebook を起動しようとして UnicodeDecodeError が出た場合
Lib/mimetypes.py の
try:を削除する。
ctype = ctype.encode(default_encoding) # omit in 3.x!
except UnicodeEncodeError:
pass
出典 python - UnicodeDecodeError : 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) - Stack Overflow
今まで参加した予測コンペの結果
id:tks (AusDMのみtkstks)
AusDM 2009 Analytic Challenge
開催期間:2009/9/26-2009/11/22
順位:10/19
RSCTC 2010 Discovery Challenge. Basic Track
2009/12/1-2010/2/28
39/96
RSCTC 2010 Discovery Challenge. Advanced Track
2009/12/1-2010/2/28
17/28
SIAM SDM'11 Contest: Prediction of Biological Properties of Molecules from Chemical Structure
2010/11/16-2011/1/24
16/114
ISMIS 2011 Contest: Music Information Retrieval
2011/1/10-2011/3/21
Music Genres:51/142
Music Instruments:23/33
JRS 2012 Data Mining Competition: Topical Classification of Biomedical Research Papers
2012/1/2-2012/3/30
13/43
コンテンツ販売サービスの会員離脱予測
2013/2/18-2013/4/18
4/43
「コンテンツ販売サービスの会員離脱予測」メモ
順位は4位
使用言語はR
特徴抽出
- アクション頻度、Bigram(頻度が高いもの200個)
- アクション数
- アクション間隔最大
- アクション間隔平均
- 年(POSIXlt の year属性)
- 月(mon+1) 1-12
- 日(mday+1) 1-31
- 曜日(wday) 0-6
- 時間(hour) 0-23
- 1月1日からの日数(yday+1) 1-366
- 入会時曜日
- 1時間当たりのアクション回数推移(Action ID 69 のみ)
- 1日当たりのアクション回数推移(Action ID 42 のみ)
- ロジスティック回帰(glmnet)
- ブースティング(gbm)
特徴重要度高いもの(ブースティングモデルによる)
- アクション:80, 83, 61
- bigram:48x84, 53x61, 44x43, 53x53
- 1月1日からの日数:253, 338, 305, 310
- 日:29, 13
- 時間:0, 14
アンサンブル
- ロジスティック回帰とブースティングの平均
- ブースティングは同じパラメータ、違う乱数の種で16個モデルを作り平均
外部データ
- コンペ終了後株価データを加えてブースティングのモデルを作ってみたが、株価の重要度は結構高かった(ただし実際に効果があるかどうかは未検証)。使ったのは入会時株価と入会1か月後株価
- 天気、テレビ番組、ニュースなど他にも使いたいデータがあるがどうやって集めるかわからない
- 政府統計(家計調査、労働力調査など)も使える気がする
感想
- yday が使えるのは予想外だった。
- 賞金狙いだったので悔しい
- 参加者同士の情報交換(コンペ中、後)がやりにくいので今後も参加するかは未定