Google Colabからタイタニック号データセットをアップロードしてBigQuery MLで予測してみた

Google Colabでデータを分割したタイタニック号データセットをCloud Storageへアップロードして、BigQueryで分析してみました。
2022.12.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

皆さん、こんにちは。

クルトンです!

今回のエントリーは『機械学習チームアドベントカレンダー2022』の24日目の記事になります。

前日(12/23)の記事は『Amazon SageMaker Data Wranglerに再入門する(2022年12月版)その2』でした。 前回に引き続きData Wranglerについて入門記事として書かれておりますので、実際の画面上での触り方や「Data Wranglerはどういう事が出来るのだろう」と気になる方はぜひご覧ください!

今回は、Google Colabでタイタニック号データセットを取得し、データを分割してからCloud Storageに上げます。その後、Cloud Storageにあるデータを使ってBigQuery MLを実行します。

なお、Google ColabのランタイムはCPUを使用しています。

Google Colabでデータアップロード先の準備

Cloud Storageのバケットを準備します。

前回書いたこちらの記事と同様の手順ですので、詳しくはこちらをご参照いただきますと幸いです。実行途中の画面なども載せています。

簡単にですが、どういったコードやコマンドを書くのか触れていきます。

環境セットアップ

こちらのコードを実行して、Google Cloudへプログラムからアクセスできるようにしておきます。

from google.colab import auth
auth.authenticate_user()

次にバケットのアップロード先としてリージョンとバケットを定義しておきます。 本記事では、バケットIDをtitanic-data-deploymentとしていますが、お好きな名前へ変更しても大丈夫です。

GCS_DATA_BUCKET = "gs://titanic-data-deployment"
REGION = "asia-northeast1"

次にコマンドからアクセスできるようにしておきます。実行してから、結果を表示する所にDo you want to continue (Y/n)?と出ているので'Y'を打ちます。次に、表示されたリンクからコピーしてきたコードをEnter authorization codeへ貼り付けます。

!gcloud auth login

コマンドを実行するプロジェクトの対象を設定しておきます。

!gcloud config set project <自分のプロジェクトIDへ書き換えてください>

次のコマンドで、プロジェクトの設定が出来ているか確認をします。

!gcloud config list

最後に、バケットを作成します。(既に同じバケットIDで作成されているとエラーが出ます。)

!gsutil mb -l $REGION $GCS_DATA_BUCKET

これでデータセットのアップロード先であるバケットの準備ができました。次はタイタニック号データセットを取得します。

タイタニック号のデータセットを取得

タイタニック号のデータセットはkaggleなどからも取得可能ですが、今回はOpenMLから取得します。

from sklearn import datasets
import pandas as pd

X, y = datasets.fetch_openml(data_id=40945, return_X_y=True, as_frame=True)

sklearnライブラリのfetch_openmlメソッドを使用するときに引数data_idへ番号を指定するとそのデータセットを使用する事ができます。

引数に渡すIDの確認するには、OpenMLでデータセットを検索すると表示されます。 check OpenML dataset id

BigQueryではinput_label_colsでlabelを指定します。そのため、分離されて出てきたデータはconcatメソッドを使ってまとめておきます。

data = pd.concat([X,y],axis=1)

データを学習用、検証用、テスト用に分割してCloud Storageへアップロード

Colabでの作業として最後に、分割したデータそれぞれをCloud Storageへアップロードします。

データを分割

まずはデータを分割するのに必要なモジュールをimportします。

from sklearn.model_selection import train_test_split

次にデータを分割します。分割するためにtrain_test_splitメソッドを2回使用します。 最初はtrainデータとそれ以外のデータに分割します。

train_data, eval_pred_data = train_test_split(data, train_size=0.8)

次にtrainデータ以外として分割したデータを、検証用データと予測用データに分割します。

eval_data, pred_data = train_test_split(eval_pred_data, train_size=0.5)

Cloud Storageへアップロード

アップロードに使う際に使うモジュールのアップデートをしておきます。

!pip install --upgrade google-cloud-aiplatform -q

バケットへのアップロードに使用するClientインスタンスを生成します。

from google.cloud import storage
storageClient = storage.Client()

次にバケットへデータアップロードを複数回行なうため関数定義しておきます。

def upload_csv_file_to_cloud_storage(bucket_name:str, table_data:pd.DataFrame, upload_directory_file_name:str):
  bucket = storageClient.bucket(bucket_name[5:])
  bucket.blob(upload_directory_file_name+'.csv').upload_from_string(data.to_csv(), 'text/csv')

それぞれの引数は次のように受け付けます。

  • bucket_name
    • バケットの名前を指定します。今回は最初の方で定義しておいた変数GCS_DATA_BUCKETを使用します
  • table_data
    • DataFrame形式のテーブルデータを引数にとります。
  • upload_directory_file_name
    • バケットへのアップロードした時のファイルの名前を引数にとります。ここでの名前は/(スラッシュ)を入れることでディレクトリも一緒に入力可能です。存在しないディレクトリの場合は作成されます。

BigQueryではcsvファイルを使用できますので、そちらをアップロードするようにしています。

上で定義した関数を使用して、実際にアップロードします。アップロード対象はtrain_dataとeval_dataとpred_dataの3つです。 それぞれのアップロード時のファイル名はtraining.csvファイル、evaluation.csvファイル、prediction.csvファイルになります。

for data, name in zip([train_data,eval_data,pred_data],['training','evaluation','prediction']):
  upload_csv_file_to_cloud_storage(bucket_name=GCS_DATA_BUCKET, table_data=data, upload_directory_file_name=name)

アップロード完了後にコンソール画面からCloud Storageを確認すると、このような画面になっています。無事にColabからアップロードが出来たようです。

upload display for Cloud Storage

BigQueryでタイタニック号データセットを機械学習する

ここからはGoogle Cloudのコンソール画面から操作を行なっていきます。

最初にBigQueryでの操作時に必要なデータセットを作成してください。作り方が分からない場合はこちらの記事をご参考ください。

本記事ではデータセットをtitanic_from_colab_dataという名前にしています。

BigQueryにCloud Storageからデータをインポート

BigQueryで分析するためにCloud Storageにアップロードしたデータセット3つをBigQueryへインポートします。

まずは、データセットから表示できる「テーブルを作成」をクリックしてください。 BigQuery Table Create from Cloud Storage01

次のような画面が表示されるかと思います。 BigQuery Table Create from Cloud Storage02

上記画像から設定を変更していきます。

最初にテーブルの作成元からGoogle Cloud Storageを選択します。 BigQuery Table Create from Cloud Storage03

次にGCSバケットからファイルを選択するか、URIパターンを使用と書かれているテキストエリアの右端にある「参照」を押します。 BigQuery Table Create from Cloud Storage04

次のような画面が表示されてるのでアップロードしたファイルを選んで「選択」ボタンをクリックします。 BigQuery Table Create from Cloud Storage05 BigQuery Table Create from Cloud Storage06

最後にスキーマの自動検出にチェックマークを入れて、画面下部にある「テーブルを作成」をクリックします。 BigQuery Table Create from Cloud Storage07

ここまでの作業をアップロードしたファイル3つに対して行ないます。

クエリを実行して機械学習を行なう

インポートしたデータを使ってモデルの学習、検証、予測を順番に実行していきます。

次のクエリを実行してモデルの学習を行ないます。今回はランダムフォレストを選びました。お好みで他のモデルに置き換えられます。 データセット名が違う場合はtitanic_from_colab_dataと書いている部分を自分が設定した名前に変更ください。

このクエリの実行には9分5秒掛かりました。

CREATE OR REPLACE MODEL
  `titanic_from_colab_data.random_forest_model`
OPTIONS
  ( model_type='RANDOM_FOREST_CLASSIFIER',
    input_label_cols=['survived']
  ) AS
SELECT
  * 
FROM
  `titanic_from_colab_data.training_data`

学習が上手くいっているのか次のクエリで確認します。

SELECT
  *
FROM
  ML.EVALUATE (MODEL `titanic_from_colab_data.random_forest_model`,
    (
    SELECT
      *
    FROM
      `titanic_from_colab_data.evalution_data`
    )
  )

結果は次のようになりました。

[{
  "precision": "0.91489361702127658",
  "recall": "1.0",
  "accuracy": "0.96946564885496178",
  "f1_score": "0.9555555555555556",
  "log_loss": "0.18701325221424808",
  "roc_auc": "0.989"
}]

とても精度が高いモデルが作成できました! このままこのモデルを使って予測してみます。

次のクエリを実行して予測を行ないます。

SELECT
  *
FROM
  ML.PREDICT (MODEL `titanic_from_colab_data.random_forest_model`,
    (
    SELECT
      *
    FROM
      `titanic_from_colab_data.prediction_data`
     )
  )

実行するとpredicted_survivedpredicted_survived_probs.labelpredicted_survived_probs.probの3つを含めたクエリ結果が返されます。

それぞれの意味は次のようになります。

  • predicted_survived
    • 最終的にモデルが予測したラベルの値です。今回で言うと、survivedの値(0か1)です。
  • predicted_survived_probs.prob
    • 予測した時のどちらであるかの可能性(割合)です。
  • predicted_survived_probs.label
    • `predicted_survived_probs.prob`での割合はどのラベルの値かを確認するのに使います。

つまり、0か1のどちらであるか100%の中で判断して、数値(割合)が大きい方を予測値として採用しています。

実際にsurvivedの値を確認していくと上手く予測が出来ていそうです。

終わりに

今回はColabで加工したデータをCloud Storageにアップロードした後に、BigQuery MLを使って予測できるか確かめてみました。

今回の記事と同じ流れでやれば手元でデータを前処理したものをBigQuery上で簡単に分析出来そうです。

今回はここまで。

それでは、また!

参考にしたサイト