今までKaggle関係のコードは見てきていたが、実際にKaggleのcompetitionsとしてやったことはなかったので、今回やってみた。
#1. Kaggle登録
まずはKaggleのサイトで登録だが、Googleアカウントで一瞬で終わった。
#2. Titanicチュートリアル
Kaggleへのアカウント登録が終わると、さっそくいろんなcompetitionsをやってみたくなるが、Kaggle入門者用のcompetitionsが3つほど並んでいたので、有名なタイタニック問題をやってみることにした。普通のcompetitionsは3か月程度の期間指定があるが、これらは常に挑戦出来る初心者用の問題として設置されている。
タイタニックコンペのサイトを開くと、説明等の記載があり、端っこに[Join competition]があるので参加表明する。
参加すると、[New Notebook]ボタンが現れ、ここでPythonコードを書いていく環境を使えるようになる。ここでゴリゴリ頑張っていってもよいが、タイタニックのチュートリアルがあるのを発見したので、まずはそっちをやってみる。
#3. Titanic チュートリアル
ALEXIS COOKさん(Googleの人?)という方が作っているTitanicのチュートリアルページがあるのを発見したので、最初はチュートリアル通りやってみて流れをつかむことにした。
チュートリアルはKaggleアカウントの作り方から始まり、Titanic問題の簡単な予測結果をファイル出力して、KaggleへSubmitするところまではいっていた。
コードの中身はチュートリアル参照。
チュートリアルを終了して予測結果(submission.csv)をKaggleへ提出すると、My Submissionsというところで結果が表示される。ここではScore 0.77511となっている。
そして、Leaderboadにもその結果がランキングとして反映されている。ランキング表示されると、ついにKaggle始めたかという気になって地味にうれしい。
しかし予測モデルは完全にチュートリアルのコピーであり自分で考えてないので、次はほかの人がどんなモデル作っているのかを参考に考えていく。
チュートリアルでは、3時間のIntro to Machine Learning を推奨していたので、また今度こっちもやってみる。
#4. 実装の復習
チュートリアルやっているなかで、一部コードの意味が分からなかったので復習をしておく。
#4.1. pandasのget_dummies
データ処理をpandasを使って行っているが、get_dummiesという知らない関数があったので確認。
train_data = pd.read_csv("/kaggle/input/titanic/train.csv")
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
pandas.get_dummies は、pandasのリファレンスを見ると、カテゴリカル変数をダミー変数に変換する処理と書かれている。
カテゴリカル変数とは、性別(男、女)や、血液型(A、B、AB、O)などの計数データのことである。
機械学習の前処理として、こういうカテゴリカル変数を、0,1などで扱えるようにダミー変数を用意してフォーマット変換してくれる関数のようである。
変換前のtrain_data[]は、以下のように[Sex]という変数の中に、[male/female]が入っている。
これを変換して、[Sex_female][Sex_male]というダミー変数を作る処理である。
#4.2. Random Forestの使い方
次にScikit-learnのRandom Forestの使い方である。
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1) #モデル準備
model.fit(X, y) #モデル学習
predictions = model.predict(X_test) #予測
入力データXは、Titanicの元データから一部の列データ( ["Pclass", "Sex", "SibSp", "Parch"])に制限して、get_dummies()でカテゴリカル変数をSexをダミーに調整したデータ。教師データyは、そのデータに対応するSurviveデータである
次に、以下がモデル構築部分であるが、引数のパラメータの意味が分からない。
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
scikit-learnのリファレンスを見てみると細かく説明があった。n_estimatorsは決定木の数。100がデフォルト。max_depthは、決定木の深さ。過学習になるから深すぎるのはよくないようである。
random_state では、決定木を構築するときに使用されるサンプルデータのランダム性を制御することができるようであるが詳細は不明。この辺りはパラメータを変えながら結果を見て理解したいところである。
Parameters | default | guide |
---|---|---|
n_estimatorsint | 100 | The number of trees in the forest. |
max_depth | None | The maximum depth of the tree. If None, then nodes are expanded until all leaves are pure or until all leaves contain less than min_samples_split samples. |
random_state | None | Controls both the randomness of the bootstrapping of the samples used when building trees (if bootstrap=True) and the sampling of the features to consider when looking for the best split at each node (if max_features < n_features). See Glossary for details. |