KaggleのTitanicコンペに取り組んだので忘れないうちに書いておきます。
始めた理由
元々取り組みたいと思っていましたが、一番のきっかけは先日参加したFJCTのデータサイエンスインターンです。参加した学生や企業の方もKaggleに取り組んでいる方が多く、インターン中もメンターの方から「この辺りはKaggleをやってると大切さを実感できるよ」というような話を伺ったりもしたので、インターンが終わった日の夜からモチベーションが高いうちに始めました。
データサイエンスインターン終了しましたが、宿泊組でそのまま深夜のKaggle会が始まりました
— セーター (@re_sweater) 2018年9月5日
ちなみに、タイトルで初めてと書いていますが、実際は少し前に一度挑戦したことがあります。以前からkaggler-jaのSlackに入っており、その中でビギナー向けに行っていたKaggler-ja In-class Competition1に取り組みました。ただ、このときはあまり取り組む余裕がなかったこともあり、一つの手法を試してみる程度でした。
取り組んだコンペとやったこと
コンペはチュートリアルとして有名なTitanicに取り組みました。
やったこととしては、
- データの可視化と欠損値処理、カテゴリ変数の処理
- Random ForestでAccuracyを出す
- Light GBMでAccuracyを出す
- Feature importanceの確認
- SFSで特徴選択して再学習
辺りをやってみました。
データの可視化と欠損値処理
データの可視化
まず各データの上位5件の中身を確認した後、データを可視化して欠損を見てみました。
見たところCabinは欠損値が多すぎて有効なデータとして扱えそうにないので消しました。また、Name、Ticketもあまり関係なさそうなので削除しました(PassengerIDも消すつもりでしたが、1回RandomForestで結果を出してからPassengerIDを消し忘れたことに気付きました汗)。
欠損値処理
詳しく見てみると、いくつか欠損値が見られたのでその処理を行いました。欠損値が2つしかなかったEmbarkedでは最頻値を、それ以外では平均値を入れましたが、Ageは20%近い欠損があったのでもう少し考慮する必要があるのかもしれないです。
カテゴリ変数の処理
数値化されていないSex及びEmbarkedは数値化する必要があるので、scikit-learnのLabel Encoderで数値化しました。
Random ForestでAccuracyを出す
とりあえずRandom ForestでAccuracyを出してみました。この時はだいぶ手探りでやっていたので、特徴量はPassengerID、Pclass、Sex、SibSp、Parch、Fareで行いました。testデータの結果は0.74641となり、これをベースに取り組んでいきました。
LightGBMでAccuracyを出す
次に、先日のインターンでも多用したLightGBMで学習させてAccuracyを出してみました。Feature importanceで寄与度を確認して用いる特徴量を確認しながら3つほど試してみました。結果としては、
- PassengerID、Pclass、Sex、SibSp、Parch、Fare(Random Forestと同じ)
→ 0.73684 - Pclass、Sex、SibSp、Parch、Fare、Age
→ 0.76076 - Pclass、Sex、SibSp、Parch、Fare、Age、Embarked
→ 0.76076
のような形になりました。
SFSで特徴選択してみる
最近大学の講義でSFSでの特徴選択のプログラムを作成していたので、使ってみました。ここでは、KNNで学習を行い、trainデータを分割して検証しました。
結果としては特徴量はPclass、Sex、Parch、Embarkedの4つのとき最適という結果になりました。ただ、精度があまり高くなかったこと、Survivedに対する特徴量ごとの相関係数を求めた結果やFeature importanceを可視化して見たときの特徴量と選択された特徴量が一致しなかったことがイマイチ理解できなかったのでその辺りをもう少し勉強したいと思います……
まとめ
初めてしっかりKaggleに取り組み、課題も多く残りましたが、どのように取り組んでいけばいいのかなんとなく理解することができました。なにより、今まで取り組みたくても欠損値の扱いなどが手探りすぎてなかなか出来ていませんでしたが、インターンシップを通して学んだことを生かすことでスムーズにコードを書くことができたので、データ分析そのものを楽しく取り組めました。
また、やっていく中でなぜ特徴量エンジニアリングが必要なのかも分かってきたので、次はその辺りもやっていければいいかなと思います。