
SageMakerノートブックスで決定木(XGBoost)をやってみた
実践!
1.環境をセットアップ
・S3バケット作成
・SageMaker用IAMロール作成
※作成したS3バケットへの読み取り権限を付与
面倒であればフルアクセスをどうぞ
・SageMakerノートブックを起動
2.変数準備
import boto3
import sagemaker
bucket = "sagemaker-1234567890000"
prefix = "train"
region = boto3.Session().region_name
role = sagemaker.get_execution_role()

3.データ準備
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
iris = load_iris()
data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
data['label'] = iris.target
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
train_data = pd.concat([train_data['label'], train_data.drop(columns=['label'])], axis=1)
test_data = pd.concat([test_data['label'], test_data.drop(columns=['label'])], axis=1)
train_data.to_csv("train.csv", index=False, header=False)
test_data.to_csv("test.csv", index=False, header=False)

4.S3へアップロード
s3 = boto3.client("s3")
s3.upload_file("train.csv", bucket, f"{prefix}/train.csv")
s3.upload_file("test.csv", bucket, f"{prefix}/test.csv")
print(f"トレーニングデータのアップロード先: s3://{bucket}/{prefix}/train.csv")
print(f"テストデータのアップロード先: s3://{bucket}/{prefix}/test.csv")

5.XGBoostトレーニングジョブ実行
from sagemaker.inputs import TrainingInput
train_input = TrainingInput(s3_data=f"s3://{bucket}/{prefix}/train.csv", content_type="csv")
test_input = TrainingInput(s3_data=f"s3://{bucket}/{prefix}/test.csv", content_type="csv")
from sagemaker.estimator import Estimator
container = sagemaker.image_uris.retrieve("xgboost", region, "1.5-1")
xgboost_estimator = Estimator(
image_uri=container,
role=role,
instance_count=1,
instance_type="ml.m5.xlarge",
output_path=f"s3://{bucket}/output",
hyperparameters={
"max_depth": 5,
"eta": 0.2,
"objective": "multi:softprob",
"num_class": 3,
"num_round": 50,
},
)
xgboost_estimator.fit({"train": train_input, "validation": test_input})


6.モデルデプロイ
predictor = xgboost_estimator.deploy(
initial_instance_count=1,
instance_type="ml.m5.large"
)

7.推論実行
sample_data = test_data.iloc[0, 1:].tolist()
sample_data_csv = ",".join(map(str, sample_data))
response = predictor.predict(
sample_data_csv,
initial_args={"ContentType": "text/csv"}
)
print("推論結果:", response)

8.クリーンアップ
predictor.delete_endpoint()

感想
腹減った・・・