Jigsaw Unintended Bias in Toxicity Classification 記録 - Kaggle
Jigsaw Unintended Bias in Toxicity Classification | Kaggle に取り組んだときの感想。コンペは終了していないが submission の受付が完了。ランキング発表を待つだけなので忘れないうちにメモを残す。
過去に経験のある text の classification 系。LSTM, GRU などがすぐに解法として浮かぶ。今回は benchmark となるカーネルが公開されていたので、そのカーネルにスコアで並ぶまでは discussions / kernels を見ないと決めて取り組んだ(=他人の解法やヒントを見ずにある程度自分だけで進める)。これは良い決断だったと思う。また kibela に自分しか見られないメモを書いてスコアや進捗を管理した。kernel の stdout も kibela に貼ることを前提の format とした。
時系列
- 過去に書き溜めたコードから end to end で動くカーネルを作る
- text preprocessing と model の両方から benchmark カーネルに少しずつ近づく
- benchmark kernel に追いついたあとは discussions / kernels を丁寧に読みはじめる
- target だけではなく別の指標もモデルの output ととして training する multi output モデルに感心。勉強になった。
- トレーニング時間を短くするために任意長の text を input として使えるようにモデルを修正。keras の fit_generator で動かすのに苦労する。苦労が報われてかなり短縮。
- この時点で keras よりも torch の方を使う kernel が多くやきもきした。時間がないので torch はこのコンペでは追わないことを決断。
- public kernel の best score が超えられなかったので自分の実装を捨てて keras best score カーネルをもとに改善していくことに。
- 細かい改善で向上するが決め手にならず。
- 期日が近づき始めたので training と prediction の kernel を分けることに。embedding を model save/restore に含めない部分が初めてだったので慎重に実装。
- ↑で model restore が簡単になったので ensemble に着手。LSTM, GRU ベースの model を average するだけでスコア向上。
- 無視していた bert に着手。例の vanila kernel を理解して training 時間の短縮などに取り組み。LSTM model より高スコアに。fine tuning するだけであっというまに LSTM モデル超え。
- ensemble すると一気にスコアが向上
- Stacking を試してみたが prediction にそれなりに時間がかかるわりにスコアは上がらず。xgboost のチューニングの問題かもしれない。
- XlNet が出たが流石に間に合わないだろうと諦め。
- そうこうしているうちにタイムオーバー。最高スコアのものを 2 つ提出した。
どうやったらもっと上に行けたか?
- チームを組む(これは作戦を考え中)
- 各入力の loss weight の深掘り。
結果
- 288/3,167 in public LB
- 最終結果はまだ未確定
最近の読書
「凍りのクジラ」、「旅人」、「羊と鋼の森」が特に良かった。今年は当たりが多い。
- 作者: 辻村深月
- 出版社/メーカー: 講談社
- 発売日: 2008/11/14
- メディア: 文庫
- 購入: 4人 クリック: 45回
- この商品を含むブログ (146件) を見る
- 作者: 伊坂幸太郎
- 出版社/メーカー: 集英社
- 発売日: 2015/12/17
- メディア: 文庫
- この商品を含むブログ (12件) を見る
- 作者: 湯川 秀樹
- 出版社/メーカー: 角川学芸出版
- 発売日: 2011/01/25
- メディア: 文庫
- クリック: 14回
- この商品を含むブログ (15件) を見る
- 作者: 伊坂幸太郎
- 出版社/メーカー: 新潮社
- 発売日: 2016/11/28
- メディア: 文庫
- この商品を含むブログ (18件) を見る
- 作者: のむらしんぼ
- 出版社/メーカー: 小学館
- 発売日: 2016/10/21
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: 伊坂幸太郎
- 出版社/メーカー: 幻冬舎
- 発売日: 2017/08/04
- メディア: 文庫
- この商品を含むブログ (6件) を見る
- 作者: 宮下奈都
- 出版社/メーカー: 光文社
- 発売日: 2009/11/10
- メディア: 文庫
- 購入: 5人 クリック: 85回
- この商品を含むブログ (33件) を見る
- 作者: 宮下奈都
- 出版社/メーカー: 集英社
- 発売日: 2013/01/18
- メディア: 文庫
- この商品を含むブログ (22件) を見る
- 作者: 宮下奈都
- 出版社/メーカー: 双葉社
- 発売日: 2017/01/12
- メディア: 文庫
- この商品を含むブログ (4件) を見る
- 作者: 宮下奈都
- 出版社/メーカー: 実業之日本社
- 発売日: 2015/10/03
- メディア: 文庫
- この商品を含むブログ (6件) を見る
- 作者: 宮下奈都
- 出版社/メーカー: 実業之日本社
- 発売日: 2012/10/05
- メディア: 文庫
- 購入: 1人 クリック: 1回
- この商品を含むブログ (12件) を見る
時を刻む湖――7万枚の地層に挑んだ科学者たち (岩波科学ライブラリー)
- 作者: 中川毅
- 出版社/メーカー: 岩波書店
- 発売日: 2015/09/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- 作者: 宮下奈都
- 出版社/メーカー: 文藝春秋
- 発売日: 2018/02/09
- メディア: 文庫
- この商品を含むブログ (21件) を見る
Stacking 実装中
ちょうどよい加減に抽象化された Stacking の例が意外と見つからない。base models での CV、meta model での CV それぞれどうやるべきなのか。meta model は linear で良いのか。 tree base が良いのか。実践的な例をがんばって探してみている。このコンペが終わったらコードを公開しようかな。
Kaggle Ensembling Guide + 実装例
Kaggle Ensembling Guide | MLWave という良記事を読み込む。そして1ミリもごまかさずに理解する過程をメモ。
Creating ensembles from submission files
Voting ensembles
これは分かりやすい。モデルが3つ以上あるときに prediction 結果の多数決をとって精度を上げる方法。 Simple Voting Ensemble for the Titanic | Kaggle に実装例がある。4 つのモデル(train前)を sklearn.ensemble.VotingClassifier に渡して training すると精度が向上するのがわかる。VotingClassifier のドキュメントを読むと voting には hard(class label の voting) と soft(predicted probablitiesの argmax) の種類があるようだ。
Correlation/相関
相関があまりないモデルを組み合わせたほうが精度が上がるという話。これは直感的にも理解できる。
Weighing
モデルが同程度に精度が良いとは限らないので、より良いモデルの voting に weight をかける方法。例:Better predictions: stacking with VotingClassifier | Kaggle
eclf = VotingClassifier(estimators=[ ('rf1', rf1), ('rf2', rf2), ('gbc', gbc), ('xgb',xgb)], voting='soft', weights = [3,1,1,1])
Averaging
bagging submissions ともいわれる。モデルの prediction を平均する。classification と regression どちらでも使える。例:Titanic using ensemble average | Kaggleにて下記のように各モデルのpredictionを単純に足し合わせているのがわかる。4 で割るかわりにしきい値が 2 にしていることに注意。
mix_predict=logreg_predict+RDM_predict+Tree_predict+svm_predict mix_predict[mix_predict<2]=0 mix_predict[mix_predict>=2]=1
Rank averaging
models が同様に calibration されているとは限らない(over-confident だったり under-confident) なので直接比べて average するのは良くない。それぞれのモデルの submission ないで各行の probability が何番目に大きいかのフィールドを作って、それらを複数のモデルで average する。例:Rank Averaging script | Kaggle
Historical ranks
前述の Rank はある test set の prediction 内の rank なので、また新しく別のデータに対する prediction が必要になったらどうするのという話。Rank をとっておいて似たような確率値の rank を使えばよいという話。例は見つけられなかったけど難しくないので良いと思う。
Stacked Generalization & Blending
Stacked generalization
説明を読んでもさっぱり分からなかった。いくつかの解説サイトを読んだが、結局 Stacking - Ensembling | Coursera この動画が一番わかりやすかった(というかこのクラスとったのに覚えてない。やはり実践しないとだめだね)。level 0 で各モデルの predction for valid を training データとして新しいモデルを train するということなのね。例: 2-Level Stacked Generalization | Kaggle
level 1 の model は weight 付きの averaging が best だと学習するかもしれない(しないかもしれない)。
Blending/Stacked Ensembling
out-of-fold でななくて train data で holdout set (10%) を level 0 の training に使う部分が違う。
Feature weighted linear stacking
力尽きた。続くかもしれない。
Kaggle 今日の作業記録
新コンペ。ネタバレ無しで。
- 安定した local CV の確立
- いくつかのモデルを試す