Python
analytics
機械学習
MachineLearning
Kaggle
More than 1 year has passed since last update.

はじめに

過去に参加したKaggleの情報をアップしていきます.
ここでは,BOSCHの上位者が公開した情報についてまとめます.
コンペ概要やkernelに関しては,Kaggleまとめ:BOSCH(intro+forum discussion)Kaggleまとめ:BOSCH(kernels)にまとめており,こちらでは解析結果やテクニックについての議論にフォーカスしています.

logo

本記事はPython2.7, numpy 1.11, scipy 0.17, scikit-learn 0.18, matplotlib 1.5, seaborn 0.7, pandas 0.17を使用しています.
jupyter notebook上で動作確認済みです.(%matplotlib inlineは適当に修正してください)

1st place solution

Belugaがアプローチについて説明しています.
今回は生データが十分な情報量を含んでいなかったため,date情報に基づいたかなり踏み込んだ特徴量生成を行ったようです.(判断基準はxgboostを使用)
また,アンサンブル学習はL3まで使用しています.
Deep Learningは過学習のためか機能せず,よく使うExtraTreeRegressorも結局は使用しなかったようです.
終始XGBoostが活躍するコンペとなりました.

今回のコンペは,ステーション同士の状態遷移,ステーションデータ間の相関,匿名化されたタイムスタンプの3つから,いかにして新たな特徴量を生成できるかという勝負でした.
確かにデータ自体は大規模ですが,大規模な計算機環境を持っているかどうかは本質ではないように感じます.

データ分析

Screen Shot 2016-11-21 at 2.02.33.png

はじめに2週間かけてデータを見ていきます.数値データのプロット,統計解析,ステーションとステーションの確率遷移,各ステーションの相関行列を通して,匿名化されたデータの全体像を掴んでいきます.
StationFeaturSimilarity.png

メモリは通常の16GBでも実行可能ですが,その場合は幾分努力が必要です.
小数点は小数点以下に応じた数値をかけることで,int型とします.
date情報はステーションごとの最小値とします.
欠損値それ自体が特徴量として機能します.

特徴量生成

Screen Shot 2016-11-21 at 2.07.50.png

Magic featuresを使用しました.連続する行には重複した,かつResponseに対応した特徴が含まれていることに,Ashが気がつきました.そこで,StartStation, StartTimeのIdの順番に着目した特徴量を生成しました.
詳しくは,Kaggleまとめ:BOSCH(kernels)を参考にしてください.

Screen Shot 2016-11-21 at 2.10.33.png

kernelsにあるように,自己相関係数を調べることで,0.01 timeが6分だということがわかりました.つまり2年に及ぶ製造データを解析していることになります.この事実が直接的に精度向上に貢献することはありませんでしたが,いくつかのdate based featuresを生成することに役立ちました.

  • StartStationTime
  • StartTime, EndTime, Duration
  • StationTimeDiff
  • Start/End part of week (mod 1680)
  • Number of records in next/last 2.5h, 24h, 168h for each station
  • Number of records in the same time (6 mins)
  • MeanTimeDiff since last 1/5/10 failure(s)
  • MeanTimeDiff till next 1/5/10 failure(s)

僕自身date情報をほとんど活かしきれていませんでしたが,これをみる限りかなり使い道がありそうです.差分,非欠損値・欠損値のカウント,週の始まり終わり,といった情報を改めて考えてみると,不良品発生に影響を与えなくはないかなと感じます.
* MeanTimeDiff since last 1/5/10 failure(s)
↑これに関しては,次のようなイメージです.
Mean(EndTime for latest K failures where EndTime < CurrentEndTime) - CurrentEndTime

Screen Shot 2016-11-21 at 2.11.05.png

使用した数値情報は次の通り

  • 生の数値情報,もしくは xgboost feature importanceから選ばれた部分集合
  • Z-scaleした特徴量(週間ごと)
  • それぞれの数値データの符号のカウント
  • 特徴量の組み合わせ(f1 +-* f2)

下の図はRを使って書かれた有向グラフです.タイムスタンプと非欠損値の関係をまとめることで,製造ラインの流れから不良品へと行き着く流れが見て取れます.
この流れをうまく特徴量生成に活用できたかどうかがポイントだったのかなと感じます.
__results___1_6.png
S0 - S11, S12 - S23の確率遷移行列に目立った類似性がありました.
これらの類似したステーションでは,数値データの相関性が見られます.そこで,それぞれの特徴量をくみあわせました.(e.g. L0_S0_F0 + L0_S12_F330 etc.)

生データをそのまま使用できれば良いですが,通常のPCでは厳しいかなと思います.ただ,XGBoostの予測で活躍する特徴量の選択や,重複データの削除といった処理を加えることで,この辺はかなりマネジメントできそうです.
また,相関性が見られるデータ同士を加算,減算,積算が精度向上へ役立つとは少々以外でした.
Z-scaleはすべてのサンプルに対してまとめて処理しがちですが,週ごとに行うことで,「1週間の中での異常度」を表現できるということでしょうか.非常に面白いです.

Screen Shot 2016-11-21 at 2.11.44.png

優勝者もカテゴリ情報を活用することはなかったようです.ただ,ステーション[24, 25, 26, 27, 28, 29, 32, 44, 47]だけの情報を,'T1'かどうかだけに着目して使用した,ということらしいです.
カテゴリデータに対して,BOSCH側の情報公開がしっかりしていれば,もう少し活用できていたかもしれません.

評価,バランス調整,結果

Screen Shot 2016-11-21 at 2.12.11.png

5-foldのクロスバリデーションからはじめ,最終的には4-foldに落ち着きました.アンサンブル学習のレイヤー1は3つの異なるseedを用いて学習しました.
データ間の重複や欠損はそのまま圧縮せずにそのまま使用しました.その代わり,50% ~ 90%のダウンサンプリングを行うことで,計算コストを削減しました.
精度改善の履歴は次の通りです.

results.png

その他コメント

使用したアンサンブルについて
ExtraTreesRegressorを組み込むことも試みたようですが,パラメータを変えた複数のXGBoostだけを使用したアンサンブルに落ち着いたようです.パラメータの一例は次の通り.

early_stopping alpha booster colsample_bytree min_child_weight subsample eta objective max_depth lambda
auc 0 gbtree 0.6 5 0.9 0.03 binary:logistic 14 4

この中で,etaはステップサイズの縮小幅を表しており,これを小さくすることでブースティングの性能が向上します.しかし今回は,etaを小さくしても精度の向上に貢献しない,という変わった状況でした.

Screen Shot 2016-11-21 at 4.09.53.png

最後にAshが詳細なアンサンブルについてまとめています.
先に説明した通りなので,ここは流します.