機械学習を使ったデータ分析~Dockerによる環境構築からKaggle投稿まで

私は3年前に中国で機械学習やディープラーニングのオンラインセミナーを受講しました。「日本ディープラーニング協会」のG検定資格も取得したのですが、その後全く利用しておらず内容をほぼ忘れてしまいました。

復習を兼ねてゼロからJupyter Notebook(Jupyter Lab)の環境を構築し、Kaggleのチュートリアルを試してみました。

事前準備

今回は、Windows10 ProにDockerを利用して「Jupyter Notebook(Jupyter Lab)」を導入します。

1.Windows に Docker Desktop をインストール

下記URLを参考にWindows に Docker Desktop をインストールする

Windows に Docker Desktop をインストール — Docker-docs-ja 19.03 ドキュメント

2.Dockerを使ってJupyter notebookの環境を構築

下記URLを参考にJupyter notebookの環境を構築する

Dockerを使って5分でJupyter環境を構築する - Qiita

[jupyter/scipy-notebook]imageには、pandasやscikit-learn等機械学習に必要なライブラリが最初から含まれています。

また、JupyterLabもインストールされます。(localhost:8888/でアクセスすると従来のJupyterNotebook形式になり、localhost:8888/lab でアクセスするとJupyterLabが表示されます。)

Kaggleのチュートリアル

環境構築が終わったので、Kaggleのチュートリアルを利用しながら機械学習の基礎を学びます。Kaggleとは実際のデータを元に、世界中の利用者が最適モデルを競い合うプラットフォームです

タイタニック号生存者予測

今回利用したのは中でも一番有名な「タイタニック号生存者予測」の課題。

Titanic - Machine Learning from Disaster | Kaggle

タイタニック号は1912年沈没し2224人の乗客乗員の内1502人が亡くなりました。生き残るのは運以外の要素もあり特定のグループの人は他のグループより生存率が高かったようです。乗客データを元に「どのような人々が生き残る可能性が高いか」予測モデルを構築します

データの確認

訓練データとして提供されるのは891名分の情報(train.csv)。まずはデータを確認します。

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

f:id:denim012:20210719111055p:plain
顧客名簿(名前、年齢、性別、チケットクラス、同乗家族有無、客室番号など)と生存情報(Survived)があります。

テストデータ(test.csv)の確認

f:id:denim012:20210719111117p:plain

こちらは418名分の顧客名簿です。生存情報は含まれていません。今回は訓練データを使って予測モデルを作成し、テストデータの内だれが生存するのかを予測します。

欠損データの確認

訓練データに欠損があるか確認します。

train.isnull().sum()

顧客名簿の中で、年齢、cabin情報が記入されていない人がいます。

f:id:denim012:20210719111133p:plain

有用な特徴量を探す

顧客名簿の情報の内どの項目が生存率と関係がありそうか確認します。

f:id:denim012:20210719111150p:plain

女性は生存率が高いことが分かります。また、ファーストクラスの乗客の生存率が高く3等クラスの乗客は生存率が低いことが読み取れます。

これらの項目は機械学習をする上での有用な特徴量であることがわかります。同じように他の項目も生存率に関連があるか眺めてみます。

データの事前処理

1.文字列を数字に変換

顧客名簿の性別情報は「male」「female」のように文字列で登録されています。機械学習を行いやすいよう数字に変換します。

2.欠損データに仮のデータを設定

顧客名簿の中には年齢が記入されていないものがありました。仮のデータとして全データの中央値を代理設定します。

モデルのトレーニングと予測

顧客名簿の中から「年齢、性別、チケットクラス、料金、配偶者/兄弟の数、親/子供の数、出発港」の7項目を利用し、ランダムフォレストで訓練しテストデータを予測します。ハイパーパラメータは以下の通り。

model = RandomForestClassifier(max_depth=3, random_state=3)
model.fit(X_train,y_train)
val_predictions = model.predict(X_valid)

予測結果をkaggleに投稿すると正解率は「0.77511」でした。

f:id:denim012:20210719111257p:plain

全投稿者のうちランキングは30,740位です。

ここまでの内容は下記URLを参考に作成しています。

www.codexa.net

今回ランダムフォレストを使用したので、このサイトで使われている決定木を使ったものよりは正解率が高くなっています。

まとめ

機械学習環境を構築し、Kaggleのチュートリアルまで実行してみました。今後はKaggleの中から最新の需要予測で使われるモデルデータ処理について学んでいこうかと思います。