Google Colabからタイタニック号データセットをアップロードしてBigQuery MLで予測してみた
皆さん、こんにちは。
クルトンです!
今回のエントリーは『機械学習チームアドベントカレンダー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でデータセットを検索すると表示されます。
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からアップロードが出来たようです。
BigQueryでタイタニック号データセットを機械学習する
ここからはGoogle Cloudのコンソール画面から操作を行なっていきます。
最初にBigQueryでの操作時に必要なデータセットを作成してください。作り方が分からない場合はこちらの記事をご参考ください。
本記事ではデータセットをtitanic_from_colab_data
という名前にしています。
BigQueryにCloud Storageからデータをインポート
BigQueryで分析するためにCloud Storageにアップロードしたデータセット3つをBigQueryへインポートします。
まずは、データセットから表示できる「テーブルを作成」をクリックしてください。
次のような画面が表示されるかと思います。
上記画像から設定を変更していきます。
最初にテーブルの作成元
からGoogle Cloud Storageを選択します。
次にGCSバケットからファイルを選択するか、URIパターンを使用
と書かれているテキストエリアの右端にある「参照」を押します。
次のような画面が表示されてるのでアップロードしたファイルを選んで「選択」ボタンをクリックします。
最後にスキーマ
の自動検出にチェックマークを入れて、画面下部にある「テーブルを作成」をクリックします。
ここまでの作業をアップロードしたファイル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_survived
とpredicted_survived_probs.label
とpredicted_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上で簡単に分析出来そうです。
今回はここまで。
それでは、また!