機械学習 ベストプラクティス KaggleのTitanicにある7つのサンプルコード
LightGBM,DNN Denseニューラルネットワーク,scikit-learn
EDA(Exploratory Data Analysis)と特徴量エンジニアリングの見本
Kaggleで上位に入るためには,前処理もモデリングもある決まったスタイルがあります。KaggleのTitanicにある7つのサンプルコードを下に添付しました。ベストプラクティスです。
動作確認したJupyter Notebookとそれをhtml化したものが左上隅からダウンロードできます。
(2023-12-07 Python3.10.9(CPUマシン)で動作確認済み)
◆◆Kaggleとは◆◆
◆◆Kaggleは機械学習の道場◆◆
Kaggleはデータサイエンティストなら知らない人はいないくらいの機械学習のコンペです。Kaggle社は2010年に設立されて2017年にはGoogleの傘下になりました。
2020.01.13現在,コンテスト数は370,データセット数は約2万です。Activeなコンテストは14件で,2~3か月程度で締め切られます。優勝者には賞金がでます。百万ドルも珍しくありません。
コンテストは個人または数人のチームで参加します。日本からも無償で簡単に参加できます。私はGoogleアカウントでログインしています。 コンテストの成績の上位1パーセントがmasterと呼ばれ,IT企業(DeNAなど)にすぐ就職できるくらいすごい資格です。機械学習の腕だめしにはぴったりで「AI道場」と言われています。
KaggleのCompetitionsのHPはここです。
https://www.kaggle.com/competitions
『Competitions New to Kaggle? Start here!』
◆◆Kaggleの課題は企業が本当に解決したい問題,賞金も高額◆◆
Kaggleのコンテストのテーマは企業から提供され,架空の課題ではなく企業が本当に解決したい課題がテーマになっています。賞金も多額なことから参加者は本気モードでコンテストに参加してきます。実際に有用な解決策が多く提案されています。
コンテストのテーマは過去370もあり,内容をよく読んでいくと自分の課題に近いものがけっこうみつかります。そしてCodeタブには有志がアップしたサンプルコードとその解説があるのです。前処理とモデルをマネできるものがきっとみつかります。
◆◆KaggleからEDAと特徴量エンジニアリングを学ぶ,Titanicに限らず◆◆
さて,コンテストTitanic(上のHPの最初にあります)ですが,かなり前に締め切られたものですが,特別扱いにより今でも submit ができて順位も知らされます。
https://www.kaggle.com/c/titanic
『Titanic - Machine Learning from Disaster』
コンペの内容は,生死が判っている891人のtrain dataから,生死が不明の418人のtest dataの生死を予測するというものです。特徴量(説明変数)は11です。いわゆる二値分類の課題です。data setはDataタブにあります。
◆◆Titanicをsubmitしよう。すぐ自分の順位が判ります◆◆
submitはLeaderboardタブででき,全員の順位と自分の順位が判ります。
実際にKaggleに参加するときはOverviewタグに課題がありますが,いきなりコードを書き始めることはしないで,他の参加者のコードを参照します。それはCodeタブにあります。参照したコードをJupyter Notebookでrunさせて結果をsubmitしてください。成績はそんなに上位にいかないはずです。その理由は前処理を少し手抜きしてモデルは平凡なのもを採用しているからです。まだ締め切られていないactiveなテーマでは成績が上位のものをそのまま開示するわけがありません。それでも十分に参考になります。
サンプルコードの大半は前処理です。前処理は単純なデータ加工や特徴量エンジニアリングなどがあります。特徴量エンジニアリングとは簡単に言ってしまえば,特徴量を減らしたり増やしたりその意味付けを変えたりすることです。そしてモデルが受け付けるデータの種類に変換します。
特徴量エンジニアリングのテキストはほとんどなく経験工学みたいなものです。ツールは pandas や numpy などです。Titanicに限らずKaggleのCodeタブにあるサンプルコードはEDA・特徴量エンジニアリングの勉強の参考になるのです。
sickit-learnにあるモデルで良い成績がえられるのはランダムフォレストや勾配ブースティングの決定木の仲間です。それ以上に可能性があるのはLightGBMとDNN ニューラルネットワークです。
それでもそれを使うだけでは簡単には成績上位10パーセントに入ることはできません。EDA・特徴量エンジニアリングとモデルのパラメータチューニングが効きます。
ちなみに,テーマが画像であればディープラーニングの一択です。
特徴量エンジニアリングの全体像を上手くまとめたものが次のサイトにあります。76枚のスライドです。
https://www.slideshare.net/HJvanVeen/feature-engineering-72376750
『FEATURE ENGINEERING』
◆◆Kaggleで成績上位を狙うにはモデリングよりも前処理が重要です◆◆
さて,LightGBM のパラメータチューニングがうまくいったとして,これ以上成績を上げるためには前処理しかありません。すごい裏技に手入力でラベルを書き替えるというものがあります。
普通に前処理をやっていると気が付かないかもしれませんが,Titanicでは大家族は全滅しています。train dataだけでは大家族と判らない人でもtest dataと合わせると大家族と判明することもあります(名前が同じだったり)。そういう人はラベルを生から死へと替えてしまいます。
大家族は全滅ということと対照的な話があります。「釜石の奇跡」と呼ばれる事例です。3.11のとき釜石市内の小中学生ら約3千人のうち亡くなられたのはわずか5人です。津波におそわれたとき大半の生徒は津波被害地にいたそうですが,「てんでんこ」を合言葉に肉親を待たずにまた会いにいかず避難したそうです。
Titanicで大家族は全滅したわけは家族を探したり待ったりして非難が遅れたと思われます。
Name列の中に敬称が入っていますが,これを抜き出してどうようにまとめるかで成績にかなり差がでます。masterは10歳以下の男子が多いのでどう整理したらよいか迷います。 また,captainは死を選ぶだろうなと(test dataにはいない)。 生死を分ける確率が 0.5 付近に注目して生死を入れ替えるなんて荒技をする人もいます。 1人正解が増えると0.2%成績が上がります。上位ではかなり順位が上がります。
チームで参加しているときは,結果をアンサンブルのようなミックスをすると成績が上がることもあります。
いずれにしても生のデータをしっかり読む必要があります。実はこれがEDAなのです。EDAに教科書はありません。ベテランのEDAを参考にするしかないのです。分析ツールには教科書があります。典型的なスタイルをマスターしよう。
実際に動作するJupyter Notebookのhtmlを下に添付します。Jupyter Notebookと下のhtmlを左上隅からダウンロードできます。ファイルinputとoutputのディレクトリを正しくしてください。.ipynbファイルがあるフォルダと同列です。「../input/」「../output/」がフォルダの位置を示しています。
以下にKaggleのTitanicにあるサンプルコードを7つ紹介します
【Titanic Data Science Solutions】
https://www.kaggle.com/startupsci/titanic-data-science-solutionsTitanicのCodeタブで参照されていている数は最上位です。7千人以上から指示されています。
Titanicに参加している人はほとんどこのサンプルコードを見ているのではないでしょうか。あちこちのサンプルコードで同じコードを見かけます。一度は必ず使う前処理の典型だと思います。
モデリングは9種類であり,scikit-learnにあるほぼすべてのモデルを使っています。ただし,パラメータチューニングはしていません。
このモデルをlightGBMとDNNに置き換えたものが,本Webサイトの別記事にあります。
【Titanic best working Classifier】
https://www.kaggle.com/sinakhorami/titanic-best-working-classifier
前処理は基本中の基本を使っているようです。覚えておきたい技術です。
モデリングは10種類であり,scikit-learnにあるほぼすべてのモデルを使っています。ただし,パラメータチューニングはしていません。
【Scikit-Learn ML from Start to Finish】
https://www.kaggle.com/enerrio/scikit-learn-ml-from-start-to-finish
前処理のやり方は覚えておきたいものばかりです。
モデリングはランダムフォレストです。最後のKFoldクロスバリデーションはfor inの2重回しを使っていますが,scikit-learnのcross_val_scoreを使うべきと考えます。
【Applying LightGBM to Titanic dataset】
https://www.kaggle.com/shep312/applying-lightgbm-to-titanic-dataset
前処理に図は一つもありません。
モデリングはlightgbm.trainです。パラメータの設定方法が参考になります。
【Minimalistic Titanic in Python LightGBM】
https://www.kaggle.com/pliptor/minimalistic-titanic-in-python-lightgbm
前処理は最小限しかありません。
モデリングは,lightgbm.LGBMClassifierであり,これをGridSearchCVでパラメータチューニングをします。上のlightgbm.trainよりもパラメータチューニングがやりやすいです。設定が少し複雑になります。
【Microsoft LightGBM (~0.795)】
https://www.kaggle.com/garethjns/microsoft-lightgbm-0-795
lightgbm.train, lightgbm.LGBMClassifier, lightgbm.cv を使います
ROC曲線を描いています。とても参考になります。
【Keras Deep Learning on Titanic data】
https://www.kaggle.com/stefanbergstein/keras-deep-learning-on-titanic-data
バグがあまりにひどいので削除します。エラー警告で書式がpoorだと酷評されています
以上