小さなエンドウ豆

まだまだいろいろ勉強中

Kaggle に初挑戦

Kaggle とは

簡単に言うにまとめると

  1. データ持ってる人がデータ投稿する
  2. 投稿者がコンペを開く
  3. 世界中のデータサイエンティストたちが分析を行う
  4. 分析結果を Kaggle に提出してスコアが算出される
  5. 算出されたスコアをもとに競う

細かくいうとこんな感じです。
僕も存在は知っていたのですが、なかなか手が出せずにいました。
今日は Kaggle の中でも有名な タイタニックの生存予測」 のコンペに提出するまでの流れを説明したいと思います。

Kaggle 始め方

Kaggle

まずはアクセスしてアカウントを作ります。
FacebookGoogle のアカウントでサインインできるのでそれらを使うと便利かもです。

コンペへの参加の仕方

アカウントを作るとよくわからない偉い人たちのフィードが現れます。
とりあえず、これらは無視して、ページ上部の Competitions とクリックします。 f:id:h-piiice16:20170820173325p:plain

これですね。
これをクリックすると、いろいろなコンペが表示されます。
スクロールするとタイタニックのコンペもあるので、これをクリックします。

f:id:h-piiice16:20170820173600p:plain

すると、コンペの詳細ページが表示されます。
ここで予測に必要なデータをダウンロードします。
f:id:h-piiice16:20170820173828p:plain

ここで、以下の2つのファイルをダウンロードします。

(名前からして説明はいらないかもですけど、一応訓練データと予測用のデータです。)

生存予測

今回は提出するまでを目標としているので予測に関しては凝りませんでした。
使うモデルは Random Forest です。
予測を行うにあたり便利なのが Jupyter notebook でした。
これに関しては以下の記事を参考にして Anaconda をインストールしていただくと環境が整うと思います。

h-piiice16.hatenablog.com

train.csv の中身は数値データだけでなく文字列で与えられるデータもあります。
ランダムフォレストに学習させるデータは数値データでなくてはならないので train.csv の中からは以下のカラムを抜き出して使用しました。

  • Pclass … 乗客のクラス(1が高いらしい)
  • Sex … 性別
  • Age … 年齢
  • SibSp … 兄弟と配偶者の数
  • Parch … 親と子供の数
  • Fare … 料金

前処理として以下の2つを行いました。参考

# male ... 0, female ... 1
data = pd.read_csv('train.csv').replace('male', 0).replace('female', 1)

# データの抜き出し
train_data = data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare]]

# Age の欠損値を中央値で埋める
train_data["Age"].fillna(train_data.Age.median(), inplace=True)

# Fare の欠損値を中央値で埋める
train_data["Fare"].fillna(train_data.Fare.median(), inplace=True)

性別のデータは男性が male、女性が female で与えられているためそれを数値に変換します。
欠損値(NaN)に関しては中央値で埋めます。
これを test.csv にも行います。
そして scikit-learn の Random Forest を使ってモデルを作り、結果を出します。
ランダムフォレスト使ってタイタニックの生存予測をする例が以下になります。

# lable_data は正解データ
# label_data = data['Survived'] で抽出
# モデルの作成
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(train_data, label_data)

# test_data は test.csv を加工したもの
# 予測
output = model.predict(test_data)

# 提出用のファイルへの書き出し
# test_origin は test.csv を読み込んだもの
test_origin['Survived'] = output
submit_data = test_origin[['PassengerId', 'Survived']]
submit_data.to_csv('output.csv', index=False)

これで output.csv に予測結果が出力される。
PassengerId は予測用のデータに付与されている乗客を表すIDのことです。
提出用のファイルの形式はこの PassengerId と 生存結果を表す Survived を並べたものです。

提出

先程のコンペの詳細ページへ戻り、Submit Prediction を押します。 このページで output.csv をアップロードし提出完了です!
このあとスコアが計算され、順位も出ます。(僕は6000番くらいでした…)

まとめ

以上が提出までの手順となります。
タイタニック以外にもコンペがたくさんあるのでなにかしらにチャレンジしたと思います。
今回提出に当たって便利だと思ったものを以下にまとめます。

  • Chrome ? の翻訳
    Kaggle のページで右クリックでできる
    ページが英語なので結構役に立つw
  • Jupyter notebook
    書いたコードを残せるので便利!
    グラフなどもかけるので分析が捗りそう
  • pandas
    python のライブラリで csv の読み込みや書き出し、欠損値の埋め合わせやデータの抽出などが簡単にできる

これで Kaggle では怖いものなしだと思われます(たぶん)