機械学習とその他

機械学習したいマン

kaggleの始め方

アドベントカレンダー21日目です。

adventar.org

今日はリクエストみたいなことされたので、kaggleの始め方について書きたいとおもいます。

kaggleとは

つい先日軽く触れたのでここを少し参照してください。

looseleaf0727.hatenablog.jp

コンペに参加

kaggleではいろんなコンペが開かれています。コンペの一覧はこちらから確認できます。 Competitions | Kaggle

練習用のものや、実際に賞金が出るもの、終わったコンペなどが見られます。 今回は入門用のTitanicに挑戦してみます。 https://www.kaggle.com/competitions f:id:looseleaf0727:20171222132549p:plain

コンペの概要

それぞれのコンペをクリックした先のページ、Overviewに書かれています。 どのような課題があるのか、どのようなデータが与えられるのか、何を予測してほしいのか、賞金についてなど色々ここに書かれています。

今回のTitanicの例では、有名なタイタニック号の沈没の話ですが、乗船していた客に生存者がいました。生存したか、チケットの等級、性別、年齢・・・など様々な情報が学習データとして与えられます。この学習データを元に、予測を行うモデルを作成します。最終的には、生存したかどうかが抜けている本番データを用いて、生存したかどうかを予測します。

与えられるデータの中身やその説明などはDataタブに書かれています。 OverviewのEvaluationには、提出するファイルのフォーマットが書かれています。このフォーマットに基づいたファイルを提出することで、精度などのスコアが計算され、自分の順位を確認できるようになります。

データのダウンロードと予測

今回コンペのデータとして、学習に使うtrain.csv,検証に使うtest.csv,あとgender_submission.csvの3つのファイルが与えられています。train.csvを使って、予測をしていきましょう。

環境はjupyter notebook、python3でいきます。 基本的にはpandasとかいうの使うと便利なのでそれでいきましょう。

csvを読み込んでpandasのDataFrameにしました。headを使うことで指定した分だけデータを見れます。表で見れるのがいいですね。

import pandas as pd
train = pd.read_csv("train.csv")

train.head(3)

f:id:looseleaf0727:20171222170008p:plain

dtypeを見ておきます。

train.dtypes

>>>
PassengerId      int64
Survived         int64
Pclass           int64
Name            object
Sex             object
Age            float64
SibSp            int64
Parch            int64
Ticket          object
Fare           float64
Cabin           object
Embarked        object
dtype: object

null値が入ってないか確認しましょう。

train.isnull().sum()

>>>
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

性別で生存率が違うのかなあって思ったので調べてみましょう。欠損もラッキーなことにありませんでした。まずは人数を調べます。

len(train[train.Sex == "male"])
>>> 577

len(train[train.Sex == "female"])
>>> 314

性別ごとの生存率を見てみましょう。1なら生存してます。

(train[train.Sex == "male"]["Survived"] == 1).mean()
>>> 0.18890814558058924

(train[train.Sex == "female"]["Survived"] == 1).mean()
>>> 0.7420382165605095

男性は19%しか生存してないけど、女性は74%も生存してますね。
何も考えずに、男性なら死亡、女性なら生存で予測するモデルということにしましょう。

本番データを読み込んで、欠損値の確認をします。

test = pd.read_csv("test.csv")
test.isnull().sum()

>>>
PassengerId      0
Pclass           0
Name             0
Sex              0
Age             86
SibSp            0
Parch            0
Ticket           0
Fare             1
Cabin          327
Embarked         0
dtype: int64

先程の条件で、性別のみで決定をしていきます。
あとは、提出するフォーマットに合わせるため、Idと予測でセットにします。
注意点としては、index=Falseにしておかないと提出したときにエラーを出します。

Survived = []

for i in test.Sex:
    if i == "male":
        Survived.append(0)
    else:
        Survived.append(1)

out = pd.DataFrame(test.PassengerId)
out["Survived"] = Survived
out.to_csv("submission1.csv", index=False)

あとは、出力されたcsvを提出します。
Submit Predictionから提出できます。 f:id:looseleaf0727:20171222171800p:plain

csvファイルをアップロードし、Optionalですが、Describeを記入してもいいです。 f:id:looseleaf0727:20171222171812p:plain

スコアはLeaderBoardから確認できます。自分のスコアや、正しく動作したかなどが表示されます。 f:id:looseleaf0727:20171222172058p:plain

コンペのトップページで再び戻ってみると、順位を確認できます。 f:id:looseleaf0727:20171222172238p:plain

機械学習を使う

機械学習を使う際にはscikit-learnを使うと非常に楽ができます。 * 学習データと検証データの分割 * F1値などの表示 * 学習と予測 * 最適なパラメータの探索 * 混合行列の作成

使うアルゴリズムの選定は、scikit-learnに選ぶときに参考になる画像があります。そちらを見て決めていきましょう。

今回は色々検証したりしたのですが、めちゃめちゃ書くと文量が多くなるので途中でやめておきます・・・。 ソースコードは貼り付けておくので見てみてください。