Amazon SageMaker JumpStartのビルドインアルゴリズムでタイタニック号の生存率予測

目次
概要
クラウドインテグレーション部、
クラウドソリューション2課の川井です。
2024年12月にAWS認定資格『AWS Certified Machine Learning Engineer - Associate』を取得しました。
資格取得の学習を通じて Amazon SageMaker JumpStart(以降、SageMaker JumpStart)を活用することで、簡単に機械学習モデルの構築や検証が可能であることを学びましたが、現在の業務では機械学習に直接関わる機会はありません。
そこで、今回は SageMaker JumpStartを利用し、タイタニック号の乗客データを用いた生存率予測を行います。
SageMaker JumpStartとは?
SageMaker JumpStart は、Amazon SageMakerに搭載されたツールで、機械学習モデルの構築、トレーニング、デプロイを迅速かつ簡単に始められるプラットフォームです。
機械学習の初心者から上級者まで幅広く対応しており、専門的な知識が少ない方でも効率的にモデル開発が行えます。
また、SageMaker JumpStartには以下のような多彩な ビルトインアルゴリズム(組み込みアルゴリズム)や 事前トレーニング済みモデル が提供されています。
・回帰分析:線形回帰、ロジスティック回帰
・勾配ブースティング:XGBoost
・クラスター分析:K-Means
詳細なアルゴリズム一覧は公式ドキュメントをご覧ください。
Built-in algorithms and pretrained models in Amazon SageMaker
今回は、SageMaker JumpStartが提供するビルトインアルゴリズムの一つである CatBoost(Categorical Boosting) を活用し、タイタニック号の生存率を予測するモデルを構築します。
具体的には、事前に構築されたCatBoostモデルをベースに、タイタニック号の乗客データを用いて、モデルの再トレーニング(以降、ファインチューニング)を実施します。
これにより、乗客が生存する可能性を予測するカスタマイズされたモデルを作成します。
CatBoostは、カテゴリカルデータ(例:性別や乗客クラスなど)を直接処理できる優れたアルゴリズムで、次の特徴を持ちます。
・カテゴリカルデータの直接処理:エンコーディング不要で効率的な学習が可能
・高精度:非線形性の高いデータに対しても優れた性能を発揮
・簡単なチューニング:デフォルト設定でも高い精度が期待できる
CatBoostは以下のタスクで利用されています。
・分類(Classification):スパムメール判定、顧客離反予測など
・回帰(Regression):売上予測、価格予測など
タイタニック号の生存率予測は「分類問題」に該当するため、CatBoostは非常に適した選択肢と考えられます。
使用するデータセットは?
タイタニック号の乗客データを用い、以下の項目を学習させます。
○ラベル(ターゲット変数)
・Survived:生存したかどうか(1: 生存、0: 非生存)
○特徴量(入力データ)
・Name:名前
・Sex:性別
・Age:年齢
・Pclass:乗客クラス(1等、2等、3等)
・同伴者の数
・SibSp:兄弟・配偶者の同伴数
・Parch:親・子供の同伴数
・Embarked:乗船した港(S = Southampton、C = Cherbourg、Q = Queenstown)
・Fare:乗船料金
など
このデータを基に、タイタニック号で生存した人の特徴を学習するモデルをCatBoostアルゴリズムを用いて構築します。
そして、新しい乗客データを活用してモデルによる生存可能性の推論を行います。
構築プロセス
タイタニック号の生存率予測モデルを構築する際の手順と流れの詳細です。
※タイタニック号の乗客データはネットで入手可能なCSVファイルを使用しています。以下に今回使用するデータを添付します。
〇手順1: SageMaker Studio の起動
まず、AWS Management ConsoleからAmazon SageMaker Studio(以降、SageMaker Studio)を起動します。
SageMaker Studioは統合された開発環境(IDE)で、データの準備、モデル構築、トレーニング、デプロイなどを一貫して実施できる強力なツールです。
〇手順2: データの前処理
次に、Amazon SageMakerのData Wranglerを使用して、タイタニック号の乗客データを前処理します。
以下のような具体的な前処理を行います。
1.ワンホットエンコード(One-Hot Encoding)
例: Sex(性別)やEmbarked(乗船した港)などのカテゴリ変数を数値データに変換。
2.欠損値の処理
年齢や料金(AgeやFare)に欠損値がある場合、平均値や中央値で補完します。
3.正規化(Normalization)
特徴量のスケールを揃えるため、料金(Fare)などの数値データを正規化します。
4.不要な列の削除
モデルのトレーニングに不要な列(例: NameやTicket)を削除します。
これらの前処理によって、アルゴリズムが効率よく学習できるデータセットを準備します。
〇手順 3: CatBoostモデルのファインチューニング
SageMaker JumpStart にアクセスし、提供されているCatBoost(Categorical Boosting)モデルを選択します。
以下の操作を行います。
1.トレーニングデータを指定
手順2で前処理したCSVファイルを、S3バケットからアップロードします。
2.ファインチューニングの実施
CatBoostモデルを基に、トレーニングデータを使ってモデルをファインチューニングします。
ファインチューニングによって、タイタニック号の生存率予測に最適化されたカスタムモデルを構築します。
〇手順 4: エンドポイントのデプロイ
トレーニング済みのモデルを SageMaker JumpStartエンドポイントとしてデプロイします。
デプロイしたエンドポイントを利用することで、新規データに対してリアルタイムの推論を行うことが可能になります。
〇手順 5: 新規データを用いた推論
最後に、新しい乗客データ(前処理済みのCSV形式)を用いて、SageMaker JumpStartエンドポイントを介した推論を行います。
具体的には、次のような操作を実施します。
1.新規データの準備
CSVファイルを用意(このデータには目的変数Survived列は含めない)
2.エンドポイントへのリクエスト
データをエンドポイントに送信し、各乗客の生存確率を推論します。
3.推論結果の確認
各乗客について、0(非生存)または1(生存)のラベルと、それに対応する生存確率を取得します。
この手順により、SageMaker JumpStart と CatBoost を活用して、タイタニック号の乗客データを基に生存率予測モデルを構築し、新規データの推論までを一貫して行えます。
次項から、手順を順番に進めていきます。
SageMaker Studio の起動
SageMaker Studioを起動します。
SageMaker Studioとは?
Amazon SageMaker Studioは、Amazon Web Services (以降、AWS) が提供する統合開発環境 (IDE) であり、
機械学習 (ML) プロジェクトを迅速かつ簡単に構築、トレーニング、デプロイできるプラットフォームです。
今回使用するData WranglerやSageMaker JumpStartは、SageMaker Studio内で提供される機能の一部です。
SageMaker Studioを利用するには、事前にドメインの作成が必要です。
そのため、まずはAmazon SageMakerのAIコンソールから「ドメイン」を選択し、「ドメインを作成」して環境を整えるところから始めます。
※ドメインとは、Studio環境を管理するための基盤的な設定をまとめたものです。
ドメインには以下の情報が含まれています。
ユーザーの管理情報:Studio にアクセスできるユーザー(IAMロールやユーザー)の設定を保持します。
ネットワーク設定:SageMaker Studio がどの VPC(仮想プライベートクラウド)やサブネットを使用するかを定義します。
デフォルト設定:Studio のセッションに必要なリソース(インスタンスサイズやデフォルトストレージなど)を設定します。
SageMaker Domain を設定箇所では「組織向けの設定」を選択して次に進みます。
簡易作成したい場合は「クイックセットアップ」を選択ください。ドメイン作成に必要な全てのリソースが自動で作成されます。
ステップ1:ドメインの詳細とユーザーを設定では自由に「ドメイン名」を入力、SageMaker Studioにどのようにアクセスへするかは「AWS アイデンティティセンター」を選択して次に進みます。
「AWS アイデンティティセンター」を選択すると、Amazon SageMaker コンソールからだけでなく、アイデンティティセンターを使用したURLからSageMaker Studioにログインすることが出来るようになります。
ステップ2:ロールとMLアクティビティでは「既存のロールを使用」をAmazonSageMaker-ExecutionRoleを選択して次に進みます。
※AmazonSageMaker-ExecutionRoleは、クイックスタートで一度でもドメインを作成した事があれば自動で作成されています。
ですので、まだ一度も作成したことがない場合は「新しいロールを作成」でロールを作成してください。
ステップ3 & 4:アプリケーションを設定とStudio UIをカスタマイズでは、デフォルトのままで次に進みます。
使用したいアプリケーションがあれば有効にしていってください。ドメイン作成後でも変更可能です。
ステップ5:ネットワーク設定を編集では、「パブリックインターネットアクセス」を選択して次に進みます。
※本記事では検証を目的としているため、パブリックインターネットアクセスを選択していますので、
警告文でVPCエンドポイントがありませんと表示されていますが必須ではありません。
ステップ6:ストレージを設定では、デフォルトのままで次に進みドメインを作成します。
※「EFS ストレージとデータを自動的にマウント」の箇所を有効にしていると自動でEFS作成されます。
ステータスが「InService」になれば問題なく作成されています。
最後にユーザーを追加します。
作成したドメイン名を選択し、「ユーザープロファイル」の設定画面に進みます。次に「ユーザーとグループの割り当て」セクションから、追加したいユーザーを選択して割り当てます。
割り当てが完了すると、以下の画像のようにユーザー名が表示されます。
これで、SageMaker Studio起動準備ができましたので、起動していきます。
Amazon SageMaker コンソールからでも、アイデンティティセンターを使用したURLからでもどちらでも起動可能です。
SageMaker Studioが起動すれば以下画像のように表示されます。
次項では、Data Wranglerを使用して、タイタニック号の乗客データを前処理していきます。
データの前処理
※前処理を行うCSVファイルは、事前にAmazon S3(以降、S3)にアップロードしておきます。
データの前処理は、生のデータをモデルに入力できる形式に変換するためのプロセスを指します。
ですので、タイタニック号の乗客データをモデルに入力できる形式に変換していきます。
データには乗客の基本情報(例: 名前、性別、年齢、客室クラス)や、家族構成を表す情報(例: 同乗している兄弟や配偶者の数)などが含まれています。
モデル作成に向けた前処理では、予測に必要な特徴量の抽出や、欠損値の補完、不必要な列の削除、カテゴリデータのエンコードといった作業を実施します。
この段階でデータを適切に整形することで、モデルの精度向上を図ります。
では、SageMaker Studioの機能の一つである「Data Wrangler」を使用してデータの前処理を実行していきます。
Data Wranglerを使用するには、SageMaker Studioのメニューから「Data」セクションの「Data Wrangler」を選択して、
画面上の「Run in Canvas」をクリックして起動します。
SageMaker Canvasを起動すると、以下の画面のように「Open in Canvas」と表示されます。
また、「Running instances」セクションで、SageMaker Canvasのインスタンスが起動中であることを確認できます。
SageMaker Canvasをオープンすると、以下の画像のような画面が表示されます。
メニューから「Data Wrangler」を選択し、画面上部にある「Import and prepare」ボタンをクリックして、
リストから「Tabular CSV or Parquet files」を選択します。ここで、事前にS3に保存したデータをインポートします。
「Select a data source」では「Amazon S3」を選択します。
次に、タイタニック号の乗客データを格納するために事前に作成したバケット「test-sagemaker-jumpstar」を選び、データが保存されているフォルダパスを順に指定して次にへ進みます。
インポートしたデータに間違いなければ、設定はデフォルトのままで画面下部にある「Import」をクリックしてデータをインポートします。
以下の画像は、データが正常にインポートされた状態を示しています。
「Source」ノードにはインポートしたデータ(例:titanic.csv)が表示されており、次に「Data types」ノードでデータ型の確認や変更を行うことができます。
この状態から、さらにデータの前処理や分析を進めていきます。
まず、赤枠で囲まれた「Add transform」をクリックします。
これにより、データに対して変換処理を適用するための設定画面が開きます。
続いて、以下画像の赤枠で囲まれた「Add transform」をクリックします。
さらに、「Encode categorical」をクリックします。
これにより、カテゴリカルデータを数値またはベクトル形式に変換する設定を行うことができます。
「Sex」列に対してワンホットエンコーディングを実施します。
これは、カテゴリカルデータを数値データに変換し、機械学習モデルで処理可能な形式にするための一般的な前処理手法です。
ワンホットエンコーディングを適用することで、以下の2つの新しい列を作成しました。
Sex_male: 男性の場合に「1」、それ以外の場合に「0」
Sex_female: 女性の場合に「1」、それ以外の場合に「0」
これにより、元の「Sex」列を数値データに分割・変換しました。
ワンホットエンコーディングの結果として新しい列が作成されたため、元の「Sex」列は不要となり削除されます。
CatBoostはカテゴリカルデータを直接処理する能力を持つアルゴリズムですが、モデルのファインチューニングや他の前処理ステップと連携する際、データ形式の整合性を保つためにワンホットエンコーディングを行います。
次のステップとして、モデル作成に不要なカラムを削除する前処理を行います。
そのため、再度「Add transform」をクリックし、赤枠で示された「Manage columns」を選択します。
今回のデータで具体的には、乗客ID(PassengerId)や名前(Name)、乗船した港(Embarked)、乗船料金(Fare)など、
モデルの学習や予測に直接関与しないカラムを削除することが該当します。
これにより、モデルの性能と効率を最大化することを目指します。
次のステップは「Age」列の欠損値を補完するために、右側メニューの赤枠で囲まれた「Handle missing」をクリックします。
この「Handle missing」の設定では、以下の処理を行っています。
Transform: 欠損値の補完(Impute)を選択しています。これは欠損しているデータを埋める操作です。
Column type: 数値列(Numeric)として設定しています。補完対象の列が数値データであることを指定しています。
Input columns: Age 列を対象にしています。欠損値が含まれている「Age」列に対して補完処理を行います。
Imputing strategy: 中央値に基づく補完(Approximate Median)を選択しています。
欠損値を補完する際に、その列のデータの中央値を使用します。中央値は外れ値の影響を受けにくいため、平均値よりも堅牢性があります。
次に、Age列を正規化するために、右側メニュー赤枠で囲まれた「Process numeric」 を選択します。
以下の「Process numeric」の設定では、具体的に以下の処理を実行しています。
Transform: Scale valuesを選択しています。これは数値データのスケールを変換する操作を実行しています。
Scaler: Min-max scalerを選択しています。これは指定した列の値を最小値0、最大値1の範囲に正規化します。これにより、データの範囲が均一になり、モデルの学習効率が向上します。
Input columns: Age列が対象です。これらの列の値を正規化します。
Advanced Settings:
Min: 0(正規化後の最小値)
Max: 1(正規化後の最大値)
入力データのスケールを統一することで、学習アルゴリズムが各特徴量を同じ重要度で扱えるようにします。
スケールが揃っていない場合、大きな値を持つ特徴量が他の特徴量よりも重要視される可能性があります。
Min-max正規化を行うことで、モデルが収束する速度を向上させ、計算の安定性が向上します。
先ほどのワンホットエンコーディングの結果、性別の情報が男性(Sex_male)と女性(Sex_female)の2つの列に分けられています。
しかし、一方の列があればもう一方の情報を推測できるため、データの冗長性を減らす目的で「Manage columns」を選択し、男性(Sex_male)の列を削除します。
さらに、「Manage columns」を使用して、残った女性(Sex_female)の列名をわかりやすくするために「Sex」に変更します。
これで前処理ステップの作成がすべて完了しました。
Data flow図からも、errorsはなく「Validation cpmplete」と表示されています。
では、最後に前処理したデータをS3にエクスポートしていきます。
S3に前処理済みデータをエクスポートするため、右側のメニューから赤枠で示された「Export data to Amazon S3」をクリックします。
データをエクスポートするS3を選択して「Export」をクリックします。
エクスポートが成功すると、画面下部に赤枠で示された通知が表示されます。
この通知には「Dataset exported successfully(データセットのエクスポートが成功しました)」と記載され、
S3の保存先を確認するための「Copy S3 location」ボタンも表示されます。
S3にも保存されていることも確認できます。
以下画像が前処理が処理した完了した、タイタニック号の乗客データになります(S3にエクスポートしてダウンロードしたファイル)
次項では、CatBoostモデルのファインチューニングを行っていきます。
CatBoostモデルのファインチューニング
タイタニック号の乗客データを前処理し、モデルに入力できる形式へと変換しました。
このデータを使用し、SageMaker JumpStartが提供するビルトインアルゴリズムを利用してファインチューニングを進めます。
まず、データを分割します。通常は、トレーニングデータ、検証データ、テストデータに分割しますが、今回はトレーニングデータと推論用データに分割して進めます。
データの分割には「JupyterLab」を使用します。以下の画像には、起動中のJupyterLabインスタンスが1つ表示されていますので、これを活用します。
コードの詳細は省略しますが、前処理済みデータをS3からダウンロードし、8:2の割合でデータを分割しました。
その後、分割したデータを再度S3にアップロードし、正常にアップロードされていることを確認します。
データの分割が完了したため、次にSageMaker JumpStartが提供するビルトインアルゴリズムを利用してファインチューニングを進めます。
まず、メニューから「JumpStart」を選択し、検索窓に「boost」と入力して検索します。表示された結果の中から「CatBoost Classification」を選択します。
以下画像に進みますので、画面上右上の「Train」をクリックしてファインチューニングを進めていきますが、
その前にやるべきことがあります。下のスクロールするとトレーニング データをどのようにフォーマットするかについての手順についての記載がありますので確認します。
※Google翻訳を利用しているため、一部日本語に違和感がある場合がありますがご了承ください。
以下画像には、ファインチューニングするための必須ポイントが記載されています。
注意するポイントを抜粋します。
1. データフォーマット
・ターゲット変数の配置: ターゲット変数はCSVの最初の列に配置します。
⇒ 今回のケースでは、生存率を予測するため、ターゲット変数としてSurvived列を使用し、
1列目に配置します(元々1列目に配置されていますが、この形式を維持します)
・ヘッダーレコードの削除: CSVファイルにはヘッダー行を含めない必要があります。
⇒ CSVファイルの1行目に含まれていたSurvived, Pclass, Ageといったヘッダー行を削除します。
2. ディレクトリ構成
categorical_index.json(任意): カテゴリ特徴の列インデックスを示すJSONファイルを格納。
⇒ 今回のケースでは、Sex列、SibSp列、Parch列をカテゴリ特徴として指定します。これに対応するJSONファイルを以下の形式で作成します。
{
"categorical_columns": [4, 5]
}
※カテゴリ特徴とは
数値として扱う連続値(年齢、収入など)とは異なり、カテゴリごとにグループ化される性質を持つもの。
例: 性別(Male, Female)、客室クラス(1st, 2nd, 3rd)など。
上記の点に注意して、CSVファイルを修正し、トレーニングデータと同じディレクトリに「categorical_index.json」を作成しました。
列は0からなので、CSVファイルの左端が0になります。
{
"categorical_columns": [1, 3, 4, 5]
}
これで、ようやくファインチューニングが行う事ができます。では改めて「Train」をクリックしてファインチューニングを進めます。
Modelは、事前に作成したものなどはありませんので「Default model artifact location」を選択します。
Dataは、CSVファイルとcategorical_index.jsonを配置したディレクトリ「s3://test-sagemaker-jumpstart/jumpstart-test/train/」を指定します。
Hyperparametersは、特に設定を変更することなくデフォルトのままにします。
続いて、Training Instanceは、データ量が多くありませんので「ml.m5.xlarge」を設定します。
Output artifact locationは、「s3://test-sagemaker-jumpstart/artifact /」に保存することにします(ファインチューニングされたモデルが格納されるところです)
残りの設定はデフォルトのまま、画面右下の「Submit」をクリックしてファインチューニングを行います。
ファインチューニングが成功すれば、以下画像のように「Completed」と表示されます。
これで、SageMaker JumpStartエンドポイントとしてデプロイすることができます。
次項では、推論するためのエンドポイントをデプロイしてしていきます。
エンドポイントのデプロイ
SageMaker JumpStartエンドポイントをデプロイします。画面上右上の「Deploy」をクリックします。
こちらの画面は特に変更する箇所がありませんので画面上右下の「Deploy」をクリックします。
デプロイを実行して暫くすれば、Statusが「In service」となりますので、このように表示されればデプロイは成功です。
最後にタイタニック号の乗客の新規データを使用して推論を実行してみたいと思います。
新規データを用いた推論
推論を実行する前に、データ分割時に作成した推論用データを一部修正します。
今回のタイタニック号の生存率予測では、データ内に含まれているSurvived列を削除します。 この列は予測対象であり、モデルが結果を予測するための入力データには含めません。
以下の画像は、修正後の推論用データを示しています。このデータをモデルに読み込ませ、推論を進めていきます。
エンドポイントへの接続には、データを分割した際にも使用した「JupyterLab」を使用します。
JupyterLabで以下のコードを実行します(#でコメント入れている箇所だけ変更すれば他でも使用できます)
import json
import boto3
import numpy as np
import pandas as pd
# S3からテストデータをダウンロード
s3 = boto3.client("s3")
data_bucket = "test-sagemaker-jumpstart" # S3バケット名
test_data_key = "jumpstart-test/test_data.csv" # S3内のファイルパス
local_test_file = "test_data.csv"
# CSVファイルをローカルにダウンロード
s3.download_file(data_bucket, test_data_key, local_test_file)
# テストデータの読み込み(特徴量のみのCSV)
test_data = pd.read_csv(local_test_file)
# SageMakerエンドポイント設定
endpoint_name = "jumpstart-dft-cat-classification-mo-20250127-172834" # エンドポイント名
content_type = "text/csv"
# エンドポイントへのリクエスト関数
def query_endpoint(encoded_data):
client = boto3.client("runtime.sagemaker")
response = client.invoke_endpoint(
EndpointName=endpoint_name,
ContentType=content_type,
Body=encoded_data
)
return response
# レスポンスを解析する関数
def parse_response(query_response):
predictions = json.loads(query_response["Body"].read())
return np.array(predictions["probabilities"])
# バッチサイズを設定して推論
batch_size = 1500
predictions = []
for i in range(0, len(test_data), batch_size):
batch_data = test_data.iloc[i:i+batch_size].to_csv(header=False, index=False).encode("utf-8")
response = query_endpoint(batch_data)
batch_predictions = parse_response(response)
predictions.append(batch_predictions)
# 結果を結合して予測ラベルを取得
predictions = np.concatenate(predictions, axis=0)
predicted_labels = np.argmax(predictions, axis=1)
# 推論結果を表示
print("Predicted Labels:")
print(predicted_labels)
推論された結果は以下の画像となります。
これが削除する前のSurvived列のデータとなります。
推論データと実際の結果が完全に一致しているわけではありませんが、大部分が正確であることを確認できました。
この精度は期待を上回るものであり、モデルの性能に非常に驚かされました。
以上、Amazon SageMaker JumpStartのビルトインアルゴリズムを使用して、タイタニック号の生存率予測を実装してみた結果でした。
まとめ
今回、Amazon SageMakerを初めて使用しました。
資格取得のために勉強して得た知識だけでは、実際に活用するにはまだ分からないことが多いと改めて実践の重要性を感じました。
今回のように、SageMakerを実際に触りながら学ぶことで、資格取得時には理解が浅かった部分を具体的に知ることができ、より深い学びにつながると感じました。
特に、実務に関連したシナリオで手を動かすことが、自分のスキルを確実なものにするための近道だと思います。
これからもアウトプットを継続し、スキルをさらに磨いていきたいと思います。
では、また別の記事を執筆しますので、引き続きよろしくお願いいたします。
ありがとうございました。
クラウドインテグレーション部
クラウドソリューション2課
川井 康敬
アジアクエスト株式会社では一緒に働いていただける方を募集しています。
興味のある方は以下のURLを御覧ください。