この記事はPONOS Advent Calendar 2019の23日目の記事です。
はじめに
この記事は面倒くさい準備作業を省いて手っ取り早く機械学習をお試しすることを目的としています。
詳しい手法の解説や問題の解法などには触れません。
Kaggleに登録
まずはKaggle(カグル)に登録しましょう。
Kaggleは世界中のデータサイエンティストや機械学習エンジニアたちが日夜鎬を削っているプラットフォームです。
web上でpythonの実行環境が用意されており、必要なライブラリや学習データもすべてそろっているのでローカルに環境構築をしなくてもすぐお試しができます。
タイタニック号沈没事故のデータを使ってお試し
Kaggleでは日々コンペが開かれており、色々なデータに触れることができます。
今回は開催中のコンペではなくチュートリアルとして常時開かれているTitanic: Machine Learning from Disasterを使用します。
このコンペの目的はタイタニック号の乗客名簿(名前、年齢、性別、客室クラスなど)と生存したかどうかを学習データとして、生存情報のない乗客が生存したかどうかを判定することです。
コンペに参加する
Join Competitionを押すと参加できます。
Notebookを作る
Notebooksタブに移動してNew Notebookを押すと作成できます。
設定画面に移動します。デフォルトのままで良いのでそのままCreateを押します。
データを見る
まずは学習するデータを見てみます。
最初から書かれているコードを消して以下のコードを書きます。
import pandas as pd
ctrl+enterを押すか、左側の再生ボタンを押すとそのセルの内容を実行できます。
ここではライブラリを読み込んでいるだけなので何も変化は起こりません。
bを押すか、セルの下側に表示される+codeを押して新しいセルを追加して以下のコードを書きます。
train = pd.read_csv('../input/titanic/train.csv')
test = pd.read_csv('../input/titanic/test.csv')
passenger_id = test.PassengerId # 提出用に保存しておく
train.head(3)
実行してテーブルが表示されたら成功です。今回はこの中からSurvived, Pclass, Sex, Age, SibSp, Parch, Fare, Embarkedを使用します。
train = train.iloc[:, [1, 2, 4, 5, 6, 7, 9, 11]]
test = test.iloc[:, [1, 3, 4, 5, 6, 8, 10]]
データを整形する
学習するためには数値データが必要なので、データを整形していきます。
まずデータ欠損を補修します。
train.Age, train.Embarked, test.Age, test.Fareは欠損しているデータがあるのでこれをいい塩梅の数値で埋めます。今回はEmbarkedはS、他は中央値で埋めます。
train.Age = train.Age.fillna(train.Age.median())
train.Embarked = train.Embarked.fillna('S')
test.Age = test.Age.fillna(test.Age.median())
test.Fare = test.Fare.fillna(test.Fare.median())
次にSex, Embarkedをワンホットエンコーディングで数値に変換します。
train = pd.get_dummies(train)
test = pd.get_dummies(test)
最後にAgeとFareを離散値に変換します。numpyを使用するのでライブラリを読み込みます。
import numpy as np
train.Age = np.digitize(train.Age, bins=[10, 20, 30, 40, 50])
train.Fare = np.digitize(test.Fare, bins=[10, 20, 30])
test.Age = np.digitize(train.Age, bins=[10, 20, 30, 40, 50])
test.Fare = np.digitize(test.Fare, bins=[10, 20, 30])
学習する
今回はランダムフォレストを使います。少しずつ違う決定木を学習させてそれらを平均する手法です。
まずライブラリ(scikit-learn)を読み込みます。
from sklearn.ensemble import RandomForestClassifier
先ほどの学習データのSurvivedを分離します。新しいセルを追加して以下のコードを書きます。
X = train.iloc[:, 1:]
y = train.iloc[:, 1]
学習データの準備ができたので学習させていきます。
forest = RandomForestClassifier(n_estimators=5, random_state=0)
forest.fit(X, y)
学習ができたのでテストデータを使って予測をします。
predictions = forest.predict(test)
最後に予測結果をファイルに保存します。
submission = pd.DataFrame({ 'PassengerId': passenger_id, 'Survived': predictions })
submission.to_csv('submission.csv', index=False)
Kaggleに提出する
Commitボタンを押すとポップアップウィンドウが表示されます。
完了になったらOpen Versionボタンを押します。
新しく開いた画面のOutputの欄に先程保存したsubmission.csvとSubmit to Competitionボタンがあるのでこれを押します。
提出が完了するとスコアが表示されます。
0.76(1に近付くほど良いスコア)ぐらいになると思います。
そして実際のコンペティションへ…
今回お試ししたように学習部分は大体ライブラリがやってくれます。
実際に大変なのは圧倒的にデータ成形部分でした(精度を出そうと思ったらもっと大変)。
こういった作業が得意な人は機械学習の道に足を踏み込んでみるのも良いかもしれません。