最近イギリスで本場のフィッシュ&チップスを食べられて感動しているエンジニアの保坂です。本場のフィッシュ&チップスはHuge&Deliciousでした!
突然ですが、皆さん「kaggle」をご存知でしょうか? kaggleは、予測モデルの精度を競うデータ分析コンペティションが多数開催される分析コンペティションプラットフォームです。賞金がついた企業主催のコンペティションのほか、分析入門者向けの学習用コンペ、様々な手法を自由に試すことができるプレイグラウンドコンペなどが開催されています。 中には上位に入賞することでジョブのオファーがもらえるコンペもあったりします。
RCOアドテク部では最近「kaggle部」というサークルを立ち上げ、チームとしてkaggleのコンペに参加しています。 昨年8月から11月にかけて、RCO kaggle部として初めて「Bosch Prediction Line Performance」というコンペに参加しました。
そして、メンバー全員が寝る間を惜しんで分析に励んだ結果、上位2%の15/1373位に入ることができました!
ちょうど2月にkaggleに関する話題をざっくばらんに語り合う「Kaggle Tokyo Meetup #2」が開催され、その場でRCO kaggle部の取り組みを発表してきました。
今回の記事ではその内容について紹介させていただきます。
※画像は https://www.kaggle.com/c/bosch-production-line-performance から引用させていただきました。
Bosch Prediction Line Performanceは、自動車部品や電動工具を製造するドイツの企業 Bosch が主催するコンペです。日本ではホームセンターの工具売り場などでBoschの電動工具を目にすることができます。
このコンペでは、Boschの製造する製品の不良品予測を行い、その検出精度を競います。製造工程における数千種類に渡る計測データを説明変数として使用する事ができます。 Boschとしては、コンペで作られたモデルを製造工程の改善に役立てる狙いがあるようです。
データセットには学習用データ1,183,747件、テスト用データ1,183,748件分のアイテムの計測データが含まれます。 各アイテムに対して、製造工程における3,105個の計測値(実数またはカテゴリ値)が説明変数として使用できます。ただしアイテムによって通過する工程が異なるため、3,105個のうち多くは欠損しています。また、各計測値の計測タイミングのデータも提供されます。 学習用データには各アイテムが不良品だったかどうかのフラグが付与されており、これを目的変数としてモデル構築を行う事になります。
精度の高い予測モデル構築のために非常に重要なのが特徴量作成フェーズです。私達は提供された変数を加工し、新たな特徴量を25種類、3154変数ほど作成しました。
その中で特に有効だったのが以下の3種類の特徴量です。
有効な特徴量を作成するためにはまずはデータを理解することから!ということで、生のデータをひたすら眺めたりいろいろな集計をしていました。
するととてもデータに著しい特徴があることに気が付きました。どうやらすべてのカラムの値が完全に一致するアイテムがあるようなのです。
図:カラムの内容が完全に一致するアイテムの例
どうも怪しいと思い、カラム内容が一致するアイテムとそうでないアイテムが不良品率を集計してみると、カラム内容が一致するアイテムでは不良品率が10倍程度大きいことがわかりました。
図:カラム内容が一致するアイテム数ごとの不良品率
これを特徴量に落とし込み、説明変数に加えてモデルを構築すると大きく精度が向上したため、さらに深掘りをしてみました。 これにより、
と言ったことも発見しました。
図:カラムの内容がほぼ一致するが、特定の1カラムだけ一致しないアイテムの例
これらの発見を元にして様々な特徴量を作成し、説明変数に加えました。 これらの特徴量は非常に有効であり、実際xgboostを用いて求めたコンペ終盤のモデルの変数重要度Top30の中で半数はこの発見に基づく特徴量になっていました。
データセットの説明のところで、アイテムにより通過する工程が異なると説明しましたが、これを分析し特徴量を作成しました。各工程の通過有無を01で表し、パスを一覧したのが以下の図です(17017種類のパスのうち一部を抜粋)。
図:パス一覧(一部抜粋)
これを眺めたり集計したりすることで、
と言ったことを発見し、これに基づいた特徴量を作成しました。
図:パスごとの不良品率
時系列分析では過去のある時点との関係を分析する事がよく行われます。その考え方に基づき、同じ工程を直近に通過したアイテムの計測値を用いた特徴量を作成しました。
この特徴量は、1つ目に紹介した特徴量ほど効果は大きくありませんでしたが、順位を上位5%程度→上位2%付近まで押し上げてくれたもので、私達にとってはとても重要な特徴量でした。
モデル構築には定番中の定番であるxgboostのライブラリを用い、Gradient Boosting Decision Tree(GBDT)モデルを構築しました。コンペ終了の2週間前頃に、昨年xgboostに実装されたGBDTの改良手法Dropouts meet Multiple Addtive Regression Trees(DART)に切り替えてチューニングを行ったところ、最終的な順位に到達することができました。
いかがでしたでしょうか?とても泥臭いことをやっているなあと感じた方が多いのではないでしょうか?そうです、データサイエンスは泥臭いものなのです! でも私はこういった泥臭いことを積み重ねて少しずつデータが内包している情報を明らかにしていくのが大好きです! 探偵になったような気分になれます。 常に最新手法の情報収集をしながらも、こういった泥臭い分析も大事にしていきたいと思っています。
Kaggle Tokyo Meetup #2 での発表資料を以下に掲載しますので、詳細についてはこちらを見てみてください。
Meetupでは時間の関係もあり一部の内容に絞って発表しましたが、社内勉強会用の資料では他に試した手法などが記載してあります。
私達がこのコンペで体験したことをかなり広く記載しましたのでぜひ見てみてください!
このコンペでメンバーが全精力を使い果たしてしまったので、最近までkaggle部は休部中となっていましたが、メンバーが活力を取り戻しつつあるので次のコンペを探しているところです。
kaggleは教科書を読むだけでは身につけることができない、実際のデータ分析の様々なテクニックを身につけることができる素晴らしいプラットフォームだと思いますので、皆さんも是非コンペに参加してみてください!