目次

AWS Certified Machine Learning - Specialty (MLS-C01) 【廃止済み】

書籍レベル完全学習ガイド

⚠️ この資格は 2026年3月31日 をもって廃止されました。 後継資格: AWS Certified Machine Learning Engineer - Associate (MLA-C01) / AWS Certified AI Practitioner (AIF-C01)


試験概要

項目 詳細
試験コード MLS-C01
レベル Specialty
試験状況 ⚠️ 廃止済み(Last day to test: 2026年3月31日)
試験時間 180分
問題数 65問(採点対象)+ 15問(採点外)
合格スコア 750/1000
受験料 $300 USD
前提推奨 AWS経験2年以上 + ML実務経験1年以上

ドメイン別出題割合

┌─────────────────────────────────────────────────────────────────┐
│  ドメイン1: データエンジニアリング           20%  ████████         │
│  ドメイン2: 探索的データ分析                 24%  ████████████     │
│  ドメイン3: モデリング                       36%  ██████████████████│
│  ドメイン4: ML実装・運用                     20%  ████████         │
└─────────────────────────────────────────────────────────────────┘

ドメイン1: データエンジニアリング(20%)

1.1 データ収集・取り込み

AWSデータソース一覧

サービス データ型 特徴
S3 構造化/非構造化 MLの標準ストレージ
RDS / Aurora 構造化 トランザクションデータ
DynamoDB NoSQL リアルタイムフィーチャーストア
Kinesis Data Streams ストリーミング リアルタイムML推論
Redshift 構造化 バッチML学習
EMR + Spark 大規模 分散前処理
Glue ETL データカタログ+変換

データ取り込みパターン

バッチ取り込み:
S3 → Glue ETL → S3 (Parquet) → SageMaker Training

ストリーミング取り込み:
IoT/App → Kinesis Streams → Lambda/KDA → S3/Feature Store

データレイク構成:
         Raw Layer              Processed Layer      Feature Layer
  S3/raw/yyyy/mm/dd/ → Glue → S3/processed/       → Feature Store
                              (Parquet/ORC)

1.2 データ変換・前処理

AWS Glue DataBrew

# Glue DataBrew: ノーコードデータ準備
# レシピ例(JSON形式)
{
  "steps": [
    {
      "action": {
        "operation": "REMOVE_MISSING",
        "parameters": {
          "sourceColumn": "age",
          "threshold": "0.2"  # 欠損率20%超で列削除
        }
      }
    },
    {
      "action": {
        "operation": "NORMALIZE",
        "parameters": {
          "sourceColumn": "salary",
          "normalizationType": "Z_SCORE"
        }
      }
    }
  ]
}

SageMaker Processing Job

import boto3
from sagemaker.processing import ScriptProcessor, ProcessingInput, ProcessingOutput

processor = ScriptProcessor(
    image_uri='683313688378.dkr.ecr.us-east-1.amazonaws.com/sagemaker-scikit-learn:0.23-1-cpu-py3',
    command=['python3'],
    instance_type='ml.m5.xlarge',
    instance_count=1,
    role=role
)

processor.run(
    code='preprocessing.py',
    inputs=[
        ProcessingInput(
            source='s3://my-bucket/raw-data/',
            destination='/opt/ml/processing/input'
        )
    ],
    outputs=[
        ProcessingOutput(
            output_name='train',
            source='/opt/ml/processing/output/train',
            destination='s3://my-bucket/processed/train/'
        ),
        ProcessingOutput(
            output_name='test',
            source='/opt/ml/processing/output/test',
            destination='s3://my-bucket/processed/test/'
        )
    ]
)
# preprocessing.py の内容
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import os

# データ読み込み
input_dir = '/opt/ml/processing/input'
df = pd.read_csv(os.path.join(input_dir, 'data.csv'))

# 欠損値処理
df['age'].fillna(df['age'].median(), inplace=True)
df['income'].fillna(df['income'].mean(), inplace=True)
df.dropna(subset=['target'], inplace=True)

# カテゴリ変数エンコーディング
df = pd.get_dummies(df, columns=['category', 'region'])

# 数値変数正規化
scaler = StandardScaler()
numeric_cols = ['age', 'income', 'tenure']
df[numeric_cols] = scaler.fit_transform(df[numeric_cols])

# 外れ値除去(IQR法)
for col in numeric_cols:
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    df = df[(df[col] >= Q1 - 1.5*IQR) & (df[col] <= Q3 + 1.5*IQR)]

# 学習/テスト分割
train, test = train_test_split(df, test_size=0.2, random_state=42, stratify=df['target'])

# 出力
os.makedirs('/opt/ml/processing/output/train', exist_ok=True)
os.makedirs('/opt/ml/processing/output/test', exist_ok=True)
train.to_csv('/opt/ml/processing/output/train/train.csv', index=False)
test.to_csv('/opt/ml/processing/output/test/test.csv', index=False)

1.3 データストレージ設計

SageMaker Feature Store

import sagemaker
from sagemaker.feature_store.feature_group import FeatureGroup
from sagemaker.feature_store.feature_definition import FeatureDefinition, FeatureTypeEnum

# Feature Group定義
feature_definitions = [
    FeatureDefinition(feature_name='customer_id', feature_type=FeatureTypeEnum.STRING),
    FeatureDefinition(feature_name='age', feature_type=FeatureTypeEnum.FRACTIONAL),
    FeatureDefinition(feature_name='purchase_count_7d', feature_type=FeatureTypeEnum.INTEGRAL),
    FeatureDefinition(feature_name='avg_order_value', feature_type=FeatureTypeEnum.FRACTIONAL),
    FeatureDefinition(feature_name='event_time', feature_type=FeatureTypeEnum.FRACTIONAL),
]

feature_group = FeatureGroup(
    name='customer-features',
    feature_definitions=feature_definitions,
    sagemaker_session=sagemaker.Session()
)

# Feature Group作成(Online + Offline両方)
feature_group.create(
    s3_uri='s3://my-bucket/feature-store/',
    record_identifier_name='customer_id',
    event_time_feature_name='event_time',
    role_arn=role,
    enable_online_store=True  # リアルタイム推論用
)

# フィーチャー取得(Online Store)
record = feature_group.get_record(
    record_identifier_value_as_string='customer_123'
)

# バッチ取得(Offline Store from S3)
# Athenaクエリで実行

Feature Store アーキテクチャ

                    ┌─────────────────────────────────┐
                    │        Feature Store             │
                    │                                  │
  アプリケーション ──→│  Online Store (DynamoDB)        │──→ リアルタイム推論
                    │  低レイテンシ (<10ms)              │
                    │                                  │
  バッチETL ────────→│  Offline Store (S3 + Glue)      │──→ モデル学習
                    │  大容量・低コスト                  │
                    └─────────────────────────────────┘

ドメイン2: 探索的データ分析(24%)

2.1 データ分析手法

記述統計

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('data.csv')

# 基本統計量
print(df.describe())
print(df.info())
print(df.isnull().sum() / len(df) * 100)  # 欠損率(%)

# 分布確認
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
for i, col in enumerate(numeric_cols):
    axes[i//3, i%3].hist(df[col], bins=50)
    axes[i//3, i%3].set_title(col)
plt.tight_layout()

相関分析

# 相関行列
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm')

# ターゲット変数との相関
target_corr = df.corr()['target'].sort_values(ascending=False)
print(target_corr)

# 多重共線性チェック(VIF)
from statsmodels.stats.outliers_influence import variance_inflation_factor

vif_data = pd.DataFrame()
vif_data["feature"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(len(X.columns))]
# VIF > 10 は多重共線性の問題あり

2.2 特徴量エンジニアリング

エンコーディング手法比較

手法 適用ケース AWS実装
One-Hot Encoding カテゴリ数少(<15) pandas get_dummies
Label Encoding 順序あり sklearn LabelEncoder
Target Encoding 高カーディナリティ カテゴリ毎の目的変数平均
Embedding テキスト/高次元 SageMaker BlazingText
Binary Encoding 中程度カーディナリティ category_encoders
# Target Encoding(カテゴリ数が多い場合)
def target_encode(train_df, test_df, col, target):
    """K-Fold Target Encoding with smoothing"""
    from sklearn.model_selection import KFold
    
    # Smoothing parameter
    smoothing = 1.0
    global_mean = train_df[target].mean()
    
    # Training data: K-Fold encoding
    kf = KFold(n_splits=5, shuffle=True, random_state=42)
    train_encoded = np.zeros(len(train_df))
    
    for train_idx, val_idx in kf.split(train_df):
        fold_stats = train_df.iloc[train_idx].groupby(col)[target].agg(['mean', 'count'])
        fold_stats['smoothed'] = (fold_stats['mean'] * fold_stats['count'] + 
                                   global_mean * smoothing) / (fold_stats['count'] + smoothing)
        train_encoded[val_idx] = train_df.iloc[val_idx][col].map(fold_stats['smoothed']).fillna(global_mean)
    
    train_df[f'{col}_encoded'] = train_encoded
    
    # Test data: full training stats
    full_stats = train_df.groupby(col)[target].agg(['mean', 'count'])
    full_stats['smoothed'] = (full_stats['mean'] * full_stats['count'] + 
                               global_mean * smoothing) / (full_stats['count'] + smoothing)
    test_df[f'{col}_encoded'] = test_df[col].map(full_stats['smoothed']).fillna(global_mean)
    
    return train_df, test_df

時系列特徴量

# 時系列データの特徴量生成
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['customer_id', 'date'])

# ラグ特徴量
df['sales_lag1'] = df.groupby('customer_id')['sales'].shift(1)
df['sales_lag7'] = df.groupby('customer_id')['sales'].shift(7)

# ローリング統計
df['sales_rolling_mean7'] = df.groupby('customer_id')['sales'].transform(
    lambda x: x.rolling(window=7, min_periods=1).mean()
)
df['sales_rolling_std7'] = df.groupby('customer_id')['sales'].transform(
    lambda x: x.rolling(window=7, min_periods=1).std()
)

# 時間的特徴
df['hour'] = df['date'].dt.hour
df['day_of_week'] = df['date'].dt.dayofweek
df['is_weekend'] = (df['day_of_week'] >= 5).astype(int)
df['month'] = df['date'].dt.month
df['quarter'] = df['date'].dt.quarter

2.3 次元削減・特徴量選択

# PCA(主成分分析)
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

pca = PCA(n_components=0.95)  # 分散の95%を保持
X_pca = pca.fit_transform(X_scaled)
print(f"元の次元数: {X.shape[1]} → PCA後: {X_pca.shape[1]}")
print(f"各主成分の寄与率: {pca.explained_variance_ratio_}")

# 特徴量重要度による選択(Random Forest)
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel

rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# 重要度の低い特徴量を削除
selector = SelectFromModel(rf, prefit=True, threshold='1.25*mean')
X_selected = selector.transform(X_train)

# SHAP値による特徴量重要度(解釈可能性も同時取得)
import shap
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values[1], X_test, plot_type="bar")

2.4 クラス不均衡への対処

# クラス不均衡確認
print(df['target'].value_counts(normalize=True))

# 対処法1: SMOTE (Synthetic Minority Oversampling)
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

# 対処法2: クラスウェイト調整
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(class_weight='balanced')

# 対処法3: 評価指標の変更
from sklearn.metrics import f1_score, roc_auc_score, average_precision_score
# Accuracy NG → F1-score, AUC-ROC, PR-AUC を使用

# 対処法4: アンダーサンプリング
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)

ドメイン3: モデリング(36%)

3.1 SageMaker Built-in アルゴリズム

アルゴリズム選択ガイド

問題タイプ アルゴリズム データ要件 特徴
2値分類 XGBoost 表形式 高性能・解釈可能
多値分類 Linear Learner 大規模表形式 高速・線形
回帰 XGBoost / Linear Learner 表形式 汎用
時系列予測 DeepAR 時系列 多変量・確率的
異常検知 Random Cut Forest 時系列/数値 非教師あり
テキスト分類 BlazingText テキスト Word2Vec/classification
推薦 Factorization Machines ユーザー-アイテム行列 スパースデータ
クラスタリング K-Means 数値 非教師あり
次元削減 PCA 数値 高次元→低次元
画像分類 Image Classification 画像 CNN転移学習
物体検出 Object Detection 画像 SSD/YOLO
NLP Seq2Seq / BlazingText テキスト 翻訳・要約
強化学習 SageMaker RL 環境シミュレータ 行動最適化
近傍探索 KNN ベクトル 分類・回帰

3.2 XGBoostによる学習

import sagemaker
from sagemaker.estimator import Estimator
from sagemaker.inputs import TrainingInput

# XGBoost Container取得
container = sagemaker.image_uris.retrieve(
    framework='xgboost',
    region='ap-northeast-1',
    version='1.5-1'
)

# Estimator設定
xgb_estimator = Estimator(
    image_uri=container,
    role=role,
    instance_count=1,
    instance_type='ml.m5.2xlarge',
    volume_size=30,
    output_path='s3://my-bucket/models/',
    sagemaker_session=sagemaker.Session()
)

# ハイパーパラメータ設定
xgb_estimator.set_hyperparameters(
    objective='binary:logistic',
    num_round=300,
    max_depth=6,
    eta=0.1,                    # learning rate
    min_child_weight=5,         # 過学習防止
    subsample=0.8,              # 行サンプリング
    colsample_bytree=0.8,       # 列サンプリング
    eval_metric='auc',
    early_stopping_rounds=10,
    scale_pos_weight=9          # 不均衡データ(1:9の場合)
)

# データチャンネル設定
train_input = TrainingInput(
    s3_data='s3://my-bucket/processed/train/',
    content_type='text/csv'
)
validation_input = TrainingInput(
    s3_data='s3://my-bucket/processed/validation/',
    content_type='text/csv'
)

# 学習実行
xgb_estimator.fit({
    'train': train_input,
    'validation': validation_input
})

3.3 ハイパーパラメータ最適化(HPO)

from sagemaker.tuner import HyperparameterTuner, IntegerParameter, ContinuousParameter, CategoricalParameter

# パラメータ探索空間定義
hyperparameter_ranges = {
    'max_depth': IntegerParameter(3, 10),
    'eta': ContinuousParameter(0.01, 0.3),
    'min_child_weight': IntegerParameter(1, 10),
    'subsample': ContinuousParameter(0.5, 1.0),
    'colsample_bytree': ContinuousParameter(0.5, 1.0),
    'num_round': IntegerParameter(100, 500)
}

# HPOジョブ設定
tuner = HyperparameterTuner(
    estimator=xgb_estimator,
    objective_metric_name='validation:auc',
    objective_type='Maximize',
    hyperparameter_ranges=hyperparameter_ranges,
    max_jobs=20,
    max_parallel_jobs=5,
    strategy='Bayesian'  # Bayesian / Random / Hyperband
)

# HPO実行
tuner.fit({
    'train': train_input,
    'validation': validation_input
})

# 最良のジョブ取得
best_training_job = tuner.best_training_job()
print(f"Best job: {best_training_job}")

HPO戦略比較

戦略 特徴 使用ケース
Bayesian 過去の試行から学習・効率的 試行回数に制限あり
Random 独立した試行・並列化容易 広い探索空間
Hyperband 早期打ち切り・高速 計算コスト削減
Grid Search 全組み合わせ パラメータ少・精度重視

3.4 モデル評価指標

分類問題

from sklearn.metrics import (
    accuracy_score, precision_score, recall_score, f1_score,
    roc_auc_score, average_precision_score, confusion_matrix,
    classification_report
)

# 混同行列
cm = confusion_matrix(y_true, y_pred)
#              予測0  予測1
# 実際0  [TN=850  FP=50 ]
# 実際1  [FN=30   TP=70 ]

# 指標計算
accuracy = (TN + TP) / (TN + FP + FN + TP)    # 正解率
precision = TP / (TP + FP)                      # 適合率(FPを減らしたい)
recall = TP / (TP + FN)                         # 再現率(FNを減らしたい)
f1 = 2 * precision * recall / (precision + recall)

# ユースケース別重要指標
# がん診断: Recall最大化(FNを最小化)
# スパム検出: Precision最大化(FPを最小化)
# 不均衡データ: F1-score or AUC-PR
# 一般分類: ROC-AUC

# ROC-AUC(クラス確率が必要)
y_prob = model.predict_proba(X_test)[:, 1]
auc = roc_auc_score(y_true, y_prob)

# PR-AUC(不均衡データで優れる)
pr_auc = average_precision_score(y_true, y_prob)

回帰問題

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np

y_pred = model.predict(X_test)

mae = mean_absolute_error(y_true, y_pred)        # 外れ値に頑健
mse = mean_squared_error(y_true, y_pred)         # 大きな誤差にペナルティ
rmse = np.sqrt(mse)                              # MSEと同じ単位
r2 = r2_score(y_true, y_pred)                   # 決定係数(1.0が最良)
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100  # 相対誤差(%)

# SageMakerのビルトイン評価指標名
# regression: rmse, mae, mse
# binary: binary:logistic → validation:auc
# multi: multi:softmax → validation:merror

3.5 過学習・アンダーフィッティング対策

  • 学習誤差 検証誤差 判断
  • 過学習 低い 高い → 正則化・データ増量・モデル複雑度↓
  • 適切 低い 低い → 合格
  • アンダー 高い 高い → モデル複雑度↑・特徴量追加
# 正則化手法
# L1正則化(Lasso): 特徴量選択効果あり
# L2正則化(Ridge): 全特徴量を小さく
# ElasticNet: L1+L2の組み合わせ
# XGBoostの正則化パラメータ
xgb_params = {
    'alpha': 0.1,     # L1正則化
    'lambda': 1.0,    # L2正則化
    'gamma': 0.5,     # 葉ノード分割の最小損失改善量
}

# Dropout(ニューラルネットワーク)
import torch.nn as nn
class MLPWithDropout(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(128, 64)
        self.dropout = nn.Dropout(p=0.5)
        self.fc2 = nn.Linear(64, 1)
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.dropout(x)  # 学習時のみ有効
        return torch.sigmoid(self.fc2(x))

3.6 カスタムモデル学習(Bring Your Own Container)

# SageMaker Script Mode(最も一般的)
from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    entry_point='train.py',
    source_dir='./src',
    role=role,
    instance_count=1,
    instance_type='ml.p3.2xlarge',
    framework_version='2.0',
    py_version='py310',
    hyperparameters={
        'epochs': 50,
        'batch-size': 64,
        'learning-rate': 0.001
    }
)
# train.py: SageMaker Script Mode用学習スクリプト
import argparse
import os
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset

def model_fn(model_dir):
    """モデルロード(推論時に呼ばれる)"""
    model = Net()
    model.load_state_dict(torch.load(os.path.join(model_dir, 'model.pth')))
    return model

def input_fn(request_body, content_type):
    """入力変換(推論時)"""
    import json
    data = json.loads(request_body)
    return torch.tensor(data['instances'], dtype=torch.float32)

def predict_fn(input_data, model):
    """推論実行"""
    model.eval()
    with torch.no_grad():
        return model(input_data)

def output_fn(prediction, accept):
    """出力変換"""
    import json
    return json.dumps({'predictions': prediction.tolist()})

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--epochs', type=int, default=10)
    parser.add_argument('--batch-size', type=int, default=32)
    parser.add_argument('--learning-rate', type=float, default=0.001)
    # SageMaker環境変数
    parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
    parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAIN'])
    args = parser.parse_args()
    
    # 学習処理
    # ... モデル定義・学習ループ ...
    
    # モデル保存(必須)
    torch.save(model.state_dict(), os.path.join(args.model_dir, 'model.pth'))

3.7 分散学習

# SageMaker Data Parallelism (SMDDP)
from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    entry_point='train_distributed.py',
    role=role,
    instance_count=4,           # 複数インスタンス
    instance_type='ml.p3.16xlarge',
    distribution={
        'smdistributed': {
            'dataparallel': {
                'enabled': True
            }
        }
    }
)

# train_distributed.py でのSMDDP使用
import smdistributed.dataparallel.torch.distributed as dist
import smdistributed.dataparallel.torch.torch_smddp

dist.init_process_group(backend='smddp')
model = DistributedDataParallel(model, broadcast_buffers=False)

# SageMaker Model Parallelism (大規模モデル向け)
distribution={
    'smdistributed': {
        'modelparallel': {
            'enabled': True,
            'parameters': {
                'partitions': 4,        # モデル分割数
                'microbatches': 2,      # マイクロバッチ数
                'pipeline': 'interleaved'
            }
        }
    }
}

3.8 SageMaker JumpStart

# JumpStart: 事前学習済みモデルのFine-tuning
from sagemaker.jumpstart.estimator import JumpStartEstimator

# Hugging Face BERT Fine-tuning
estimator = JumpStartEstimator(
    model_id='huggingface-tc-bert-base-uncased',  # テキスト分類
    model_version='*',
    role=role,
    instance_type='ml.p3.2xlarge',
    hyperparameters={
        'epochs': 3,
        'batch_size': 16,
        'learning_rate': 2e-5,
    }
)

estimator.fit({'training': 's3://my-bucket/training-data/'})
predictor = estimator.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.xlarge'
)

ドメイン4: ML実装・運用(20%)

4.1 モデルデプロイメント

エンドポイント種類

タイプ 特徴 使用ケース
Real-time Endpoint 低レイテンシ・常時稼働 同期推論
Serverless Endpoint 自動スケール・アイドル時無課金 断続的トラフィック
Async Endpoint 非同期・大ペイロード対応 大きな入力・処理時間長
Batch Transform バッチ推論・S3S3 一括スコアリング
# Real-time Endpointデプロイ
predictor = xgb_estimator.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.xlarge',
    endpoint_name='xgboost-classifier-v1'
)

# Serverless Endpointデプロイ
from sagemaker.serverless import ServerlessInferenceConfig

serverless_config = ServerlessInferenceConfig(
    memory_size_in_mb=2048,
    max_concurrency=20
)
predictor = model.deploy(
    serverless_inference_config=serverless_config
)

# Async Endpointデプロイ
from sagemaker.async_inference import AsyncInferenceConfig

async_config = AsyncInferenceConfig(
    output_path='s3://my-bucket/async-output/',
    notification_config={
        'SuccessTopic': 'arn:aws:sns:us-east-1:123456789:success-topic',
        'ErrorTopic': 'arn:aws:sns:us-east-1:123456789:error-topic'
    }
)
predictor = model.deploy(
    instance_type='ml.m5.xlarge',
    async_inference_config=async_config
)

# Batch Transform
transformer = xgb_estimator.transformer(
    instance_count=1,
    instance_type='ml.m5.xlarge',
    output_path='s3://my-bucket/batch-output/'
)
transformer.transform(
    data='s3://my-bucket/batch-input/',
    content_type='text/csv',
    split_type='Line'
)

Multi-Model Endpoint(コスト最適化)

# 複数モデルを1エンドポイントで提供
from sagemaker.multidatamodel import MultiDataModel

mme = MultiDataModel(
    name='multi-model-endpoint',
    model_data_prefix='s3://my-bucket/models/',
    model=model,  # ベースモデルのコンテナ
    sagemaker_session=sagemaker.Session()
)

predictor = mme.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.xlarge'
)

# 特定モデルで推論
response = predictor.predict(
    data=test_data,
    target_model='model-customer-segment-a.tar.gz'  # 動的ロード
)

4.2 A/B テスト・カナリアデプロイ

# Production Variant を使った A/B テスト
import boto3

sm_client = boto3.client('sagemaker')

# エンドポイント設定でProduction Variantを定義
sm_client.create_endpoint_config(
    EndpointConfigName='ab-test-config',
    ProductionVariants=[
        {
            'VariantName': 'ModelV1',
            'ModelName': 'xgboost-model-v1',
            'InstanceType': 'ml.m5.xlarge',
            'InitialInstanceCount': 1,
            'InitialVariantWeight': 80  # 80%のトラフィック
        },
        {
            'VariantName': 'ModelV2',
            'ModelName': 'xgboost-model-v2',
            'InstanceType': 'ml.m5.xlarge',
            'InitialInstanceCount': 1,
            'InitialVariantWeight': 20  # 20%のトラフィック
        }
    ]
)

# トラフィック比率の更新(カナリア段階的移行)
sm_client.update_endpoint_weights_and_capacities(
    EndpointName='my-endpoint',
    DesiredWeightsAndCapacities=[
        {'VariantName': 'ModelV1', 'DesiredWeight': 0},
        {'VariantName': 'ModelV2', 'DesiredWeight': 100}
    ]
)

4.3 SageMaker Model Monitor

# データドリフト・モデル品質監視
from sagemaker.model_monitor import DataCaptureConfig, DefaultModelMonitor
from sagemaker.model_monitor.dataset_format import DatasetFormat

# データキャプチャ設定
data_capture_config = DataCaptureConfig(
    enable_capture=True,
    sampling_percentage=100,  # 100%キャプチャ
    destination_s3_uri='s3://my-bucket/monitoring/captured-data/',
    capture_options=['Input', 'Output']
)

# エンドポイントにデータキャプチャを適用
predictor = model.deploy(
    instance_type='ml.m5.xlarge',
    data_capture_config=data_capture_config
)

# Model Monitor設定
my_monitor = DefaultModelMonitor(
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    volume_size_in_gb=20,
    max_runtime_in_seconds=3600
)

# ベースライン作成(学習データから統計量生成)
my_monitor.suggest_baseline(
    baseline_dataset='s3://my-bucket/training-data/baseline.csv',
    dataset_format=DatasetFormat.csv(header=True),
    output_s3_uri='s3://my-bucket/monitoring/baseline/'
)

# 監視スケジュール作成
from sagemaker.model_monitor import CronExpressionGenerator

my_monitor.create_monitoring_schedule(
    monitor_schedule_name='my-model-monitor',
    endpoint_input=predictor.endpoint_name,
    output_s3_uri='s3://my-bucket/monitoring/results/',
    statistics='s3://my-bucket/monitoring/baseline/statistics.json',
    constraints='s3://my-bucket/monitoring/baseline/constraints.json',
    schedule_cron_expression=CronExpressionGenerator.hourly()
)

モニタリング種類

タイプ 検出内容 モニタークラス
Data Quality 入力データの統計的ドリフト DefaultModelMonitor
Model Quality 精度・AUCの低下 ModelQualityMonitor
Model Bias 公平性・バイアス ClarifyModelMonitor
Feature Attribution SHAP値の変化 ClarifyModelMonitor

4.4 SageMaker Pipelines(MLOps)

import sagemaker
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.steps import ProcessingStep, TrainingStep, CreateModelStep
from sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo
from sagemaker.workflow.condition_step import ConditionStep
from sagemaker.workflow.functions import JsonGet
from sagemaker.workflow.parameters import ParameterFloat, ParameterString

# パイプラインパラメータ
processing_instance_type = ParameterString(
    name='ProcessingInstanceType',
    default_value='ml.m5.xlarge'
)
auc_threshold = ParameterFloat(
    name='AUCThreshold',
    default_value=0.8
)

# Step 1: データ前処理
step_process = ProcessingStep(
    name='DataPreprocessing',
    processor=processor,
    inputs=[...],
    outputs=[...],
    code='preprocessing.py'
)

# Step 2: モデル学習
step_train = TrainingStep(
    name='ModelTraining',
    estimator=xgb_estimator,
    inputs={
        'train': TrainingInput(
            s3_data=step_process.properties.ProcessingOutputConfig.Outputs['train'].S3Output.S3Uri,
            content_type='text/csv'
        )
    }
)

# Step 3: モデル評価
step_evaluate = ProcessingStep(
    name='ModelEvaluation',
    processor=evaluation_processor,
    inputs=[
        ProcessingInput(
            source=step_train.properties.ModelArtifacts.S3ModelArtifacts,
            destination='/opt/ml/processing/model'
        )
    ],
    outputs=[ProcessingOutput(output_name='evaluation', source='/opt/ml/processing/evaluation')],
    code='evaluate.py',
    property_files=[
        PropertyFile(name='EvaluationReport', output_name='evaluation', path='evaluation.json')
    ]
)

# Step 4: 条件分岐(AUC閾値チェック)
condition_gte = ConditionGreaterThanOrEqualTo(
    left=JsonGet(
        step_name=step_evaluate.name,
        property_file='EvaluationReport',
        json_path='binary_classification_metrics.auc.value'
    ),
    right=auc_threshold
)

step_cond = ConditionStep(
    name='CheckAUCCondition',
    conditions=[condition_gte],
    if_steps=[step_register],   # 合格時: モデル登録
    else_steps=[]               # 不合格時: 何もしない
)

# パイプライン定義
pipeline = Pipeline(
    name='MLTrainingPipeline',
    parameters=[processing_instance_type, auc_threshold],
    steps=[step_process, step_train, step_evaluate, step_cond]
)

pipeline.upsert(role_arn=role)
pipeline.start()

4.5 SageMaker Clarify(公平性・説明可能性)

from sagemaker import clarify

# SHAP値計算設定
shap_config = clarify.SHAPConfig(
    baseline=[test_data[0].tolist()],  # SHAP baseline
    num_samples=100,
    agg_method='mean_abs',
    save_local_shap_values=True
)

# 公平性チェック設定
bias_config = clarify.BiasConfig(
    label_values_or_threshold=[1],    # 有利なラベル
    facet_name='gender',              # 保護属性
    facet_values_or_threshold=['Female'],  # 不利なグループ
    group_name='age_group'
)

model_config = clarify.ModelConfig(
    model_name='my-model',
    instance_type='ml.m5.xlarge',
    instance_count=1
)

# Clarify処理実行
clarify_processor = clarify.SageMakerClarifyProcessor(
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    sagemaker_session=sagemaker.Session()
)

clarify_processor.run_explainability(
    data_config=data_config,
    model_config=model_config,
    explainability_config=shap_config,
    output_path='s3://my-bucket/clarify-output/'
)

4.6 SageMaker Model Registry

from sagemaker.model import Model
from sagemaker.workflow.model_step import ModelStep

# Model Package Group作成
sm_client.create_model_package_group(
    ModelPackageGroupName='my-model-group',
    ModelPackageGroupDescription='Production models'
)

# モデルを Model Registry に登録
model_metrics = ModelMetrics(
    model_statistics=MetricsSource(
        s3_uri='s3://my-bucket/metrics/statistics.json',
        content_type='application/json'
    )
)

model_package = model.register(
    model_package_group_name='my-model-group',
    inference_instances=['ml.m5.xlarge'],
    transform_instances=['ml.m5.xlarge'],
    content_types=['text/csv'],
    response_types=['text/csv'],
    approval_status='PendingManualApproval',  # 手動承認必要
    model_metrics=model_metrics
)

# 承認(CI/CDでの自動承認も可)
sm_client.update_model_package(
    ModelPackageArn=model_package.model_package_arn,
    ModelApprovalStatus='Approved'
)

4.7 コスト最適化

# Spot Instanceで学習コスト削減(最大90%削減)
xgb_estimator = Estimator(
    ...
    use_spot_instances=True,
    max_run=3600,          # 最大学習時間(秒)
    max_wait=7200,         # Spot待機を含む最大時間
    checkpoint_s3_uri='s3://my-bucket/checkpoints/'  # チェックポイント必須
)

# 推論コスト最適化
# Serverless: 断続的トラフィック
# Multi-Model Endpoint: 多数モデルを1エンドポイント
# Graviton (ml.c6g.*): CPU推論で20%コスト削減
# Inf1 (Inferentia): 深層学習推論コスト最適化
インスタンスファミリー 特徴 推奨ユースケース
ml.p3.* V100 GPU 深層学習学習
ml.p4d.* A100 GPU 大規模モデル学習
ml.g5.* A10G GPU 推論・中規模学習
ml.inf1.* Inferentia DL推論・低コスト
ml.inf2.* Inferentia2 最新DL推論
ml.c5.* 最適化CPU 従来ML推論
ml.m5.* 汎用 前処理・汎用推論

試験頻出サービス詳解

Amazon Rekognition

import boto3

rekognition = boto3.client('rekognition', region_name='us-east-1')

# 画像内オブジェクト検出
response = rekognition.detect_labels(
    Image={'S3Object': {'Bucket': 'my-bucket', 'Name': 'image.jpg'}},
    MaxLabels=10,
    MinConfidence=80
)

# 顔認識
response = rekognition.detect_faces(
    Image={'S3Object': {'Bucket': 'my-bucket', 'Name': 'faces.jpg'}},
    Attributes=['ALL']  # 年齢推定・感情・マスク着用など
)

# カスタムモデル(Rekognition Custom Labels)
project_arn = rekognition.create_project(ProjectName='defect-detection')['ProjectArn']

Amazon Comprehend

comprehend = boto3.client('comprehend')

# 感情分析
response = comprehend.detect_sentiment(
    Text="このサービスは素晴らしい!",
    LanguageCode='ja'
)
# 結果: POSITIVE / NEGATIVE / NEUTRAL / MIXED

# エンティティ抽出
response = comprehend.detect_entities(
    Text="Amazon Web Services社は2006年にAWS S3をリリースした",
    LanguageCode='ja'
)

# カスタム分類モデル
response = comprehend.create_document_classifier(
    DocumentClassifierName='support-ticket-classifier',
    DataAccessRoleArn=role_arn,
    InputDataConfig={'S3Uri': 's3://my-bucket/training-data/'},
    OutputDataConfig={'S3Uri': 's3://my-bucket/output/'},
    LanguageCode='ja'
)

Amazon Forecast

forecast = boto3.client('forecast')

# Dataset Group作成
forecast.create_dataset_group(
    DatasetGroupName='retail-sales',
    Domain='RETAIL'
)

# データセット作成(TARGET_TIME_SERIES必須)
forecast.create_dataset(
    DatasetName='sales-data',
    DataFrequency='D',  # 日次
    Domain='RETAIL',
    DatasetType='TARGET_TIME_SERIES',
    Schema={
        'Attributes': [
            {'AttributeName': 'item_id', 'AttributeType': 'string'},
            {'AttributeName': 'timestamp', 'AttributeType': 'timestamp'},
            {'AttributeName': 'demand', 'AttributeType': 'float'}
        ]
    }
)

# Predictor作成
forecast.create_predictor(
    PredictorName='retail-predictor',
    ForecastHorizon=30,     # 30日先まで予測
    PerformAutoML=True,     # アルゴリズム自動選択
    InputDataConfig={'DatasetGroupArn': dataset_group_arn},
    FeaturizationConfig={'ForecastFrequency': 'D'}
)

Amazon Textract

textract = boto3.client('textract')

# 非同期でのPDF/画像からテキスト抽出
response = textract.start_document_analysis(
    DocumentLocation={'S3Object': {'Bucket': 'my-bucket', 'Name': 'invoice.pdf'}},
    FeatureTypes=['TABLES', 'FORMS'],  # テーブル・フォーム検出
    NotificationChannel={
        'SNSTopicArn': 'arn:aws:sns:us-east-1:123:textract-topic',
        'RoleArn': role_arn
    }
)

job_id = response['JobId']
# SNS通知後に結果取得
result = textract.get_document_analysis(JobId=job_id)

試験対策:よく出るアーキテクチャパターン

パターン1: リアルタイムML推論パイプライン

User Request → [API Gateway](/services/api-gateway/) → [Lambda](/services/lambda/) → [SageMaker](/services/sagemaker-ai/) Endpoint
                                    ↓
                             Feature Store (Online)
                             (リアルタイム特徴量取得)
                                    ↓
                             Model → Response → [Lambda](/services/lambda/) → API GW

パターン2: バッチML学習・デプロイパイプライン

[S3](/services/s3/) (Raw Data)
    ↓
[EventBridge](/services/eventbridge/) (日次スケジュール)
    ↓
[SageMaker](/services/sagemaker-ai/) Pipelines
    ├── Processing Job (前処理)
    ├── Training Job (XGBoost学習)
    ├── Evaluation Job (AUC確認)
    └── Condition: AUC>0.8?
         ├── YES → Model Registry (承認待ち)
         │          → SNS通知 → 人間承認
         │          → Endpoint更新
         └── NO  → SNS通知 (アラート)

パターン3: マルチモーダルMLシステム

  • 画像 → Rekognition → ラベル/属性
  • テキスト → Comprehend → 感情/エンティティ → 統合Lambda → SageMaker Endpoint
  • 構造化データ → Feature Store → 数値特徴量 (特徴量結合) → 予測結果

試験重要数値チートシート

項目
SageMaker Processing 最大実行時間 24時間
SageMaker Training 最大実行時間 5日
Spot Instance 最大コスト削減 90%
SageMaker Endpoint 最大モデル数 (MME) 制限なし(ディスク容量次第)
Feature Store Online レイテンシ 一桁ミリ秒
SageMaker Model Monitor 最小実行間隔 1時間
HPO 最大並列ジョブ数 10
Rekognition MinConfidence デフォルト 55%
Comprehend 最大テキスト長 5,000バイト (同期)
SageMaker Serverless 最大メモリ 6GB
Async Endpoint 最大ペイロード 1GB

12週間学習プラン

Week 1-2: ML基礎

  • [ ] 機械学習の基本概念(教師あり/なし/強化学習)
  • [ ] 統計学基礎(確率分布・検定・相関)
  • [ ] Python + scikit-learn でのML実装
  • [ ] Jupyter Notebook/SageMaker Studio Labs

Week 3-4: データエンジニアリング

Week 5-6: SageMaker コア

  • [ ] Built-in アルゴリズム全種類
  • [ ] Script Mode(PyTorch/TensorFlow/scikit-learn)
  • [ ] ハイパーパラメータ最適化(HPO)
  • [ ] Training・Processing Job ハンズオン

Week 7-8: モデル評価・選択

  • [ ] 評価指標(分類・回帰・ランキング)
  • [ ] Cross-validation・正則化
  • [ ] Bias/Variance トレードオフ
  • [ ] SageMaker Clarify ハンズオン

Week 9-10: MLOps

  • [ ] SageMaker Pipelines フルパイプライン
  • [ ] Model Registry・承認フロー
  • [ ] Model Monitor(Data Quality・Model Quality)
  • [ ] A/Bテスト・カナリアデプロイ

Week 11: AI Services

Week 12: 試験対策

  • [ ] AWS公式模擬試験(全問解説)
  • [ ] Whizlabs/Udemy模擬試験 × 3回
  • [ ] 苦手ドメイン集中復習
  • [ ] 重要サービスのAWS公式ドキュメント精読

頻出問題パターンと解法

Q1: ハイパーパラメータ最適化戦略

問題: 試行回数が限られている(20回以下)場合、最も効率的なHPO戦略は?

解答: Bayesian最適化。過去の試行結果を学習して次のパラメータを決定するため、Random Searchより少ない試行で良い結果に到達する。Hyperband は早期打ち切りで高速だが、リソース管理が複雑。

Q2: クラス不均衡データ処理

問題: 詐欺検出モデルで正常:詐欺 = 99:1 の不均衡データ。最適な対処法は?

解答:

  1. scale_pos_weight=99 (XGBoost) でクラスウェイト調整
  2. 評価指標を Accuracy→AUC-PR(平均適合率) に変更
  3. SMOTEによるオーバーサンプリング
  4. 決して Accuracy だけで評価しない

Q3: SageMaker エンドポイント選択

問題: 1日数回しか使用されない低頻度モデルのコスト最適化。

解答: Serverless Inference Endpoint。アイドル時は課金なし。コールドスタートレイテンシが許容できれば最適。リアルタイムエンドポイントは常時課金。

Q4: モデルドリフト検出

問題: 本番モデルの精度が徐々に低下している。根本原因特定の手順は?

解答:

  1. Model Monitor の Data Quality で入力データ分布の変化を確認
  2. Model Quality Monitor で予測精度の低下トレンドを確認
  3. Feature Attribution Monitor で SHAP値変化を確認
  4. 原因に応じて再学習 or 特徴量エンジニアリング修正

Q5: 分散学習の選択

問題: パラメータ数が100億を超える大規模Transformerモデルの学習。どの分散戦略?

解答: SageMaker Model Parallelism (SMP)。1GPU に収まらないモデルはModel Parallelism必須。Data Parallelism はモデルが1GPUに収まる前提。両方組み合わせ可能(Hybrid Parallelism)。


アーキテクチャ図

SageMaker MLOps パイプライン

flowchart TB
    subgraph DataPrep["データ準備"]
        S3Raw["[S3](/services/s3/)\n(生データ)"]
        FeatureStore["[SageMaker](/services/sagemaker-ai/)\nFeature Store"]
        Processing["Processing Job\n前処理・特徴量生成"]
    end

    subgraph Pipeline["[SageMaker](/services/sagemaker-ai/) Pipelines"]
        P1["Step 1\nProcessing\n(前処理)"]
        P2["Step 2\nTraining\n(XGBoost学習)"]
        P3["Step 3\nEvaluation\n(AUC計算)"]
        P4{"Step 4\nCondition\nAUC>0.8?"}
        P5["Step 5\nModel Registry\n登録"]
    end

    subgraph Deploy["デプロイ・監視"]
        Registry["Model Registry\n(承認待ち)"]
        Approval["手動承認\n(MLエンジニア)"]
        Endpoint["Real-time Endpoint\nor Serverless"]
        Monitor["Model Monitor\n・Data Quality\n・Model Quality"]
    end

    S3Raw --> Processing --> FeatureStore
    FeatureStore --> P1 --> P2 --> P3 --> P4
    P4 -->|"Yes"| P5
    P4 -->|"No"| Fail(["🚫 パイプライン停止\nSNS通知"])
    P5 --> Registry --> Approval --> Endpoint
    Endpoint --> Monitor
    Monitor -->|"ドリフト検出"| P1

モデル評価指標の選択ガイド

flowchart TD
    Start(["問題タイプ判定"]) --> Q1{"教師あり学習?"}
    Q1 -->|"Yes"| Q2{"出力タイプ"}
    Q1 -->|"No"| Unsup["クラスタリング:\nSilhouette Score\nDB Index"]
    Q2 -->|"分類"| Q3{"クラス均衡?"}
    Q2 -->|"回帰"| Reg["回帰指標:\nRMSE/MAE/R²\nMAPE"]
    Q3 -->|"均衡"| BalClass["Accuracy\nF1-Score\nROC-AUC"]
    Q3 -->|"不均衡\n(1:99等)"| ImbalClass["PR-AUC\n(優先)\nF1-Score\nRecall/Precision"]
    Q3 -->|"コスト非対称\n(FNが高コスト)"| FNPriority["Recall最大化\n例: がん検診"]
    Q3 -->|"コスト非対称\n(FPが高コスト)"| FPPriority["Precision最大化\n例: スパム検出"]

本試験形式 模擬問題(詳細解説付き)


問題 1

詐欺検出モデルを構築しています。データセットは正常取引:詐欺取引 = 99.5:0.5 の極めて不均衡なクラス分布です。モデルの評価に使用すべき指標として最も適切なものはどれですか?

  • A. Accuracy(正解率)
  • B. ROC-AUC
  • C. Precision-Recall AUC(PR-AUC)
  • D. RMSE(二乗平均平方根誤差)
正解と解説

正解: C

解説:

  • C(PR-AUC)が正解: 極端な不均衡データでは Accuracy は意味をなしません。全て正常と予測すれば Accuracy は 99.5% になりますが、詐欺を1件も検出できていません。

各指標の問題:

  • A(Accuracy): 99.5%という高い値でも詐欺を全く検出できない「精度のパラドックス」が発生します。
  • B(ROC-AUC): 不均衡データでも使えますが、PR-AUCの方が陽性クラス(少数クラス)の性能をより適切に評価します。ROC-AUCは大量の真陰性に影響されます。
  • D(RMSE): 回帰問題の指標。分類には使いません。

PR-AUC が適切な理由:

Precision-Recall カーブは:
- X軸: Recall(詐欺をどれだけ検出できたか)
- Y軸: Precision(詐欺と判定したもののうち本当に詐欺の割合)

不均衡データでは True Negatives(正常)が多すぎてROC-AUCを歪めます。
PR-AUCは陽性クラスのみに焦点を当てるため、少数クラスの性能評価に優れています。

問題 2

SageMaker でモデルを学習させています。学習誤差(Training Error)は低いが、検証誤差(Validation Error)が高い状態が続いています。この状況を改善するための最も適切な対処法はどれですか(複数選択)?

  • A. 学習データを増やす
  • B. より複雑なモデル(深いニューラルネットワーク)を使う
  • C. 正則化(L1/L2)を強くする
  • D. ドロップアウト率を増やす(ニューラルネットワークの場合)
  • E. バッチサイズを増やす
正解と解説

正解: A、C、D

解説: 「学習誤差が低く、検証誤差が高い」= 過学習(Overfitting) の典型症状です。

過学習の対処法:

  • A(データ増量): 学習データが多いほど、モデルが汎化しやすくなります。最も根本的な解決策。
  • C(正則化強化): L1(Lasso)・L2(Ridge)正則化はパラメータの大きさにペナルティを与え、過学習を防ぎます。
  • D(Dropout率増加): Dropout はランダムにニューロンを無効化することで、過剰な特徴依存を防ぎます。

不正解の理由:

  • B(より複雑なモデル): 過学習をさらに悪化させます(モデルの複雑度↓が正解)
  • E(バッチサイズ増加): 学習の安定性に影響しますが、過学習の直接対策ではありません。

過学習 vs アンダーフィッティングの対策:

問題 症状 対策
過学習 訓練低・検証高 データ増量・正則化・Dropout・特徴量削減
アンダーフィット 訓練高・検証高 モデル複雑化・特徴量追加・学習率調整

問題 3

本番環境のSageMakerエンドポイントで、入力データの分布が学習データと大きく乖離していることが疑われます(データドリフト)。これを自動的に検出・アラートするために使用するサービスはどれですか?

正解と解説

正解: B

解説:

  • B(Model Monitor)が正解: SageMaker Model Monitor は、本番エンドポイントへの入力データ(推論リクエスト)の統計的特性を継続的にモニタリングします。学習時のベースライン統計(平均・標準偏差・分布等)と比較し、ドリフトを自動検出・アラートします。

Model Monitor のモニタリング種類(試験頻出):

種類 検出内容
Data Quality 入力特徴量の統計ドリフト
Model Quality 予測精度の低下(ラベル必要)
Model Bias バイアス・公平性の変化
Feature Attribution SHAP値の変化
  • A(Debugger): 学習中のテンソル値・勾配・ボトルネックを分析するツール。本番推論の監視ではありません。
  • C(Clarify): 公平性・バイアス分析・SHAP値計算。ドリフト検出の一部は Model Monitor の Bias/Feature Attribution モニターが担当。
  • D(CloudWatch): カスタムメトリクスを自分で作ることは可能ですが、Model Monitor の方が専用機能として優れています。

問題 4

SageMaker エンドポイントに対して1日に数回しかリクエストが来ない場合、コストを最小化するための最適なデプロイ方法はどれですか?

  • A. ml.t2.medium インスタンスの常時稼働エンドポイント
  • B. Serverless Inference エンドポイント
  • C. Batch Transform
  • D. ml.inf1 インスタンスの常時稼働エンドポイント
正解と解説

正解: B

解説:

  • B(Serverless Inference)が正解: アイドル時(リクエストがない間)は課金が発生しません。リクエスト数 × 処理時間でのみ課金。月に数回しかリクエストがない場合、コストはほぼゼロです。

Serverless Inference の特徴:

  • アイドル時の課金なし

  • コールドスタート(数秒)が発生する可能性あり

  • メモリ設定: 1GB〜6GB(CPU比例)

  • 最大同時実行数: 200

  • A(ml.t2.medium 常時稼働): 稼働時間に応じて課金。月$30〜40程度かかります。

  • C(Batch Transform): バッチ推論(S3S3)。インタラクティブなAPIレスポンスが必要な場合には使えません。

  • D(ml.inf1): 高速・低コストな推論向けだが、常時稼働のため低頻度アクセスには不向き。

エンドポイント種類の選択基準(試験頻出):

種類 適用ケース コスト
Real-time 常時低レイテンシ必要 時間課金
Serverless 低頻度・断続的 リクエスト課金
Async 大ペイロード・長処理 時間課金
Batch Transform 一括スコアリング 処理時間課金

問題 5

機械学習プロジェクトで、データサイエンティストが SageMaker Hyperparameter Tuning(HPO)を使って最適なパラメータを探索しています。試行回数は 50 回に制限されており、できるだけ効率的に最適値に到達したい場合、最適な戦略はどれですか?

  • A. Grid Search(全組み合わせを試す)
  • B. Random Search(ランダムにサンプリング)
  • C. Bayesian Optimization(ベイズ最適化)
  • D. Hyperband
正解と解説

正解: C

解説:

  • C(Bayesian Optimization)が正解: 過去の試行結果から代理モデル(Gaussian Process 等)を構築し、次に試す価値が高いパラメータを推論します。少ない試行回数で最適解に近づけます。

各戦略の比較:

戦略 仕組み 試行効率 並列性
Grid Search 全組み合わせ 低(指数爆発)
Random Search ランダム
Bayesian 過去学習→次点予測 低(順次依存)
Hyperband 早期打ち切り+バジェット配分 高(計算効率)
  • A(Grid Search): 次元数が増えると組み合わせが指数的に増加。50回では網羅できません。
  • B(Random Search): シンプルだが、過去の結果を活かさないため非効率。
  • D(Hyperband): 各試行を途中で打ち切ってリソースを節約する手法。多数のエポックが必要なDL向け。50試行の制約では Bayesian の方が効率的。

問題 6

100 億パラメータを持つ大規模なTransformerモデルを SageMaker で学習させようとしています。単一の ml.p3.16xlarge インスタンス(1GPU 16GB)では GPU メモリが不足します。解決策として最も適切なものはどれですか?

  • A. バッチサイズを小さくする
  • B. SageMaker Data Parallel Library(SMDDP)でデータ並列学習を行う
  • C. SageMaker Model Parallel Library(SMP)でモデル分割学習を行う
  • D. 混合精度(FP16)学習を使用する
正解と解説

正解: C

解説:

  • C(モデル並列: SMP)が正解: 「100億パラメータが1GPUに収まらない」= モデル自体をGPUメモリに格納できない問題です。SageMaker Model Parallel Library でモデルを複数のGPUに分割(Partition)して学習させます。
# SMP 設定例
distribution={
    'smdistributed': {
        'modelparallel': {
            'enabled': True,
            'parameters': {
                'partitions': 4,          # 4つのGPUにモデルを分割
                'microbatches': 2,        # マイクロバッチで効率化
                'pipeline': 'interleaved' # インターリーブドパイプライン
            }
        }
    }
}
  • A(バッチサイズ削減): バッチサイズを小さくすると1回の学習に必要なアクティベーションメモリは削減されますが、モデルパラメータ自体(100億×4バイト=40GB)はGPUに格納する必要があり、解決になりません。
  • B(データ並列: SMDDP): データをバッチ分割して各GPUで同じモデルを処理。各GPUにモデル全体が収まる前提です。100億パラメータは1GPU(16GB)に収まりません。
  • D(混合精度 FP16): FP32→FP16でメモリを約半分に削減。100億パラメータ×2バイト=20GB。16GBのGPUにはまだ収まりません。

モデル並列 vs データ並列:

種類 前提 使用ケース
データ並列 モデルが1GPUに収まる バッチ処理高速化
モデル並列 モデルが1GPUに収まらない 大規模モデル学習

SageMaker 高度機能

SageMaker Feature Store

Feature Store はMLフィーチャーの一元管理・再利用を提供します。

Feature Store 構造:
  Feature Group(特徴量グループ)
    ├── Online Store (DynamoDB): リアルタイム推論用(低レイテンシ)
    └── Offline Store (S3 + Glue): バッチ学習用(大量データ)

ユースケース:
  学習時: Offline Store から大量フィーチャーを取得
  推論時: Online Store からリアルタイムにフィーチャーを取得
  
特徴:
  - フィーチャーの時点整合性(Time-Travel)
  - チーム間でのフィーチャー再利用
  - フィーチャーのバージョン管理

Feature Store の設定例:

import boto3
from sagemaker.feature_store.feature_group import FeatureGroup

feature_group = FeatureGroup(
    name='customer-features',
    sagemaker_session=sagemaker_session
)

feature_group.create(
    s3_uri=f's3://{bucket}/feature-store/',
    record_identifier_name='customer_id',
    event_time_feature_name='event_time',
    role_arn=role,
    enable_online_store=True  # オンラインストアも有効
)

SageMaker Clarify(公平性・説明可能性)

Clarify はモデルの公平性(Fairness)と説明可能性(Explainability)を分析します。

バイアス検出:
  学習前バイアス: データセットのバイアスを測定
    - Class Imbalance (CI): クラス分布の偏り
    - Difference in Proportions of Labels (DPL): ラベル比率の差
  
  学習後バイアス: モデル予測のバイアスを測定
    - Disparate Impact (DI): グループ間の予測差

説明可能性(SHAP値):
  各特徴量がモデルの予測にどれだけ貢献しているか
  SHAP (SHapley Additive exPlanations) アルゴリズムで計算
  
  例: 住宅価格予測モデル
  予測値: $450,000 (基準値: $350,000 から +$100,000)
    ├── 部屋数: +$60,000 (貢献大)
    ├── 築年数: -$20,000 (マイナス寄与)
    ├── 立地:  +$50,000 (貢献大)
    └── 面積:  +$10,000 (貢献小)

SageMaker Debugger

学習中のモデルの問題をリアルタイムで検出します。

検出できる問題:
  - 勾配消失(Vanishing Gradients)
  - 勾配爆発(Exploding Gradients)
  - 過学習(Overfitting)
  - データ不足(Poor Data Quality)
  - 学習率の問題

組み込みルール例:
  VanishingGradient: 勾配の絶対値が閾値以下
  ExplodingTensor: テンソル値がNaN/Infinity
  LossNotDecreasing: 損失が改善しない
  Overfit: 検証損失が増加し続ける

カスタムルール:
  S3にデバッグテンソルをエクスポートして後から分析も可能

機械学習アルゴリズム詳細

教師あり学習アルゴリズム

XGBoost(Extreme Gradient Boosting)

SageMaker の最も人気のある組み込みアルゴリズムの一つ。

動作原理:
  弱学習器(浅い決定木)を順番に学習
  前の木の誤差を補正する方向に次の木を学習
  最終予測 = 全ての木の予測の加重和

主要ハイパーパラメータ:
  num_round: ブースティングの反復回数(木の数)
  max_depth: 各木の最大深さ(深すぎると過学習)
  eta (learning_rate): 学習率(小さいほど頑健だが遅い)
  subsample: 各木に使うデータのサンプル比率
  colsample_bytree: 各木に使う特徴量の比率

過学習対策:
  max_depth を小さく
  eta を小さく
  early_stopping_rounds で早期停止
  L1/L2 正則化(alpha/lambda)

Linear Learner

回帰と分類の両方に対応する線形モデル。

特徴:
  - 確率的勾配降下法(SGD)で最適化
  - 自動的なハイパーパラメータチューニング
  - 並列学習で複数モデルを同時訓練
  - 特徴量の正規化を自動実行

ユースケース:
  回帰: 価格予測、需要予測
  二値分類: スパム検出、クリック予測
  多値分類: 文書分類
  
推奨前処理:
  - 特徴量のスケーリング(正規化/標準化)
  - カテゴリ変数のエンコーディング
  - 欠損値の処理

Neural Network(MXNet/TensorFlow/PyTorch)

SageMaker でのDLフレームワーク対応:
  TensorFlow: tf.estimator API / Keras
  PyTorch: torchvision, HuggingFace Transformers
  MXNet: Gluon API
  
分散学習:
  データ並列: SageMaker Distributed Data Parallel (SMDDP)
  モデル並列: SageMaker Model Parallel (SMP)
  
インスタンスタイプ推奨:
  GPU学習: ml.p3.2xlarge (1 GPU) → ml.p3.16xlarge (8 GPU)
  大規模GPU: ml.p4d.24xlarge (8 A100 GPU)
  CPU学習: ml.m5.xlarge 〜 ml.m5.24xlarge

教師なし学習アルゴリズム

K-Means クラスタリング

動作原理:
  1. k個のセントロイドをランダム初期化
  2. 各データポイントを最近接セントロイドに割り当て
  3. 各クラスタの平均でセントロイドを更新
  4. セントロイドが変化しなくなるまで繰り返す

k の選択:
  エルボー法: 各k値のSSE(惰性)をプロット
  シルエット分析: クラスタの凝集度と分離度を評価

SageMaker 実装:
  Web-scale k-means アルゴリズム(大規模データ対応)
  init_method: random / k-means++ / auto

PCA(主成分分析)

目的: 高次元データの次元削減

動作:
  データの分散が最大となる方向(主成分)を見つける
  PC1(第1主成分): 最大分散の方向
  PC2(第2主成分): PC1に直交する最大分散の方向

ユースケース:
  - 可視化(2D/3Dへの削減)
  - ノイズ削減
  - 特徴量エンジニアリング
  - 学習前の前処理

SageMaker の2モード:
  Regular: 小〜中規模データ(メモリに収まる)
  Randomized: 大規模データ(近似アルゴリズム)

Isolation Forest(異常検知)

SageMaker 組み込み: Random Cut Forest (RCF)

動作原理:
  正常データ: 孤立させるのに多くの分割が必要(深い木)
  異常データ: 少ない分割で孤立(浅い木)
  → 異常スコア = 平均分割回数の逆数

ユースケース:
  - 不正取引検出
  - センサーデータの異常検知
  - ネットワーク侵入検知
  - 品質管理

自然言語処理(NLP)

BlazingText

SageMaker 組み込みの高速テキストアルゴリズム

2つのモード:
  Word2Vec(教師なし): 単語の分散表現学習
    - CBOW: 周辺単語から中央単語を予測
    - Skip-gram: 中央単語から周辺単語を予測
  
  Text Classification(教師あり): FastText ベース
    - 文書分類タスク
    - 大規模データに高速スケール

特徴:
  - GPU サポートで大規模データを高速処理
  - 単語埋め込み(Word Embeddings)を出力
  - 下流タスクの特徴量として使用可能

Sequence-to-Sequence(Seq2Seq)

ユースケース:
  - 機械翻訳
  - テキスト要約
  - 質問応答

アーキテクチャ:
  Encoder(入力シーケンスを固定長ベクトルに圧縮)
    ↓
  Attention メカニズム(重要な入力部分に注目)
    ↓
  Decoder(ベクトルから出力シーケンスを生成)

SageMaker 実装:
  MXNet/Gluon ベース
  カスタム vocab ファイルが必要

コンピュータビジョン

Image Classification

SageMaker 組み込みアルゴリズム(ResNet ベース)

転移学習(Transfer Learning)モード:
  ImageNet で事前学習済みの重みを使用
  最終層のみ学習(fine-tuning)
  → 少ないデータで高精度を達成

フルトレーニングモード:
  ランダム初期化から学習
  大量のラベル付きデータが必要

ハイパーパラメータ:
  num_layers: モデルの深さ(18/34/50/101/152)
  use_pretrained_model: 転移学習の有無
  image_shape: 入力画像サイズ
  num_classes: 分類クラス数

Object Detection

SageMaker 組み込み: Single Shot Detector (SSD)

出力: バウンディングボックス + クラスラベル + 信頼スコア

評価指標:
  mAP (mean Average Precision): 全クラスの AP の平均
  IoU (Intersection over Union): 予測と正解のボックス重複率

アルゴリズム比較:
  SSD: 高速、リアルタイム向き(精度は低め)
  Faster R-CNN: 高精度、バッチ処理向き
  YOLO: 高速・高精度のバランス

MLの評価指標

分類モデルの評価

混同行列:
              予測: Positive  予測: Negative
実際: Positive    TP              FN
実際: Negative    FP              TN

基本指標:
  Accuracy  = (TP + TN) / 総数
  Precision = TP / (TP + FP)  ← 「陽性と判断したうち本当に陽性の割合」
  Recall    = TP / (TP + FN)  ← 「本当の陽性をどれだけ検出できたか」
  F1 Score  = 2 * (Precision * Recall) / (Precision + Recall)

使い分け:
  高 Precision が必要: スパムフィルター(False Positive を避けたい)
  高 Recall が必要:    がん検診(False Negative を避けたい)
  バランス:            F1 Score

ROC-AUC:

ROC曲線: TPR(Recall)vs FPR(1-Specificity)のプロット
AUC: ROC曲線の面積(0.5=ランダム、1.0=完璧)

二値分類モデルの閾値選択に使用:
  高 AUC = 様々な閾値で高性能
  閾値の選択はビジネス要件に依存

回帰モデルの評価

MAE (Mean Absolute Error):
  実際値と予測値の絶対誤差の平均
  外れ値の影響を受けにくい
  単位が元データと同じで解釈しやすい

RMSE (Root Mean Squared Error):
  誤差の二乗の平均の平方根
  外れ値の影響を受けやすい(二乗のため)
  大きな誤差をより重視したい場合に有効

R² (決定係数):
  モデルがデータの分散をどれだけ説明できるか
  1.0 = 完璧、0.0 = 平均予測と同じ、負 = 平均より悪い

データ前処理テクニック

欠損値処理

戦略の選択:
  削除: データが少ない場合は慎重に
    - 行削除: 1行のみ欠損が多い
    - 列削除: 欠損率が高い列(例: 50%以上)

  補完(Imputation):
    数値: 平均値/中央値/最頻値
    カテゴリ: 最頻値/「Unknown」カテゴリ
    時系列: 前後の値で補間(Forward Fill/Backward Fill)
    
  高度な補完:
    KNN Imputer: 近傍データから推定
    Iterative Imputer: 他の特徴量から回帰で推定
    
SageMaker での実装:
  Glue DataBrew: ノーコードで欠損値処理
  SageMaker Processing: Pandas/Scikit-learnで処理

特徴量エンジニアリング

カテゴリ変数のエンコーディング:
  One-Hot Encoding: カーディナリティが低い場合
    性別: [M, F] → [1,0], [0,1]
  
  Label Encoding: 順序がある場合(小<中<大)
  
  Target Encoding: カーディナリティが高い場合
    カテゴリ値をターゲットの平均値に置換

数値変換:
  標準化(Standardization): (x - μ) / σ → 平均0、標準偏差1
  正規化(Normalization): (x - min) / (max - min) → 0〜1
  対数変換: 右歪みデータを正規分布に近づける
  Box-Cox変換: より汎用的な正規化変換

特徴量選択:
  Filter法: 相関係数/カイ二乗検定
  Wrapper法: 再帰的特徴削減(RFE)
  Embedded法: Lasso回帰/XGBoost の feature_importance

SageMaker MLOps

SageMaker Pipelines(ML パイプライン)

パイプラインのステップ:
  ProcessingStep: データ前処理
  TrainingStep: モデル学習
  CreateModelStep: モデル作成
  TransformStep: バッチ変換
  ConditionStep: 条件分岐(例: 精度しきい値チェック)
  RegisterModel: モデルレジストリへの登録

```python
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.steps import TrainingStep, ProcessingStep
from sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo
from sagemaker.workflow.condition_step import ConditionStep

# 条件ステップ: 精度が90%以上ならモデル登録
cond_gte = ConditionGreaterThanOrEqualTo(
    left=JsonGet(step_name='evaluate', property_file='evaluation'),
    right=0.90
)

step_cond = ConditionStep(
    name='CheckAccuracy',
    conditions=[cond_gte],
    if_steps=[step_register],   # 条件True
    else_steps=[step_fail]      # 条件False
)

pipeline = Pipeline(
    name='MLPipeline',
    steps=[step_process, step_train, step_evaluate, step_cond]
)
```text

### Model Monitor

監視の種類: Data Quality Monitor: - 本番データの統計量を学習時と比較 - 欠損値/外れ値/分布変化を検出

Model Quality Monitor: - 予測精度の継続的監視 - Ground Truth ラベルと予測を比較(遅延評価)

Bias Drift Monitor: - 特定グループへの偏りの変化を検出

Feature Attribution Drift Monitor: - 特徴量の重要度の変化を検出(SHAP)

アーキテクチャ: 本番エンドポイント → データキャプチャ(S3) ↓ Baseline 統計量と比較(CloudWatch Metrics) ↓ 違反検出 → CloudWatch Alarm → SNS 通知


---

## 強化学習(Reinforcement Learning)

### 基本概念

コンポーネント: Agent(エージェント): 学習・意思決定する主体 Environment(環境): エージェントが操作する世界 State(状態): 現在の環境の状況 Action(行動): エージェントが取れる操作 Reward(報酬): 行動の結果得られるフィードバック Policy(方策): 状態→行動のマッピング

目標: 累積報酬の最大化

アルゴリズム: Q-Learning / Deep Q-Network (DQN): 離散行動空間 PPO (Proximal Policy Optimization): 連続行動空間 SAC (Soft Actor-Critic): 連続制御


### SageMaker RL + AWS RoboMaker

ユースケース:

  • ロボット制御(AWS RoboMaker)
  • 自動売買システム
  • ゲームAI
  • 資源管理の最適化

SageMaker RL の特徴:

  • Ray/RLlib フレームワーク対応
  • Coach (Intel) フレームワーク対応
  • 分散学習で多数の並列シミュレーション
  • Amazon SageMaker Studio での可視化

---

## AWS AI サービス(高レベル API)

### Rekognition(画像・動画分析)

機能:

  • 物体/シーン検出(1000種以上)
  • 顔検出・認識・感情分析
  • テキスト検出(OCR)
  • 有害コンテンツ検出
  • セレブリティ認識
  • カスタムラベル(独自カテゴリ学習)

API 例: detect_labels: 物体・シーン検出 detect_faces: 顔属性分析 compare_faces: 2枚の顔を比較 recognize_celebrities: 有名人認識


### Comprehend(自然言語処理)

機能:

  • 感情分析(Positive/Negative/Neutral/Mixed)
  • エンティティ抽出(人名/場所/組織等)
  • キーフレーズ抽出
  • 言語検出(100言語対応)
  • トピックモデリング(LDA)
  • カスタム分類/エンティティ認識

Comprehend Medical:

  • 医療テキストの専門エンティティ抽出
  • PHI(個人医療情報)の検出
  • ICD-10/RxNorm コードへのマッピング

### Forecast(時系列予測)

アルゴリズム: CNN-QR: 量子化回帰(高精度) DeepAR+: 再帰型ニューラルネット(多変量) Prophet: 季節性・休日を考慮(解釈性高) ARIMA: 古典的統計モデル ETS: 指数平滑法

特徴: AutoML: 複数アルゴリズムを自動比較 多変量時系列: 天気/イベントなどの外部変数考慮 バックテスト: 過去データで精度評価

ユースケース: 需要予測、在庫管理、エネルギー消費予測


### Personalize(レコメンデーション)

レシピ(アルゴリズム): USER_PERSONALIZATION: ユーザー個別のおすすめ RELATED_ITEMS: 類似アイテムの提案 RANKING: アイテムリストの個別ランキング

必要なデータ: Interactions(必須): ユーザー×アイテムの行動履歴 Items(オプション): アイテムのメタデータ Users(オプション): ユーザーのメタデータ

特徴: コールドスタート問題への対応(新アイテム/新ユーザー) リアルタイム更新 A/Bテスト機能


### Textract(ドキュメント分析)

OCR 超えた機能:

  • フォームのキー・バリューペア抽出
  • テーブル構造の認識
  • 署名検出
  • ID ドキュメント分析(パスポート/運転免許証)

Comprehend との組み合わせ: Textract(テキスト抽出)→ Comprehend(意味理解) → ドキュメント自動分類/処理ワークフロー


---

## 模擬試験(65問)

### 問題 1

機械学習プロジェクトで収集したデータの 40% が欠損しているカラムがあります。このカラムを処理する最適な方法はどれですか?

- A. 中央値で補完する
- B. カラムを削除する
- C. 平均値で補完する
- D. KNN Imputer を使用する

<details>
<summary>正解と解説</summary>

**正解: B**

欠損率が 40% を超える場合、そのカラムはモデルに有益な情報を提供できないケースが多く、補完によるノイズ導入リスクの方が大きいため、カラムの削除が推奨されます。一般的には欠損率 30〜40% 以上でカラム削除を検討します。

ただし、その特徴量がドメイン知識上重要であれば、「欠損している」という事実自体を別の特徴量(is_missing フラグ)として追加する方法もあります。

</details>

---

### 問題 2

不正検知モデルを構築しています。データの 99% が正常取引で、1% のみが不正です。適切なアプローチはどれですか?(2つ選択)

- A. Accuracy を主要評価指標として使用する
- B. Recall と Precision の調和平均(F1 Score)を使用する
- C. オーバーサンプリング(SMOTE)で不正クラスを増加させる
- D. クラス重みを均等に設定する
- E. SageMaker の Random Cut Forest でベースライン異常スコアを計算する

<details>
<summary>正解と解説</summary>

**正解: B, C**

クラス不均衡問題への対処:
- **B(F1 Score)**: 99% の Accuracy は「全部正常と予測」でも達成できます。不正検知では Recall(見逃しを減らす)と Precision(誤検知を減らす)のバランスが重要 → F1 Score。
- **C(SMOTE)**: 少数クラス(不正)のサンプルを合成的に増加させることで学習データのバランスを改善します。

E(RCF)も有効ですが、SMOTE と組み合わせることはしません(別アプローチ)。

</details>

---

### 問題 3

SageMaker エンドポイントで本番推論を行うコストを削減したいと考えています。トラフィックが日中に集中し、夜間はほぼゼロの場合、最もコスト効率の高い設定はどれですか?

- A. ml.t3.medium を常時起動する
- B. SageMaker Serverless Inference を使用する
- C. Auto Scaling を設定して最小インスタンス数を 1 に設定する
- D. SageMaker Asynchronous Inference を使用する

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker Serverless Inference はリクエストがない場合にコンテナをゼロスケールし、リクエスト時にのみ起動します。夜間ほぼゼロのトラフィックには最も適しています。

- C(Auto Scaling): 最小1インスタンスでも夜間の無駄なコストが発生
- D(非同期推論): リクエストとレスポンスが非同期で大規模バッチ向き。常時起動が必要
- **Serverless の制約**: コールドスタートのレイテンシが発生する(数秒)

</details>

---

### 問題 4

SageMaker でモデルを学習した後、同じデータで評価指標が非常に高い(訓練精度 98%)が、新しいデータでは低い(テスト精度 65%)です。原因として最も可能性が高いものはどれですか?

- A. アンダーフィッティング
- B. 学習率が低すぎる
- C. オーバーフィッティング
- D. バッチサイズが小さすぎる

<details>
<summary>正解と解説</summary>

**正解: C**

訓練精度が非常に高いがテスト精度が低い = **オーバーフィッティング(過学習)**の典型的な症状です。

オーバーフィッティングの対策:
- 正則化(L1/L2)
- ドロップアウト(ニューラルネット)
- 早期停止(Early Stopping)
- データ拡張(Data Augmentation)
- モデルの複雑さを下げる

</details>

---

### 問題 5

EC2 上で大規模なデータセットを使って TensorFlow モデルを学習しています。GPU の利用率が 30% 程度で、残りの時間は CPU でのデータ読み込みを待っています。この問題を解決するためのアプローチは?

- A. より大きな GPU インスタンスを使用する
- B. tf.data API でデータパイプラインを最適化し、プリフェッチとキャッシュを活用する
- C. バッチサイズを小さくする
- D. 混合精度(FP16)を使用する

<details>
<summary>正解と解説</summary>

**正解: B**

**CPU ボトルネック(データ読み込み待ち)**の問題です。GPU が30%しか使われていないのは、データ供給が追いつかないため。

tf.data の最適化:
```python
dataset = tf.data.Dataset.from_tensor_slices(data)
dataset = dataset.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
dataset = dataset.cache()      # メモリにキャッシュ
dataset = dataset = dataset.prefetch(tf.data.AUTOTUNE)  # GPU学習中に次バッチを準備
```text

SageMaker では S3 から直接データを効率読み込みする Pipe モード も有効。

</details>

---

### 問題 6

テキスト分類モデルを構築したいと思いますが、ラベル付きデータが少量(500件)しかありません。最適なアプローチはどれですか?

- A. XGBoost で TF-IDF 特徴量を使って学習する
- B. SageMaker BlazingText でフルトレーニングを行う
- C. HuggingFace の事前学習済み BERT モデルをファインチューニングする
- D. SageMaker の K-Means でクラスタリングする

<details>
<summary>正解と解説</summary>

**正解: C**

少量ラベルデータでの高精度テキスト分類:

**転移学習(Transfer Learning)**がベストアプローチ:
1. 大規模コーパスで事前学習済みの BERT(文脈理解済み)
2. 少量のタスク固有ラベルでファインチューニング
3. 500件でも高精度を達成可能

SageMaker + HuggingFace:
```python
from sagemaker.huggingface import HuggingFace

estimator = HuggingFace(
    entry_point='train.py',
    transformers_version='4.26',
    pytorch_version='1.13',
    py_version='py39',
    instance_type='ml.p3.2xlarge',
    hyperparameters={
        'model_name_or_path': 'bert-base-uncased',
        'num_train_epochs': 3
    }
)
```text

</details>

---

### 問題 7

SageMaker Model Registry にモデルを登録する主な目的は何ですか?

- A. モデルを自動的にエンドポイントにデプロイする
- B. モデルのバージョン管理、メタデータの記録、承認ワークフローを管理する
- C. モデルのパフォーマンスをリアルタイムで監視する
- D. モデルのハイパーパラメータを最適化する

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker Model Registry の機能:
- **バージョン管理**: 複数バージョンのモデルアーティファクトを管理
- **メタデータ**: 学習ジョブ、精度指標、使用データセットを記録
- **承認ワークフロー**: `Approved/Rejected/PendingManualApproval` で本番デプロイを制御
- **CI/CD 統合**: 承認されたモデルのみを自動デプロイするパイプラインのトリガー

</details>

---

### 問題 8

Amazon SageMaker Autopilot の特徴として正しいものはどれですか?

- A. コードなしでモデルを学習・デプロイできるが、内部のアルゴリズムや前処理は確認できない
- B. 自動的に前処理・アルゴリズム選択・ハイパーパラメータチューニングを行い、生成したノートブックで各ステップを確認・カスタマイズできる
- C. テキストと画像のみに対応している
- D. モデルの精度よりもレイテンシを優先してモデルを選択する

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker Autopilot の特徴:
- **透明性(Explainability)**: 生成された Jupyter Notebook で前処理・アルゴリズム・ハイパーパラメータを確認可能
- **AutoML**: データ探索 → 候補生成 → 特徴量変換 → アルゴリズム選択 → HPO を自動実行
- 対応問題: 二値分類、多値分類、回帰、時系列予測
- 最高精度モデルを自動選択してデプロイ可能

</details>

---

### 問題 9

K-Means クラスタリングで最適な k(クラスタ数)を決定するために使用する手法はどれですか?(2つ選択)

- A. エルボー法(Within-cluster Sum of Squares のプロット)
- B. シルエット分析(クラスタの凝集度と分離度の評価)
- C. ROC-AUC 曲線
- D. 混同行列
- E. 決定係数(R²)

<details>
<summary>正解と解説</summary>

**正解: A, B**

クラスタ数の決定:
- **エルボー法**: 各 k で SSE(各点とセントロイドの距離二乗和)を計算。「肘」の部分が最適 k
- **シルエットスコア**: -1〜+1 の値で、+1 に近いほど適切なクラスタリング

C, D, E は教師あり学習の評価指標で、教師なし学習(クラスタリング)には使用しません。

</details>

---

### 問題 10

SageMaker の Managed Spot Training で学習が中断された場合に自動的に再開するために必要な設定はどれですか?

- A. 自動的に再開するため特別な設定は不要
- B. チェックポイントの保存先 S3 URI を設定し、学習コードでチェックポイントから再開する実装が必要
- C. On-Demand インスタンスに切り替える
- D. SageMaker Pipelines でリトライ設定を行う

<details>
<summary>正解と解説</summary>

**正解: B**

Managed Spot Training でのチェックポイント:

```python
estimator = TensorFlow(
    ...
    use_spot_instances=True,
    max_wait=7200,
    checkpoint_s3_uri=f's3://{bucket}/checkpoints',  # チェックポイント保存先
    checkpoint_local_path='/opt/ml/checkpoints'       # コンテナ内パス
)
```text

学習コード側でも `ModelCheckpoint` コールバック等でチェックポイントを定期的に保存し、再開時に最新チェックポイントから学習を続ける実装が必要です。

</details>

---

### 問題 11〜65(ショート形式)

**問題 11**: Amazon Forecast の `AutoPredictor` 機能の特徴は?
→ **正解: 複数のアルゴリズム(CNN-QR/DeepAR+/Prophet/ARIMA/ETS)を自動選択し、アンサンブルして最高精度の予測モデルを生成する**

**問題 12**: Amazon Rekognition Custom Labels のユースケースは?
→ **正解: Rekognition のデフォルトラベル(1000種の物体/シーン)ではカバーされない、業種固有の画像分類。例: 製造ラインの不良品検出、ブランド独自のロゴ認識**

**問題 13**: データの「クラス不均衡」を対処するオーバーサンプリング手法 SMOTE の動作は?
→ **正解: 少数クラスの既存サンプル間を補間して合成サンプルを生成(ランダム複製と異なり多様なサンプルを生成できる)**

**問題 14**: SageMaker のエンドポイントに「マルチモデル(Multi-Model Endpoint)」を使用するメリットは?
→ **正解: 1つのエンドポイントに多数のモデルをホスティング。モデルごとに個別エンドポイントを起動するコストを削減。モデルはオンデマンドでロード/アンロード。**

**問題 15**: Amazon Comprehend の「トピックモデリング」で使用されるアルゴリズムは?
→ **正解: LDA(Latent Dirichlet Allocation)- 教師なし学習で文書コレクションから隠れたトピックを発見する**

**問題 16**: Ground Truth を使用してラベリングを効率化する方法は?
→ **正解: 自動ラベリング(Automated Data Labeling)- 機械学習で信頼度が高いサンプルを自動ラベリングし、信頼度が低いもののみ人間がレビュー。コストを最大70%削減可能。**

**問題 17**: SageMaker Experiments の目的は?
→ **正解: 複数の学習実験(異なるハイパーパラメータ/データセット/アルゴリズム)の結果を追跡・比較。モデルの再現性を確保し、最良の設定を特定する。**

**問題 18**: 推論時に「A/Bテスト」を行う SageMaker の機能は?
→ **正解: Production Variants(プロダクションバリアント)- 1つのエンドポイントに複数バージョンのモデルをデプロイし、トラフィックを割り当てる(例: Model A 90%、Model B 10%)**

**問題 19**: SageMaker JumpStart の主な機能は?
→ **正解: 事前学習済みモデル(BERT/GPT-2/ResNet等)とソリューション(エンドツーエンドのMLパイプライン)をワンクリックでデプロイ。ファインチューニングも可能。**

**問題 20**: 時系列データの「データリーケージ(Data Leakage)」とは何ですか?
→ **正解: 未来の情報が学習データに含まれること。例: 時系列の正しいトレイン/テスト分割をせず、未来のデータで過去を予測するモデルが誤って高精度に見えること**

**問題 21**: Kinesis Data Analytics(KDA)での機械学習推論ユースケースは?
→ **正解: ストリーミングデータ(IoTセンサー/クリックストリーム)に対してリアルタイム異常検知を実行。Random Cut Forest アルゴリズムを KDA SQL/Studio から使用可能。**

**問題 22**: NLP の「トークン化(Tokenization)」とは?
→ **正解: テキストを機械学習モデルが処理できる単位(トークン)に分割する前処理。単語/サブワード/文字レベルがある。BERTはサブワードトークナイザー(WordPiece)を使用。**

**問題 23**: SageMaker で Pandas が使えない大規模データセット(1TB以上)の前処理に適したツールは?
→ **正解: SageMaker Processing + Apache Spark(EMR の Spark または SageMaker Processing の Spark コンテナ)。分散処理で大規模データを効率的に変換。**

**問題 24**: モデルの「ドリフト(Drift)」が発生する原因は?
→ **正解: (1) データドリフト: 本番データの統計的性質が学習時から変化(例: COVID-19後の消費者行動変化)、(2) コンセプトドリフト: ターゲット変数の意味が変化(例: 「詐欺」の定義変化)**

**問題 25**: SageMaker Neo の目的は?
→ **正解: 学習済みモデルをターゲットデバイス向けにコンパイル・最適化(ML compiler)。推論速度を最大2倍高速化し、モデルサイズを削減。対応デバイス: EC2/AWS IoT Greengrass/Jetson/Raspberry Pi等**

**問題 26**: Precision-Recall トレードオフとは?
→ **正解: 分類の閾値を下げるとRecallが上がる(見逃し減少)がPrecisionが下がる(誤検知増加)。逆に閾値を上げるとPrecisionが上がるがRecallが下がる。ビジネス要件に応じて最適な閾値を選択。**

**問題 27**: データ前処理でのカテゴリ変数の「ターゲットエンコーディング」のリスクは?
→ **正解: データリーケージのリスク。ターゲット値を使ってエンコードするため、テストデータの情報が学習に混入する可能性。クロスバリデーションとの組み合わせや Out-of-fold エンコーディングで対策。**

**問題 28**: SageMaker のコンテナへのカスタムアルゴリズムの持ち込み(BYOC)の要件は?
→ **正解: Docker コンテナに (1) `/opt/ml/model/` にモデル出力、(2) `/opt/ml/input/data/` からデータ読み込み、(3) 学習コードは `train` コマンドで起動する形式に従う必要がある。**

**問題 29**: Amazon Kendra の特徴は?
→ **正解: エンタープライズ向けインテリジェント検索サービス。自然言語での質問に対してドキュメント(S3/SharePoint/Confluence等)から関連性の高い答えを返す。キーワード一致ではなく意味理解。**

**問題 30**: 深層学習の「バッチ正規化(Batch Normalization)」の効果は?
→ **正解: (1) 学習を安定化・高速化、(2) 高い学習率を使用可能、(3) Dropout への依存を減少、(4) 内部共変量シフトを削減。各ミニバッチの出力を正規化(平均0、標準偏差1)する。**

**問題 31**: AWS Glue DataBrew と SageMaker Processing の使い分けは?
→ **正解: DataBrew はノーコードのデータ準備(ビジネスアナリスト向け)、SageMaker Processing はコードによる柔軟な前処理(データサイエンティスト向け)。大規模分散処理が必要なら Processing + Spark。**

**問題 32**: RecordIO フォーマットを SageMaker の学習に使用するメリットは?
→ **正解: データを連続したバイナリストリームとして読み込み(Pipe モード対応)、S3 からシームレスにデータを流し込める。CSV より I/O 効率が高く、大規模データセットの学習時間を短縮。**

**問題 33**: Amazon Textract の Queries API の特徴は?
→ **正解: 事前に特定の質問(例: 「この請求書の金額は?」)を定義することで、ドキュメントの構造に関わらず必要な情報を抽出。フォーム解析より高精度・柔軟。**

**問題 34**: 「バイアス-バリアンストレードオフ」の説明は?
→ **正解: 高バイアス(アンダーフィット): モデルが単純すぎて学習データも当てはまらない。高バリアンス(オーバーフィット): 訓練データに過度に適合し汎化しない。最適モデルは両者のバランスを取る。**

**問題 35**: SageMaker Edge Manager の用途は?
→ **正解: エッジデバイス(IoT/組み込み機器)でのMLモデル展開・管理。モデルのデプロイ、バージョン管理、推論実行、メトリクス収集をエッジデバイスで実現。SageMaker Neo でコンパイルしたモデルを使用。**

**問題 36**: 機械学習パイプラインの「特徴量ストア(Feature Store)」を使用する主なメリットは?
→ **正解: (1) チーム間での特徴量再利用、(2) 学習・推論間の特徴量整合性(Training-Serving Skew 防止)、(3) 特徴量の時点整合性(過去の特定時点の特徴量を取得可能)**

**問題 37**: DeepAR アルゴリズムの特徴は?
→ **正解: 複数の関連する時系列を同時に学習するグローバルモデル。各系列の特性をグローバルパターンから学習し、データが少ない系列でも高精度予測が可能(コールドスタート対応)。**

**問題 38**: SageMaker Training のデータ入力モード「File モード」と「Pipe モード」の違いは?
→ **正解: File モード: S3 からコンテナのローカルディスクにデータ全てをコピーしてから学習(シンプル)。Pipe モード: データをストリーミングで読み込み(ディスクサイズ不要、大規模データ向き)。**

**問題 39**: Amazon Polly と Amazon Transcribe の違いは?
→ **正解: Polly: テキスト→音声(TTS: Text-to-Speech)。Transcribe: 音声→テキスト(STT: Speech-to-Text/自動音声認識)。名前を逆に覚えがちなので注意。**

**問題 40**: ディープラーニングの「ドロップアウト(Dropout)」の仕組みと目的は?
→ **正解: 学習中にランダムにニューロンを無効化(例: 50%)することで、モデルが特定のニューロンに依存することを防ぎ、汎化性能を向上させる正則化手法。**

**問題 41**: Amazon Augmented AI(A2I)の用途は?
→ **正解: 機械学習の予測精度が低い(信頼度が閾値以下)場合に自動的に人間によるレビューワークフローを起動。Rekognition/Textract との統合あり。Human in the Loop を実現。**

**問題 42**: SageMaker のハイパーパラメータチューニング(HPO)で「Bayesian 最適化」が「Random Search」より優れている点は?
→ **正解: Bayesian 最適化は過去の試行結果を学習し、次に試すべきハイパーパラメータを賢く選択(良い結果が出た付近を重点的に探索)。Random Search は独立にランダム探索するため非効率。**

**問題 43**: SageMaker の「Shadow Testing」機能の目的は?
→ **正解: 本番トラフィックを新モデル(シャドウバリアント)にも送信し、本番モデルの予測と比較評価。ユーザーへの影響なく新モデルをリアル環境でテスト。新モデルの本番デプロイ前の安全な評価手段。**

**問題 44**: Embedding の次元削減に使用される技術は?(2つ)
→ **正解: (1) PCA(主成分分析)- 線形変換、(2) t-SNE(t-distributed Stochastic Neighbor Embedding)- 非線形変換、可視化向き。SageMaker では PCA アルゴリズムが組み込み提供。**

**問題 45**: SageMaker Canvas の特徴は?
→ **正解: ノーコードの ML モデル構築ツール。データサイエンティスト以外のビジネスユーザーがコードなしで学習・予測を実行できる。AutoML(Autopilot)ベース。分類/回帰/時系列予測対応。**

**問題 46**: Amazon Lookout for Metrics の用途は?
→ **正解: ビジネスメトリクス(売上/ユーザー数等)の自動異常検知。何十ものメトリクスを自動分析し、関連する異常を検出。根本原因の候補も提示。人手での監視を自動化。**

**問題 47**: 「データ拡張(Data Augmentation)」が効果的なケースは?
→ **正解: 学習データが少なく過学習しやすい場合。画像:回転/反転/クロップ/色調変化。テキスト:同義語置換/バックトランスレーション。音声:タイムストレッチ/ピッチシフト。人工的にデータ多様性を増加。**

**問題 48**: 機械学習モデルの「説明可能性(Explainability)」が必要な理由は?
→ **正解: (1) 規制対応(GDPR の説明請求権、金融の与信説明義務)、(2) デバッグ(なぜ誤予測したか)、(3) バイアス検出(特定属性が不当に影響していないか)、(4) ユーザー信頼の確保**

**問題 49**: Amazon Lookout for Vision の用途は?
→ **正解: 製造業向けの画像異常検知。少量のサンプル画像から製品の欠陥・損傷・不整合を検出。事前学習なし・カスタムモデルを自動構築。カメラ画像のリアルタイム品質検査に対応。**

**問題 50**: SageMaker の `CreateEndpointConfig` で `DataCaptureConfig` を設定する目的は?
→ **正解: 本番推論の入力データと予測結果を S3 に自動保存(データキャプチャ)。Model Monitor でのドリフト検出やモデルの再学習データとして使用。**

**問題 51**: Amazon Comprehend の「カスタムエンティティ認識」のユースケースは?
→ **正解: デフォルトのエンティティタイプ(人名/場所/組織等)ではカバーされない業種固有のエンティティを検出。例: 医薬品名、部品番号、製品コード、法律条文の引用。**

**問題 52**: 「特徴量の重要度(Feature Importance)」をサポートするアルゴリズムは?
→ **正解: ツリーベースモデル(XGBoost/Random Forest)は feature_importance 属性で重要度を提供。SageMaker Clarify の SHAP 分析は任意のモデルに適用可能。**

**問題 53**: Amazon Fraud Detector の特徴は?
→ **正解: AWS 上での実際の不正検知経験から構築された ML ベースの不正検出サービス。カスタムモデルを学習(自社データ)し、リアルタイムで不正スコアを評価。オンライン詐欺/支払い詐欺対応。**

**問題 54**: SageMaker のコンテナで `SAGEMAKER_SUBMIT_DIRECTORY` 環境変数の役割は?
→ **正解: SageMaker がアップロードした学習スクリプトの S3 URI を示す環境変数。コンテナ起動時に自動設定される。学習スクリプトはこのディレクトリから読み込まれる。**

**問題 55**: 「ハイパーパラメータ」と「モデルパラメータ」の違いは?
→ **正解: モデルパラメータ: 学習によってデータから最適化される(重み/バイアス)。ハイパーパラメータ: 学習前に人手またはHPOで設定する設計変数(学習率/ツリーの深さ/正則化強度)。**

**問題 56**: SageMaker のローカルモードの用途は?
→ **正解: ローカルPC/ノートブックインスタンスで学習・推論をテスト実行。コードのデバッグを本番にデプロイする前に迅速に実施。`instance_type='local'` または `'local_gpu'` で設定。**

**問題 57**: `ml.inf1` インスタンスタイプの特徴は?
→ **正解: AWS Inferentia チップを搭載した推論専用インスタンス。SageMaker Neo でコンパイルしたモデルを実行。GPU インスタンスと比較して最大3倍のスループットと最大40%低コスト。**

**問題 58**: Amazon Lex の主な用途は?
→ **正解: 会話型インターフェース(チャットボット/音声ボット)の構築。自然言語理解(インテント認識)とスロット抽出を提供。Lambda との統合でバックエンド処理を実行。Amazon Connect との統合でコールセンター自動化。**

**問題 59**: SageMaker のバッチ変換(Batch Transform)と非同期推論(Asynchronous Inference)の違いは?
→ **正解: バッチ変換: S3 入力 → 処理 → S3 出力のオフライン一括処理(エンドポイント不要)。非同期推論: リアルタイムだがレスポンス待ち(S3 出力)が許容できる大規模推論。エンドポイントを維持しながらキュー経由で処理。**

**問題 60**: 「コンセプトドリフト(Concept Drift)」への対処法は?
→ **正解: (1) 継続的な再学習(定期的に最新データで再訓練)、(2) オンライン学習(逐次更新)、(3) モデルの定期的な評価と閾値超えで自動再学習トリガー。SageMaker Pipelines で自動化可能。**

**問題 61**: AWS HealthLake の特徴は?
→ **正解: 医療・ヘルスデータ(FHIR 形式)の保存・変換・クエリに特化したサービス。HIPAA 対応。SageMaker との統合で医療予測モデルの構築が可能。自然言語→FHIR 変換機能あり。**

**問題 62**: 「交差検証(Cross-Validation)」の目的は?
→ **正解: データを複数のフォールドに分割し、モデルの汎化性能を安定して推定する手法。データが少ない場合に特に有効。K-Fold CV: データを K 分割し、K 回の訓練/評価を繰り返す。**

**問題 63**: SageMaker Studio の「Experiment Tracking」で記録すべき情報は?
→ **正解: (1) ハイパーパラメータ、(2) 評価指標(Accuracy/RMSE等)、(3) 使用データセット(S3 URI)、(4) モデルアーティファクト(S3 URI)、(5) システム情報(インスタンスタイプ/実行時間)。再現性確保のために全て記録。**

**問題 64**: Amazon SageMaker Lineage Tracking の目的は?
→ **正解: ML ワークフロー全体のリネージ(系譜)を追跡。「このモデルはどのデータで学習されたか」「このデータはどの前処理を経たか」を遡れる。監査・コンプライアンス・デバッグに使用。**

**問題 65**: 機械学習の「モデルの公平性(Fairness)」テストで使用される指標の例は?
→ **正解: (1) Demographic Parity: グループ間の予測率の均等性、(2) Equalized Odds: グループ間の TPR/FPR の均等性、(3) Individual Fairness: 類似した個人は類似した予測を受ける。SageMaker Clarify で計算可能。**

---

## 学習戦略

### MLS-C01 の特徴(廃止済み資格)

> この試験は 2026 年 3 月 31 日に廃止されています。後継資格として以下を参照してください:
> - [MLA-C01 (Machine Learning Engineer Associate)](07-Machine-Learning-Engineer-Associate(MLA).md)
> - [AIF-C01 (AI Practitioner)](02-AI-Practitioner(AIF).md)

MLS-C01 の内容はこれらの後継資格に引き継がれており、本資料の内容は後継資格の学習にも有効です。

### ドメイン別学習重点

ドメイン 2: 探索的データ分析(24% - 最高比率) 重点: データの前処理・可視化・特徴量エンジニアリング よく出る: 欠損値処理、クラス不均衡、外れ値検出

ドメイン 3: モデリング(36% - 最高比率) 重点: アルゴリズム選択・ハイパーパラメータ・評価指標 よく出る: XGBoost、転移学習、SageMaker 組み込みアルゴリズム

ドメイン 1: データエンジニアリング(20%) 重点: データパイプライン、Kinesis、Glue、S3 よく出る: バッチ vs ストリーミング、データレイク構成

ドメイン 4: ML 実装・運用(20%) 重点: SageMaker デプロイ、モデル監視、MLOps よく出る: Model Monitor、SageMaker Pipelines、コスト最適化


---

## 試験直前チェックリスト(MLS-C01)

### アルゴリズム理解

- [ ] XGBoost のハイパーパラメータ(max_depth/eta/subsample/colsample_bytree)の役割を説明できる
- [ ] データ並列 vs モデル並列の使い分けを説明できる
- [ ] クラス不均衡への対処法(SMOTE/クラス重み/評価指標選択)を説明できる
- [ ] オーバーフィッティング vs アンダーフィッティングの症状と対処を説明できる

### AWS ML サービス

- [ ] SageMaker の組み込みアルゴリズムとユースケースを整理できる
- [ ] SageMaker のデプロイオプション(リアルタイム/サーバーレス/非同期/バッチ)を比較できる
- [ ] SageMaker Model Monitor の4種類の監視を説明できる
- [ ] Amazon AI サービス(Rekognition/Comprehend/Forecast/Personalize)の使い分けを説明できる

### ML エンジニアリング

- [ ] Feature Store の Online/Offline の使い分けを説明できる
- [ ] Managed Spot Training のチェックポイント設定を説明できる
- [ ] SageMaker Pipelines の ConditionStep を使った自動承認フローを設計できる
- [ ] CloudWatch + Model Monitor でのドリフト検出アーキテクチャを説明できる

---

## 付録:ML アルゴリズム早見表

### SageMaker 組み込みアルゴリズム一覧

| アルゴリズム | タスク | 特徴 |
|------------|------|------|
| XGBoost | 分類/回帰 | 最も汎用的、表形式データに強い |
| Linear Learner | 分類/回帰 | 線形問題、高速学習 |
| K-Means | クラスタリング | 探索的分析、セグメンテーション |
| PCA | 次元削減 | 特徴量圧縮、可視化 |
| Random Cut Forest | 異常検知 | 時系列異常、一般異常 |
| BlazingText | NLP | テキスト分類、Word2Vec |
| Seq2Seq | NLP | 翻訳、要約 |
| Object2Vec | 埋め込み | エンティティ関係学習 |
| DeepAR | 時系列予測 | 多変量、コールドスタート |
| Image Classification | CV | ResNet ベース転移学習 |
| Object Detection | CV | SSD ベース物体検出 |
| Semantic Segmentation | CV | ピクセルレベル分類 |
| IP Insights | 不正検知 | IP と ID の異常な組み合わせ |
| Factorization Machines | 推薦 | スパース特徴量の推薦 |
| LDA | トピック | テキストトピック発見 |
| Neural Topic Model | トピック | ニューラルネット版LDA |
| KNN | 分類/回帰 | 小規模データ、類似検索 |
| Tabular AutoML | 分類/回帰 | AutoGluon ベース |

---

*本ドキュメントは MLS-C01(廃止済み)および後継資格 MLA-C01/AIF-C01 の学習用資料です。*

---

## 深層学習アーキテクチャ詳細

### CNN(畳み込みニューラルネットワーク)

コンポーネント: Convolutional Layer(畳み込み層): フィルター(カーネル)でローカルな特徴を抽出 パラメータ共有 → 効率的な学習

Pooling Layer(プーリング層): Max Pooling: 最大値を取り特徴の位置不変性を確保 Average Pooling: 平均値を取り全体的な特徴を保持

Fully Connected Layer(全結合層): 高レベル特徴から最終的な分類/回帰を実施

代表的アーキテクチャ: VGG16/19: シンプルな構造、転移学習に広く使用 ResNet: 残差接続(Skip Connection)で深い網を学習可能 EfficientNet: スケーリング係数で精度/速度のバランス最適化 MobileNet: モバイル/エッジデバイス向け軽量モデル

転移学習のアプローチ: Feature Extraction: 最終層のみ学習(学習データが非常に少ない) Fine-tuning: 上位層を再学習(元タスクと類似している) 全層再学習: 学習データが十分にある場合


### RNN(再帰型ニューラルネットワーク)と LSTM

RNN の問題点: 長期依存関係の学習が困難(勾配消失問題)

LSTM(Long Short-Term Memory): ゲート機構で長期記憶を制御

Cell State(細胞状態): 長期記憶を保持

3つのゲート: Forget Gate: 不要な情報を忘れる Input Gate: 新しい情報を記憶する Output Gate: 出力する情報を制御

GRU(Gated Recurrent Unit): LSTM を簡略化(2ゲート) LSTM よりパラメータが少なく、同等性能を多くの場合で達成


### Transformer アーキテクチャ

Self-Attention メカニズム: Query, Key, Value の3つのベクトルを計算 Attention(Q,K,V) = softmax(QK^T / √d_k) V

→ 文中の全単語間の関係を並列計算 → RNN と異なり長距離依存関係を効率的に学習

Multi-Head Attention: 複数の Attention を並列実行 異なる「視点」から文の関係を学習

BERT vs GPT の違い: BERT: 双方向 Transformer Encoder マスク言語モデル(MLM)で事前学習 テキスト理解タスクに強い

GPT: 単方向 Transformer Decoder 次トークン予測で事前学習 テキスト生成タスクに強い

T5: Encoder-Decoder 構造 全タスクをテキスト→テキスト変換として統一


---

## ML 数学基礎

### 最適化アルゴリズム

勾配降下法(Gradient Descent): バッチGD: 全データで勾配計算 → 安定だが遅い 確率的GD(SGD): 1サンプルで更新 → 速いがノイジー ミニバッチGD: 小バッチで更新(最も一般的)

高度な最適化: Momentum: 過去の勾配の方向性を維持(慣性) AdaGrad: 各パラメータで学習率を適応調整 RMSprop: AdaGrad の学習率の急激な減少を改善 Adam: Momentum + RMSprop の組み合わせ(最も広く使用)

Adam 推奨初期値: lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8


### 正則化手法

L1 正則化(Lasso): コスト関数 + λΣ|w_i| → 重みをスパース化(不要な特徴量を0に) → 特徴量選択に有効

L2 正則化(Ridge): コスト関数 + λΣw_i² → 重みを小さく(0にはしない) → オーバーフィッティング防止の標準的手法

Elastic Net: L1 + L2 の組み合わせ 多数の特徴量でグループ構造がある場合に有効

Early Stopping: 検証損失が改善しなくなった時点で学習終了 過学習を防ぐシンプルで効果的な手法

Dropout: 学習時にランダムにニューロンを無効化 アンサンブル効果と過学習防止


---

## ML パイプライン設計パターン

### 本番 ML システムのアーキテクチャ

データ収集/取り込み ↓ データバリデーション(スキーマ/統計チェック) ↓ 特徴量エンジニアリング ↓ モデル学習 ↓ モデル評価/バリデーション ↓ モデル登録(Model Registry) ↓ デプロイ(ステージング → 本番) ↓ 監視(データドリフト/モデルドリフト/インフラ) ↓ 再学習トリガー → ループ


### MLOps 成熟度モデル

Level 0: 手動プロセス

  • ノートブックで実験
  • 手動でデプロイ
  • 再学習は手動

Level 1: ML パイプライン自動化

  • 学習パイプラインの自動化
  • CT(継続的学習)
  • 手動トリガーで再学習

Level 2: CI/CD パイプライン自動化

  • コード変更で自動テスト・デプロイ
  • 自動的な再学習・デプロイ
  • 完全自動化された MLOps

---

## Amazon SageMaker コスト最適化

### インスタンスタイプの選択指針

開発・実験: ml.t3.medium / ml.m5.large: 軽量な実験・プロトタイプ

学習(CPU): ml.m5.xlarge 〜 ml.m5.24xlarge: 中規模データ ml.c5.18xlarge: CPU 集約型(XGBoost等)

学習(GPU): ml.g4dn.xlarge (T4 GPU): コスト効率が高い ml.p3.2xlarge (V100 GPU): 深層学習標準 ml.p3.16xlarge (8 V100): 分散学習 ml.p4d.24xlarge (8 A100): 大規模LLM学習

推論: ml.m5.large: 汎用・低コスト ml.c5.large: 高スループット推論 ml.inf1.xlarge: コスト効率最高(Inferentia) ml.g4dn.xlarge: GPU推論が必要な場合


### コスト削減戦略

学習コスト:

  1. Managed Spot Training: 最大90%削減(中断耐性が必要)
  2. 混合精度(FP16): GPU メモリ削減 → 小さいインスタンス
  3. 学習時間の最適化: 適切な早期停止

推論コスト:

  1. Serverless Inference: トラフィックが断続的
  2. Multi-Model Endpoint: 多数のモデルを1エンドポイントに集約
  3. SageMaker Neo + Inferentia: GPU推論の1/3コスト
  4. Auto Scaling: トラフィックに応じてスケールアウト/イン

開発コスト:

  1. SageMaker Studio: 統合開発環境(ノートブック/実験管理)
  2. Local Mode: ローカルでデバッグして本番コスト削減
  3. SageMaker Savings Plans: 長期コミットメント割引

---

## データエンジニアリング詳細

### データレイクアーキテクチャ

AWS Lake Formation を使ったデータレイク:

S3 (ストレージ) ├── raw/ ← 生データ(加工前) ├── processed/ ← Glue ETL 処理済み └── curated/ ← 分析・ML 用に整形済み

データカタログ(AWS Glue Data Catalog): Crawler でスキーマを自動検出・更新 メタデータの一元管理

アクセス制御: Lake Formation でテーブル・カラムレベルのアクセス制御 Governed Table: ACID トランザクション対応

ML との統合: SageMaker Feature Store (Offline) → S3 + Glue カタログ SageMaker Data Wrangler → S3/Redshift/Athena から直接インポート


### Kinesis と ML のリアルタイム統合

リアルタイム ML パイプライン:

IoT / アプリ → Kinesis Data Streams ↓ Lambda (前処理) ↓ SageMaker リアルタイムエンドポイント(推論) ↓ Lambda (後処理・アラート) ↓ DynamoDB (結果保存) / SNS (通知)

Kinesis Data Analytics (KDA) での ML: Random Cut Forest(RCF)アルゴリズムを SQL で利用 ストリーミングデータの異常検知をリアルタイム実行


---

## 模擬試験追加(20問)

### 問題 66

SageMaker の「ハイパーパラメータチューニング(HPO)」で、同時並列トライアルを増やすことのトレードオフは何ですか?

- A. 精度が低下し、コストが増加する
- B. 探索の効率が下がる(各試行の結果を次の試行に活かせない)が、総学習時間を短縮できる
- C. 並列化に伴いインスタンスタイプを変更しなければならない
- D. 並列トライアルは常に効率的で、トレードオフはない

<details>
<summary>正解と解説</summary>

**正解: B**

HPO の Bayesian 最適化は、前の試行結果を学習して次の有望な設定を選びます。並列試行数を増やすと、各試行が他の試行の結果を参照できないため(同時実行中)、探索の効率が下がります。しかし総所要時間は短縮されます。これがトレードオフです。

トレードオフの整理:
- 並列数大: 所要時間↓、必要試行数↑(効率↓)
- 並列数小: 所要時間↑、必要試行数↓(効率↑)

</details>

---

### 問題 67

SageMaker で学習した XGBoost モデルをコンテナレジストリ(ECR)を使わずに SageMaker Model Registry に登録できますか?

- A. できない(必ず ECR イメージが必要)
- B. できる(S3 に保存したモデルアーティファクトと SageMaker 提供のコンテナを使用して登録できる)
- C. できるが、推論には使用できない
- D. できるが、バッチ変換のみに対応

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker Model Registry への登録に必要なのは:
- モデルアーティファクト(S3 URI)
- 推論コンテナ(SageMaker 提供の XGBoost コンテナ URI または ECR カスタムコンテナ)

SageMaker が提供する組み込みアルゴリズムのコンテナ(ECR on AWS 管理)を使えば、自前で ECR イメージをビルドする必要はありません。

</details>

---

### 問題 68

Apache Spark の MLlib と SageMaker を組み合わせる典型的なユースケースは?

- A. SageMaker でデータをストリーミング処理し、Spark で推論を実行する
- B. EMR 上の Spark で大規模データを前処理し、SageMaker に学習データを渡してモデルを学習する
- C. Spark の MLlib モデルを SageMaker エンドポイントとして直接デプロイする
- D. SageMaker Studio で Spark クラスターを直接管理する

<details>
<summary>正解と解説</summary>

**正解: B**

典型的なパターン:

大規模生データ(S3/HDFS) ↓ EMR + Spark(分散前処理・特徴量エンジニアリング) ↓ S3(処理済みデータを RecordIO/CSV で保存) ↓ SageMaker Training(XGBoost/DL等で高性能モデル学習) ↓ SageMaker Endpoint(リアルタイム推論)


`sagemaker-spark` ライブラリを使うと Spark から直接 SageMaker を呼び出せます。

</details>

---

### 問題 69

SageMaker Data Wrangler の主な機能と適したユーザーは?

- A. データエンジニア向けのコードベース ETL ツール
- B. データサイエンティスト向けのビジュアルデータ準備・変換ツール(コード最小化)
- C. DevOps エンジニア向けの ML パイプライン管理ツール
- D. ビジネスアナリスト向けのダッシュボード作成ツール

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker Data Wrangler:
- GUI でデータの探索・変換・可視化
- 300以上の組み込み変換(エンコーディング/スケーリング/欠損値処理等)
- 変換レシピを SageMaker Processing ジョブまたは Feature Store パイプラインとしてエクスポート
- S3/Redshift/Athena/SageMaker Feature Store から直接インポート
- データ品質(偏り/異常値)の可視化レポート自動生成

</details>

---

### 問題 70

SageMaker Serverless Inference の制約として正しいものはどれですか?(2つ選択)

- A. モデルサイズは最大 5GB まで
- B. コールドスタート時にレイテンシが発生する(数秒〜)
- C. GPU 推論に対応していない
- D. 1分あたりのリクエスト数に制限がある
- E. S3 からしかモデルをロードできない

<details>
<summary>正解と解説</summary>

**正解: B, C**

SageMaker Serverless Inference の制約:
- **コールドスタート**: アイドル時間後の最初のリクエストにレイテンシ(数秒)
- **GPU なし**: CPU 推論のみ対応(GPU が必要な場合はリアルタイムエンドポイント)
- メモリ: 1GB〜6GB から選択
- タイムアウト: 60秒(デフォルト)、最大 60秒

GPU が必要な深層学習推論 → リアルタイムエンドポイント(ml.g4dn等)を使用。

</details>

---

### 問題 71

SageMaker の「推論パイプライン(Inference Pipeline)」の用途は?

- A. 複数のモデルを並列で実行してアンサンブルする
- B. 前処理 → 推論 → 後処理を一連のコンテナとしてエンドポイントに組み込む
- C. バッチ推論を並列化して高速化する
- D. モデルのA/Bテストを自動化する

<details>
<summary>正解と解説</summary>

**正解: B**

推論パイプラインの構成例:

入力データ ↓ コンテナ 1: 前処理(Scikit-learn で特徴量変換) ↓ コンテナ 2: モデル推論(XGBoost) ↓ コンテナ 3: 後処理(予測値の変換・フォーマット) ↓ 出力


これにより、前処理ロジックを推論エンドポイントに直接組み込み、クライアント側の前処理を不要にできます。

</details>

---

### 問題 72

Feature Store の「Time-Travel」機能が重要な理由は何ですか?

- A. 未来の特徴量を予測できる
- B. Training-Serving Skew(学習時と推論時の特徴量の乖離)を防ぐため、学習データ作成時に正確な時点の特徴量を取得できる
- C. モデルの過去バージョンを復元できる
- D. 特徴量の自動バージョン管理を行う

<details>
<summary>正解と解説</summary>

**正解: B**

Time-Travel の重要性:

問題: 学習データ作成時に「将来のデータ」が混入するデータリーケージ

例: 2024年1月1日時点の顧客スコアを予測するモデルを学習する場合 誤り: 現在(2024年12月)の特徴量で学習 → リーケージ 正解: 2024年1月1日時点の特徴量を Time-Travel で取得して学習

Feature Store は event_time で各特徴量を記録し、 任意の時点の特徴量値を正確に取得可能。


</details>

---

### 問題 73

`SageMaker Experiments` と `MLflow` の類似した機能は何ですか?

- A. 自動ハイパーパラメータチューニング
- B. 実験の追跡(パラメータ/メトリクス/アーティファクトの記録と比較)
- C. モデルのデプロイ自動化
- D. データの前処理自動化

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker Experiments ≈ MLflow Tracking:
- 実験(Experiment)と実行(Run)の概念が共通
- ハイパーパラメータ、メトリクス、アーティファクトを記録
- 複数の実行を比較して最良の設定を特定
- SageMaker は AWS ネイティブ統合(MLflow は OSS でマルチクラウド対応)

</details>

---

### 問題 74

SageMaker での「モデルモニタリング」で `baseline_statistics` と `baseline_constraints` の役割は?

- A. モデルの精度の目標値を設定する
- B. 学習データの統計量と制約(ベースライン)を本番データと比較する基準として使用する
- C. 推論のレイテンシ上限を設定する
- D. 本番データのサンプリング率を制御する

<details>
<summary>正解と解説</summary>

**正解: B**

Model Monitor の動作:
  1. Baseline 作成: baseline_statistics.json: 学習データの統計量(平均/標準偏差/分布) baseline_constraints.json: 違反とみなす基準(欠損率上限/型不一致等)

  2. 継続監視: 本番の推論入力データを S3 にキャプチャ 定期的にベースラインと比較

  3. 違反検出: 統計量が大きく変化 → CloudWatch Alarm → 再学習トリガー


</details>

---

### 問題 75

Amazon SageMaker の `CreatePresignedNotebookInstanceUrl` の用途は?

- A. S3 バケットへの署名済みアップロード URL を作成する
- B. SageMaker Notebook インスタンスに認証なしでアクセスできる一時 URL を生成する
- C. SageMaker エンドポイントへの署名済みリクエスト URL を生成する
- D. Lambda から SageMaker を呼び出すための URL を生成する

<details>
<summary>正解と解説</summary>

**正解: B**

Presigned Notebook URL:
- SageMaker コンソールを使わずにノートブックにアクセスできる一時 URL
- デフォルト有効期限: 5分
- 用途: CI/CD からノートブックを操作、社外ユーザーへの一時アクセス提供
- AWS IAM 認証なしで指定されたノートブックインスタンスにアクセス可能

</details>

---

### 問題 76

SageMaker Processing ジョブで Scikit-learn を使う場合の設定は?

- A. `SKLearnProcessor` を使い、`framework_version` でバージョンを指定する
- B. カスタム Docker コンテナを常に作成する必要がある
- C. SageMaker Processing は Python スクリプトしかサポートしない
- D. Scikit-learn は SageMaker Processing では使用できない

<details>
<summary>正解と解説</summary>

**正解: A**

```python
from sagemaker.sklearn.processing import SKLearnProcessor

sklearn_processor = SKLearnProcessor(
    framework_version='1.0-1',
    role=role,
    instance_type='ml.m5.xlarge',
    instance_count=1
)

sklearn_processor.run(
    code='preprocessing.py',
    inputs=[ProcessingInput(source='s3://bucket/raw', destination='/opt/ml/processing/input')],
    outputs=[ProcessingOutput(source='/opt/ml/processing/output', destination='s3://bucket/processed')]
)
```text

SageMaker が管理する Scikit-learn コンテナを使用するため、Docker ビルドは不要です。

</details>

---

### 問題 77

深層学習モデルの学習で「バッチサイズ」を増やすことの影響は?

- A. 常にモデルの精度が向上する
- B. GPU メモリ使用量が増加するが、学習が安定して1エポックの時間が短縮される。ただし学習率の調整が必要で、過大なバッチは汎化性能を低下させる場合がある
- C. バッチサイズは精度に影響しない
- D. GPU メモリが減少する

<details>
<summary>正解と解説</summary>

**正解: B**

バッチサイズのトレードオフ:

| | 小バッチ(32-128) | 大バッチ(1024+) |
|---|---|---|
| 更新頻度 | 多い | 少ない |
| 勾配ノイズ | 多い(正則化効果) | 少ない |
| 汎化性能 | 高い傾向 | 低下する場合 |
| 学習時間/エポック | 長い | 短い |
| GPU 利用効率 | 低い | 高い |

大バッチでは Linear Scaling Rule(学習率をバッチサイズに比例して増加)が推奨されます。

</details>

---

### 問題 78

SageMaker で外部のカスタムコンテナ(BYOC)を使う際に、コンテナが受け取る環境変数とディレクトリの慣習は?

- A. 任意の形式で実装できる
- B. `/opt/ml/input/` にデータ、`/opt/ml/model/` にモデル出力、`/opt/ml/output/failure` にエラー情報を配置する規約に従う必要がある
- C. S3 から直接データを読み込む必要がある
- D. SageMaker SDK の特定の API を必ずコール必要がある

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker コンテナの規約:

/opt/ml/ ├── input/ │ ├── config/ │ │ ├── hyperparameters.json ← HPO設定 │ │ └── resourceConfig.json ← 分散学習設定 │ └── data/ │ └── training/ ← 学習データ ├── model/ ← モデル出力先 └── output/ └── failure ← エラーメッセージ


このディレクトリ構造に従えば、SageMaker のどのアルゴリズム/サービスでも動作します。

</details>

---

### 問題 79

Amazon SageMaker のエンドポイントに適用できる「インスタンスアベイラビリティ」向上の設定は?

- A. Multi-AZ エンドポイント設定
- B. SageMaker エンドポイントは自動的に複数 AZ にインスタンスを分散配置される
- C. Route 53 フェイルオーバーを手動設定する
- D. SageMaker は単一 AZ にしかデプロイできない

<details>
<summary>正解と解説</summary>

**正解: B**

SageMaker リアルタイムエンドポイントは:
- 複数インスタンスを設定すると、自動的に複数 AZ に分散
- `initial_instance_count=2` 以上で高可用性を確保
- Auto Scaling でスケールアウト時も AZ 分散を維持

```python
predictor = estimator.deploy(
    initial_instance_count=2,  # 高可用性のため2以上
    instance_type='ml.m5.xlarge'
)
```text

</details>

---

### 問題 80

ML における「データ拡張(Data Augmentation)」と「オーバーサンプリング(SMOTE)」の主な違いは?

- A. データ拡張は画像専用、SMOTE はテキスト専用
- B. データ拡張は元のデータを変換して多様なサンプルを生成(ドメイン知識ベース)、SMOTE は少数クラスのデータを補間で合成(クラス不均衡対応)
- C. どちらも同じ技術で、目的も同じ
- D. データ拡張はテスト時にも適用するが、SMOTE は学習時のみ

<details>
<summary>正解と解説</summary>

**正解: B**

| | データ拡張 | SMOTE |
|---|---|---|
| 目的 | データ多様性向上・過学習防止 | クラス不均衡の解消 |
| 手法 | 回転/反転/クロップ/ノイズ付加等 | 近傍サンプル間の補間 |
| 対象 | 主に画像(テキストも可) | 数値/カテゴリ特徴量 |
| 適用タイミング | 学習時のみ(テスト時は不要) | 学習データ生成時のみ |
| ドメイン知識 | 必要(どの変換が妥当か) | 不要 |

</details>

---

## 付録 B:数式・記号早見表

### よく使う評価指標

分類: Accuracy = (TP + TN) / N Precision = TP / (TP + FP) Recall = TP / (TP + FN) F1 = 2PR / (P + R) AUC-ROC = ROC 曲線の面積

回帰: MAE = (1/n) Σ|y_i - ŷ_i| RMSE = √((1/n) Σ(y_i - ŷ_i)²) R² = 1 - SS_res / SS_tot MAPE = (1/n) Σ|(y_i - ŷ_i) / y_i| × 100

クラスタリング: Silhouette = (b - a) / max(a, b) a: 同クラスタの平均距離 b: 最近接クラスタへの平均距離


### 情報理論の基礎

エントロピー(不確実性の尺度): H(X) = -Σ p(x_i) log₂ p(x_i)

均等分布 → 最大エントロピー(最も不確か) 確定分布 → エントロピー = 0(完全に確か)

クロスエントロピー(分類の損失関数): BCE = -[y log(p) + (1-y) log(1-p)]

KL ダイバージェンス: DKL(P||Q) = Σ P(x) log(P(x)/Q(x)) 2つの分布の差異を測定


---

*本ドキュメントは AWS MLS-C01(廃止済み)および後継資格 MLA-C01/AIF-C01 の学習用資料です。最新情報は AWS 公式試験ガイドをご確認ください。*

---

## ML プロジェクト管理

### CRISP-DM プロセス

CRISP-DM(Cross-Industry Standard Process for Data Mining):

  1. ビジネス理解(Business Understanding)

    • 目的と成功基準の明確化
    • MLで解くべき問題の定義
  2. データ理解(Data Understanding)

    • データ収集と品質確認
    • 探索的データ分析(EDA)
  3. データ準備(Data Preparation)

    • クリーニング、変換、特徴量エンジニアリング
    • 全工程の約80%の時間を要する
  4. モデリング(Modeling)

    • アルゴリズム選択と学習
    • ハイパーパラメータチューニング
  5. 評価(Evaluation)

    • ビジネス目標に対する評価
    • モデルの妥当性検証
  6. 展開(Deployment)

    • 本番環境へのデプロイ
    • 監視と維持

### ML プロジェクトの失敗原因

技術的な失敗:

  • 過学習(モデルが複雑すぎる)
  • データリーケージ(未来の情報が学習に混入)
  • Training-Serving Skew(学習と推論で異なる前処理)
  • データ品質の問題

組織的な失敗:

  • ビジネス目標との乖離(最適化する指標が間違っている)
  • 再現性の欠如(実験を記録していない)
  • スケーラビリティの考慮不足
  • MLOps の不備(監視・再学習仕組みがない)

対策:

  • SageMaker Experiments で全実験を記録
  • Feature Store で Training-Serving Skew を防止
  • Model Monitor でデータ/モデルドリフトを監視
  • SageMaker Pipelines で再現可能なパイプラインを構築

---

## Amazon Bedrock と ML の関係

### Bedrock を ML パイプラインに組み込む

ユースケース:

  1. テキストラベリング補助 LLM(Claude)でラベリング候補を生成 → 人間によるレビューでコスト削減

  2. 特徴量エンジニアリング テキストを Bedrock で Embedding に変換 → 下流の分類/クラスタリングモデルの特徴量として使用

  3. 合成データ生成 LLM で学習データを補完(特に少数クラス)

  4. モデル出力の後処理 LLM でモデルの予測を自然言語で説明(XAI)

  5. RAG(検索拡張生成) SageMaker で学習した埋め込みモデル → Bedrock Knowledge Bases で使用


---

## AWS AI/ML サービス全体像

### サービス選択フレームワーク

タスクの種類から選択:

画像/動画: 画像分類 → Rekognition Labels / Image Classification 顔認識 → Rekognition Faces 物体検出 → Rekognition / Object Detection カスタム画像 → Rekognition Custom Labels 動画分析 → Rekognition Video

テキスト: 感情分析 → Comprehend エンティティ抽出 → Comprehend テキスト分類 → Comprehend Custom / BlazingText 機械翻訳 → Amazon Translate テキスト生成 → Bedrock Q&A/検索 → Kendra

音声: 音声認識(STT) → Transcribe 音声合成(TTS) → Polly

ドキュメント: OCR/フォーム解析 → Textract 医療ドキュメント → Comprehend Medical / HealthLake

予測/レコメンド: 時系列予測 → Forecast レコメンド → Personalize 異常検知 → Lookout for Metrics / Lookout for Vision 不正検知 → Fraud Detector

カスタムML: 全般 → SageMaker AutoML → SageMaker Autopilot / Canvas ノーコード → SageMaker Canvas


---

## 実践的なコードパターン

### SageMaker SDK を使った学習フロー

```python
import sagemaker
from sagemaker.xgboost import XGBoost

# セッション設定
session = sagemaker.Session()
role = sagemaker.get_execution_role()
bucket = session.default_bucket()

# XGBoost estimator の作成
estimator = XGBoost(
    entry_point='train.py',      # 学習スクリプト
    framework_version='1.5-1',
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    hyperparameters={
        'max_depth': 5,
        'eta': 0.1,
        'num_round': 100,
        'objective': 'binary:logistic',
        'eval_metric': 'auc'
    },
    use_spot_instances=True,     # スポットで最大90%削減
    max_wait=7200,
    checkpoint_s3_uri=f's3://{bucket}/checkpoints'
)

# 学習データの指定
train_input = sagemaker.inputs.TrainingInput(
    f's3://{bucket}/data/train',
    content_type='csv'
)

# 学習開始
estimator.fit({'train': train_input})

# デプロイ
predictor = estimator.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.large'
)

# 推論
result = predictor.predict([[1.0, 2.0, 3.0, 4.0]])
print(result)

# エンドポイント削除(コスト管理)
predictor.delete_endpoint()
```text

### SageMaker Pipelines の実装パターン

```python
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.steps import ProcessingStep, TrainingStep, CreateModelStep
from sagemaker.workflow.parameters import ParameterFloat
from sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo
from sagemaker.workflow.condition_step import ConditionStep
from sagemaker.workflow.fail_step import FailStep

# パイプラインパラメータ
accuracy_threshold = ParameterFloat(name="AccuracyThreshold", default_value=0.85)

# Step 1: 前処理
step_process = ProcessingStep(name="Preprocessing", ...)

# Step 2: 学習
step_train = TrainingStep(
    name="Training",
    depends_on=[step_process],
    ...
)

# Step 3: 評価
step_evaluate = ProcessingStep(
    name="Evaluation",
    depends_on=[step_train],
    ...
)

# Step 4: 条件分岐
step_register = CreateModelStep(name="RegisterModel", ...)
step_fail = FailStep(name="FailPipeline", error_message="精度が閾値を下回りました")

step_cond = ConditionStep(
    name="CheckAccuracy",
    conditions=[ConditionGreaterThanOrEqualTo(
        left=JsonGet(step_name="Evaluation", property_file="metrics"),
        right=accuracy_threshold
    )],
    if_steps=[step_register],
    else_steps=[step_fail]
)

# パイプライン定義
pipeline = Pipeline(
    name="MLPipeline",
    parameters=[accuracy_threshold],
    steps=[step_process, step_train, step_evaluate, step_cond],
    sagemaker_session=session
)

# 実行
pipeline.upsert(role_arn=role)
execution = pipeline.start(parameters={"AccuracyThreshold": 0.9})
```text

---

## 試験直前総まとめ

### 重要ポイント 50 選

#### データ処理
1. S3 は SageMaker のデフォルトストレージ(学習/モデル保存)
2. RecordIO フォーマット = Pipe モード対応、大規模データ向き
3. Glue DataBrew = ノーコードデータ準備(ビジネスアナリスト向け)
4. SageMaker Processing = コードベース前処理(データサイエンティスト向け)
5. Feature Store の Online Store = リアルタイム推論向き(DynamoDB バックエンド)
6. Feature Store の Offline Store = バッチ学習向き(S3 バックエンド)
7. Time-Travel = 特定時点の特徴量値を取得(リーケージ防止)

#### アルゴリズム
8. XGBoost = 表形式データで最も汎用的(分類/回帰)
9. Linear Learner = 線形問題、高速、自動正規化
10. K-Means = クラスタリング(k はエルボー法/シルエット分析で選択)
11. PCA = 次元削減(Regular/Randomized の2モード)
12. Random Cut Forest = 異常検知(教師なし)
13. BlazingText = テキスト分類/Word2Vec(Word2Vec は教師なし)
14. DeepAR = 多変量時系列予測(コールドスタート対応)
15. Image Classification = ResNet ベース(転移学習サポート)
16. Object Detection = SSD ベース(バウンディングボックス検出)

#### 評価指標
17. 精度(Accuracy)= クラス不均衡では無意味
18. F1 スコア = Precision と Recall のバランス(クラス不均衡に有効)
19. AUC-ROC = 閾値に依存しない分類性能の評価
20. RMSE = 外れ値の影響を受けやすい(二乗のため)
21. MAE = 外れ値に頑健(絶対値のため)
22. mAP = 物体検出の評価指標(全クラスの AP の平均)

#### 過学習対策
23. L1 正則化(Lasso)= 特徴量をスパース化(特徴量選択効果)
24. L2 正則化(Ridge)= 重みを小さく(スパース化しない)
25. Dropout = ランダムにニューロン無効化(アンサンブル効果)
26. Early Stopping = 検証損失が悪化したら学習終了
27. データ拡張 = 画像の回転/反転でデータを増加
28. SMOTE = 少数クラスのサンプルを補間で増加(クラス不均衡)

#### SageMaker デプロイ
29. リアルタイムエンドポイント = 低レイテンシ(ms オーダー)
30. サーバーレス推論 = コールドスタートあり、GPU なし、夜間ゼロコスト
31. 非同期推論 = 大規模リクエスト、レスポンス待ち許容
32. バッチ変換 = S3 入力→S3 出力、エンドポイント不要
33. Multi-Model Endpoint = 多数のモデルを1エンドポイントに
34. Inference Pipeline = 前処理→推論→後処理をコンテナチェーン
35. Production Variants = A/Bテスト(トラフィック重みで配分)

#### コスト最適化
36. Managed Spot Training = 最大 90% 削減(中断耐性+チェックポイント必要)
37. SageMaker Neo = 推論最適化(Inferentia で 1/3 コスト)
38. ml.inf1 = Inferentia チップ搭載の推論専用(コスト効率高)
39. ml.g4dn = GPU 推論でコスト効率が高い(T4 GPU)
40. Serverless Inference = アイドル時間が長い場合に最適

#### MLOps
41. SageMaker Pipelines = ML パイプラインの自動化・再現性確保
42. SageMaker Experiments = 実験追跡(パラメータ/メトリクス/アーティファクト)
43. Model Registry = モデルバージョン管理と承認ワークフロー
44. Model Monitor = データドリフト/モデルドリフト/バイアスドリフト検出
45. SageMaker Clarify = 公平性(SHAP)と説明可能性

#### AI サービス
46. Rekognition = 画像・動画分析(物体/顔/テキスト検出)
47. Comprehend = NLP(感情/エンティティ/キーフレーズ)
48. Forecast = 時系列予測(AutoPredictor で複数アルゴリズム自動比較)
49. Personalize = レコメンデーション(ユーザー/アイテム/ランキング)
50. Textract = ドキュメント OCR + 構造抽出(フォーム/テーブル)

---

## 学習リソースとロードマップ

### 後継資格へのロードマップ

MLS-C01(廃止済み)の知識 → 2つの方向へ活用

方向 1: AI/ML 実践者向け MLA-C01(Machine Learning Engineer Associate) - SageMaker の実装スキル重視 - MLOps・パイプライン設計 - 本ノートの「SageMaker 詳細」「MLOps」セクションが有効

方向 2: AI/ビジネス活用向け AIF-C01(AI Practitioner) - AI/ML の概念理解重視 - AWS AI サービスの活用 - 本ノートの「AWS AI サービス」セクションが有効

さらに上を目指す場合: AIP(Generative AI Developer Professional) - LLM・RAG・マルチエージェント - Bedrock の高度な活用


### 推奨学習順序

Week 1: ML 基礎 Day 1-2: ML の種類(教師あり/なし/強化)、評価指標 Day 3-4: アルゴリズム(XGBoost/K-Means/PCA/RCF) Day 5-7: データ前処理(欠損値/エンコーディング/スケーリング)

Week 2: SageMaker 実装 Day 8-9: SageMaker 基本(Studio/学習/デプロイ) Day 10-11: 組み込みアルゴリズム一覧 Day 12-13: MLOps(Pipelines/Model Monitor/Experiments) Day 14: コスト最適化(Spot/Serverless/Neo)

Week 3: AWS AI サービスと実践 Day 15-16: Rekognition/Comprehend/Forecast/Personalize Day 17-18: SageMaker 上級(Feature Store/Clarify/Debugger) Day 19-20: 深層学習(CNN/RNN/Transformer) Day 21: ハンズオン(実際に SageMaker で学習・デプロイ)

Week 4: 模擬試験と仕上げ Day 22-24: 本ノートの 65+20 問の模擬試験 Day 25-27: 弱点の補強(アルゴリズム詳細/評価指標) Day 28-30: 直前チェックリストの確認


---

*MLS-C01 完全学習ガイド完了。後継資格 MLA-C01 と AIF-C01 の学習にも本資料をご活用ください。*

---

## 9. 高度な実装パターンとコード例

### SageMaker Pipelines 完全実装

```python
import boto3
import sagemaker
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.steps import ProcessingStep, TrainingStep, TransformStep
from sagemaker.workflow.parameters import ParameterInteger, ParameterFloat, ParameterString
from sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo
from sagemaker.workflow.condition_step import ConditionStep
from sagemaker.workflow.functions import JsonGet
from sagemaker.sklearn.processing import SKLearnProcessor
from sagemaker.estimator import Estimator
from sagemaker.inputs import TrainingInput
from sagemaker.model_metrics import MetricsSource, ModelMetrics
from sagemaker.workflow.step_collections import RegisterModel

session = sagemaker.Session()
role = sagemaker.get_execution_role()
bucket = session.default_bucket()

# パイプラインパラメータ
processing_instance_count = ParameterInteger(name="ProcessingInstanceCount", default_value=1)
training_instance_type = ParameterString(name="TrainingInstanceType", default_value="ml.m5.xlarge")
accuracy_threshold = ParameterFloat(name="AccuracyThreshold", default_value=0.85)
model_approval_status = ParameterString(name="ModelApprovalStatus", default_value="PendingManualApproval")

# 前処理ステップ
sklearn_processor = SKLearnProcessor(
    framework_version="1.0-1",
    instance_type="ml.m5.xlarge",
    instance_count=processing_instance_count,
    role=role,
    sagemaker_session=session
)

processing_step = ProcessingStep(
    name="PreprocessData",
    processor=sklearn_processor,
    inputs=[
        sagemaker.processing.ProcessingInput(source=f"s3://{bucket}/raw-data/", destination="/opt/ml/processing/input")
    ],
    outputs=[
        sagemaker.processing.ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
        sagemaker.processing.ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
        sagemaker.processing.ProcessingOutput(output_name="test", source="/opt/ml/processing/test")
    ],
    code="preprocess.py"
)

# XGBoostトレーニングステップ
xgb_estimator = Estimator(
    image_uri=sagemaker.image_uris.retrieve("xgboost", boto3.Session().region_name, "1.5-1"),
    instance_type=training_instance_type,
    instance_count=1,
    output_path=f"s3://{bucket}/models/",
    role=role,
    sagemaker_session=session,
    hyperparameters={
        "max_depth": 5,
        "eta": 0.2,
        "gamma": 4,
        "min_child_weight": 6,
        "subsample": 0.8,
        "objective": "binary:logistic",
        "num_round": 100,
        "eval_metric": "auc"
    }
)

training_step = TrainingStep(
    name="TrainXGBoost",
    estimator=xgb_estimator,
    inputs={
        "train": TrainingInput(
            s3_data=processing_step.properties.ProcessingOutputConfig.Outputs["train"].S3Output.S3Uri,
            content_type="text/csv"
        ),
        "validation": TrainingInput(
            s3_data=processing_step.properties.ProcessingOutputConfig.Outputs["validation"].S3Output.S3Uri,
            content_type="text/csv"
        )
    }
)

# モデル評価ステップ
evaluation_processor = SKLearnProcessor(
    framework_version="1.0-1",
    instance_type="ml.m5.xlarge",
    instance_count=1,
    role=role,
    sagemaker_session=session
)

evaluation_step = ProcessingStep(
    name="EvaluateModel",
    processor=evaluation_processor,
    inputs=[
        sagemaker.processing.ProcessingInput(
            source=training_step.properties.ModelArtifacts.S3ModelArtifacts,
            destination="/opt/ml/processing/model"
        ),
        sagemaker.processing.ProcessingInput(
            source=processing_step.properties.ProcessingOutputConfig.Outputs["test"].S3Output.S3Uri,
            destination="/opt/ml/processing/test"
        )
    ],
    outputs=[
        sagemaker.processing.ProcessingOutput(output_name="evaluation", source="/opt/ml/processing/evaluation")
    ],
    code="evaluate.py",
    property_files=[
        sagemaker.workflow.properties.PropertyFile(
            name="EvaluationReport",
            output_name="evaluation",
            path="evaluation.json"
        )
    ]
)

# 条件分岐 - 精度閾値チェック
accuracy_condition = ConditionGreaterThanOrEqualTo(
    left=JsonGet(
        step_name=evaluation_step.name,
        property_file="EvaluationReport",
        json_path="binary_classification_metrics.accuracy.value"
    ),
    right=accuracy_threshold
)

# モデル登録ステップ
model_metrics = ModelMetrics(
    model_statistics=MetricsSource(
        s3_uri="{}/evaluation.json".format(
            evaluation_step.arguments["ProcessingOutputConfig"]["Outputs"][0]["S3Output"]["S3Uri"]
        ),
        content_type="application/json"
    )
)

register_step = RegisterModel(
    name="RegisterModel",
    estimator=xgb_estimator,
    model_data=training_step.properties.ModelArtifacts.S3ModelArtifacts,
    content_types=["text/csv"],
    response_types=["text/csv"],
    inference_instances=["ml.t2.medium", "ml.m5.xlarge"],
    transform_instances=["ml.m5.xlarge"],
    model_package_group_name="ChurnPredictionModels",
    approval_status=model_approval_status,
    model_metrics=model_metrics
)

condition_step = ConditionStep(
    name="CheckAccuracy",
    conditions=[accuracy_condition],
    if_steps=[register_step],
    else_steps=[]
)

# パイプライン定義
pipeline = Pipeline(
    name="ChurnPredictionPipeline",
    parameters=[
        processing_instance_count,
        training_instance_type,
        accuracy_threshold,
        model_approval_status
    ],
    steps=[processing_step, training_step, evaluation_step, condition_step],
    sagemaker_session=session
)

pipeline.upsert(role_arn=role)
execution = pipeline.start(
    parameters=dict(
        TrainingInstanceType="ml.m5.2xlarge",
        AccuracyThreshold=0.90
    )
)
execution.wait()
```text

### SageMaker Feature Store 実装

```python
import boto3
import sagemaker
from sagemaker.feature_store.feature_group import FeatureGroup
from sagemaker.feature_store.feature_definition import (
    FeatureDefinition, FeatureTypeEnum
)
import pandas as pd
import time

session = sagemaker.Session()
region = boto3.Session().region_name
featurestore_runtime_client = boto3.Session().client(
    service_name="sagemaker-featurestore-runtime",
    region_name=region
)

# Feature Group作成
customer_feature_group = FeatureGroup(
    name="customer-churn-features",
    sagemaker_session=session
)

customer_feature_definitions = [
    FeatureDefinition(feature_name="customer_id", feature_type=FeatureTypeEnum.STRING),
    FeatureDefinition(feature_name="event_time", feature_type=FeatureTypeEnum.FRACTIONAL),
    FeatureDefinition(feature_name="tenure_months", feature_type=FeatureTypeEnum.INTEGRAL),
    FeatureDefinition(feature_name="monthly_charges", feature_type=FeatureTypeEnum.FRACTIONAL),
    FeatureDefinition(feature_name="total_charges", feature_type=FeatureTypeEnum.FRACTIONAL),
    FeatureDefinition(feature_name="contract_type", feature_type=FeatureTypeEnum.STRING),
    FeatureDefinition(feature_name="payment_method", feature_type=FeatureTypeEnum.STRING),
    FeatureDefinition(feature_name="num_support_tickets", feature_type=FeatureTypeEnum.INTEGRAL),
    FeatureDefinition(feature_name="avg_monthly_usage_gb", feature_type=FeatureTypeEnum.FRACTIONAL)
]

customer_feature_group.feature_definitions = customer_feature_definitions
customer_feature_group.create(
    s3_uri=f"s3://{session.default_bucket()}/feature-store/",
    record_identifier_name="customer_id",
    event_time_feature_name="event_time",
    role_arn=sagemaker.get_execution_role(),
    enable_online_store=True  # リアルタイム推論用
)

# フィーチャーの取り込み
df = pd.read_csv("customer_features.csv")
df["event_time"] = time.time()

customer_feature_group.ingest(data_frame=df, max_workers=3, wait=True)

# オンラインストアからの取得(リアルタイム)
record = featurestore_runtime_client.get_record(
    FeatureGroupName="customer-churn-features",
    RecordIdentifierValueAsString="CUST_12345"
)

# バッチ取得(推論パイプライン用)
batch_response = featurestore_runtime_client.batch_get_record(
    Identifiers=[
        {
            "FeatureGroupName": "customer-churn-features",
            "RecordIdentifiersValueAsString": ["CUST_001", "CUST_002", "CUST_003"]
        }
    ]
)
```text

### SageMaker Model Monitor 実装

```python
from sagemaker.model_monitor import DataCaptureConfig, DefaultModelMonitor
from sagemaker.model_monitor.dataset_format import DatasetFormat

# データキャプチャ設定(デプロイ時)
data_capture_config = DataCaptureConfig(
    enable_capture=True,
    sampling_percentage=20,  # 20%サンプリング
    destination_s3_uri=f"s3://{bucket}/data-capture/",
    capture_options=["REQUEST", "RESPONSE"],
    csv_content_types=["text/csv"],
    json_content_types=["application/json"]
)

# モデルデプロイ(データキャプチャ付き)
predictor = xgb_estimator.deploy(
    initial_instance_count=1,
    instance_type="ml.m5.xlarge",
    data_capture_config=data_capture_config,
    endpoint_name="churn-prediction-endpoint"
)

# ベースラインの計算
monitor = DefaultModelMonitor(
    role=role,
    instance_count=1,
    instance_type="ml.m5.xlarge",
    volume_size_in_gb=20,
    max_runtime_in_seconds=3600
)

monitor.suggest_baseline(
    baseline_dataset=f"s3://{bucket}/baseline-data/baseline.csv",
    dataset_format=DatasetFormat.csv(header=True),
    output_s3_uri=f"s3://{bucket}/baseline-results/",
    wait=True
)

# 監視スケジュール作成
from sagemaker.model_monitor import CronExpressionGenerator

monitor.create_monitoring_schedule(
    monitor_schedule_name="churn-model-monitor",
    endpoint_input=predictor.endpoint_name,
    output_s3_uri=f"s3://{bucket}/monitor-results/",
    statistics=monitor.baseline_statistics(),
    constraints=monitor.suggested_constraints(),
    schedule_cron_expression=CronExpressionGenerator.hourly(),
    enable_cloudwatch_metrics=True
)
```text

---

## 10. 追加模擬試験(20問)

**問題 1**
SageMaker で XGBoost モデルをトレーニングしています。過学習が発生しており、検証データのAUCがトレーニングデータより0.15低い状態です。最も適切な対処法は?

A. インスタンスタイプをより大きなものに変更する
B. early_stopping_roundsパラメータを設定し、eta(学習率)を下げる
C. トレーニングデータをさらに増やし、同じハイパーパラメータで再トレーニングする
D. モデルをより複雑にするため、max_depthを増やす

**答え: B**
**解説**: 過学習への対処として、early_stoppingで最適なイテレーション数を見つけ、etaを下げて正則化効果を高めるのが最適です。max_depth削減、min_child_weight増加、subsample/colsample削減も有効です。

---

**問題 2**
Amazon Rekognition Custom Labels で独自の画像分類モデルを構築しようとしています。トレーニングデータが50枚しかない場合の最善策は?

A. そのまま50枚でトレーニングする
B. 最低1000枚集めるまで待つ
C. データ拡張(水平反転・回転・明度調整)を適用して擬似的にデータ数を増やす
D. SageMaker 組み込みアルゴリズムに切り替える

**答え: C**
**解説**: Rekognition Custom Labels は少量データから始められますが、データ拡張で多様性を増やすと精度が向上します。Rekognition はAWSのベースモデルを転移学習するためデータ効率が高いです。

---

**問題 3**
時系列予測で Amazon Forecast を使用しています。休日や特売日などの外部要因を予測に組み込みたい場合、使用すべき機能は?

A. バックテスト評価
B. 関連時系列データ (Related Time Series)
C. 項目メタデータ (Item Metadata)
D. コールドスタート予測

**答え: B**
**解説**: 関連時系列データは外部要因(プロモーション、休日フラグ、価格変動など)を時系列として取り込めます。項目メタデータは静的な商品属性(カテゴリ、ブランドなど)に使用します。

---

**問題 4**
SageMaker Clarify で学習済みモデルのバイアスを分析しました。「年齢」特徴量でDPL(差異陽性率)が-0.35と表示されました。これは何を意味しますか?

A. 年齢が高いグループの方が陽性予測を受ける確率が35%高い
B. 年齢が低いグループ(不利グループ)が陽性予測を受ける確率が35%低い
C. モデルの精度が35%不足している
D. 年齢特徴量がモデルに35%の影響を与えている

**答え: B**
**解説**: DPL(差異陽性ラベル率)は有利グループと不利グループの陽性ラベル率の差です。負の値は不利グループ(例:若年者)が陽性予測(例:ローン承認)を受ける割合が低いことを示します。

---

**問題 5**
大量の非構造化テキストデータ(顧客レビュー100万件)から主要なトピックを自動的に抽出したい。コスト効率よく実装する方法は?

A. SageMaker で BERT モデルをファインチューニングする
B. Amazon Comprehend のトピックモデリングを使用する
C. SageMaker 組み込み LDA アルゴリズムを使用する
D. Amazon Kendra でインデックスを構築する

**答え: B**
**解説**: Amazon Comprehend のトピックモデリングはマネージドサービスで、LDA を内部で使用します。カスタムモデル不要でコスト効率が高く、100万件のテキストを非同期バッチジョブで処理できます。

---

**問題 6**
SageMaker Endpoint で低レイテンシ推論が必要です。モデルサイズが1.2GBあり、コールドスタートを回避したい場合、最適な設定は?

A. マルチモデルエンドポイント(MME)を使用する
B. サーバーレス推論を使用する
C. リアルタイム推論エンドポイントでプロビジョニド済みインスタンスを使用する
D. 非同期推論エンドポイントを使用する

**答え: C**
**解説**: 低レイテンシ要件にはリアルタイム推論エンドポイントが最適です。大きなモデル(1.2GB)はサーバーレスのメモリ上限(6GB)以内ですが、サーバーレスにはコールドスタートがあります。プロビジョニド済みインスタンスはコールドスタートなしで安定したレイテンシを提供します。

---

**問題 7**
画像分類タスクで SageMaker の組み込み Image Classification アルゴリズムを使用しています。少量のラベル済みデータ(500枚)で高精度を達成するための最良のアプローチは?

A. num_training_samplesを増やす
B. use_pretrained_modelを1に設定して転移学習を使用する
C. image_shapeをより大きな値に設定する
D. augmentation_typeを無効化する

**答え: B**
**解説**: use_pretrained_model=1を設定すると、ImageNetで事前学習されたResNetを転移学習のベースとして使用します。少量データでも高精度が期待でき、トレーニング時間も短縮されます。

---

**問題 8**
A/Bテストとして、2つのモデルバージョンにトラフィックを分割してオンラインで比較評価したい。SageMakerで実装する方法は?

A. 別々のエンドポイントを作成し、Route 53 で重み付きルーティングを設定する
B. Production Variants を使用してエンドポイントに複数モデルをデプロイし、initial_weight で比率を制御する
C. SageMaker Experiments で A/B テスト設定を作成する
D. マルチモデルエンドポイントを使用し、リクエストごとに呼び出すモデルを指定する

**答え: B**
**解説**: Production Variants はA/Bテスト専用機能です。1つのエンドポイントに複数モデルを登録し、initial_weightで比率(例:90/10)を設定します。CloudWatch メトリクスでバリアント別の精度・レイテンシを監視できます。

---

**問題 9**
SageMaker Model Monitor からアラームが発報されました。「FEATURE_ATTRIBUTION_DRIFT」という違反が検出されています。これは何を意味しますか?

A. 入力データの統計的分布がベースラインから変化した
B. モデルの予測精度が低下した
C. SHAP値で計算された特徴量の重要度がベースラインから変化した
D. エンドポイントのレイテンシが閾値を超えた

**答え: C**
**解説**: FEATURE_ATTRIBUTION_DRIFT は Model Explainability Monitor が検出する違反です。SHAP(SHapley Additive exPlanations)値を使って各特徴量の予測への寄与度を計算し、本番環境の値がベースラインと乖離した場合に発報します。データドリフトと異なり、特徴量の影響力の変化を捉えます。

---

**問題 10**
顧客行動データを使って推薦システムを構築します。新規顧客(購買履歴なし)への推薦と既存顧客への推薦を両方サポートする必要があります。最適なアプローチは?

A. SageMaker 組み込み Factorization Machines アルゴリズムのみ使用する
B. Amazon Personalize でコールドスタート対応のレシピを使用する
C. 新規顧客には協調フィルタリング、既存顧客にはコンテンツベースを使い分ける
D. 新規顧客には人気商品ランキングのみ返す

**答え: B**
**解説**: Amazon Personalize はコールドスタート問題を組み込みで解決します。aws-user-personalization レシピは既存ユーザーへの協調フィルタリングと新規ユーザーへのコンテンツベース推薦を自動的に切り替えます。

---

**問題 11**
SageMaker で深層学習モデルのデバッグを行っています。トレーニング中にグラデーション消失問題が発生していると疑われます。使用すべきツールは?

A. SageMaker Experiments でハイパーパラメータを記録する
B. SageMaker Debugger の VanishingGradient ルールを有効化する
C. CloudWatch メトリクスでトレーニング損失を監視する
D. SageMaker Clarify でモデルを分析する

**答え: B**
**解説**: SageMaker Debugger は組み込みルールを提供します。VanishingGradient ルールはトレーニング中の勾配テンソルを分析し、消失(vanishing)や爆発(exploding)グラデントを自動検出します。トレーニングを中断せずにリアルタイムで診断できます。

---

**問題 12**
機械学習モデルの推論コストを削減したい。現在ml.c5.2xlargeで24時間稼働していますが、リクエストは1日2000件程度です。最も費用対効果の高い選択肢は?

A. ml.c5.xlargeに変更してコストを半減させる
B. Spot インスタンスを使用する
C. SageMaker Serverless Inference に移行する
D. Multi-Model Endpoint に変更する

**答え: C**
**解説**: 1日2000件(1時間83件)のような低頻度アクセスはサーバーレス推論が最適です。リクエスト時のみ課金でアイドル時間のコストがなく、大幅なコスト削減が可能です。ただしコールドスタートには注意が必要です。

---

**問題 13**
医療診断AIシステムを構築しており、モデルの予測根拠を医師に説明する必要があります。CT画像のどの部分が診断に影響したかを視覚化する技術は?

A. SHAP(SHapley Additive exPlanations)
B. LIME(Local Interpretable Model-agnostic Explanations)
C. Grad-CAM(Gradient-weighted Class Activation Mapping)
D. Permutation Importance

**答え: C**
**解説**: Grad-CAM は畳み込みニューラルネットワーク(CNN)の特定クラスへの勾配を使って、入力画像のどの領域が予測に寄与したかをヒートマップで視覚化します。医療画像診断の説明可能性AIとして広く使用されています。

---

**問題 14**
Amazon SageMaker Neo を使用してモデルを最適化しました。期待されるメリットは?

A. モデルの精度が向上する
B. トレーニング時間が短縮される
C. デプロイ先のハードウェア(CPU/GPU/Edge)に最適化され、推論速度が向上しメモリ使用量が削減される
D. 自動的にハイパーパラメータが最適化される

**答え: C**
**解説**: SageMaker Neo はモデルを特定のハードウェアターゲット(ARM, Intel, NVIDIA, Inferentia など)向けにコンパイル・最適化します。最大2倍の推論速度向上と最大1/10のモデルサイズ削減が可能です。精度への影響は最小限です。

---

**問題 15**
テキスト生成タスクで評価指標を選択しています。生成テキストと参照テキストの意味的類似性を測定したい場合、最適な指標は?

A. BLEU スコア
B. ROUGE-L
C. パープレキシティ
D. BERTScore

**答え: D**
**解説**: BERTScore は事前学習済みBERTモデルを使って生成テキストと参照テキストのトークン埋め込みのコサイン類似度を計算します。意味的な類似性を捉えられる点でBLEU(n-gram一致)やROUGE(部分文字列一致)より優れています。

---

**問題 16**
MLOps パイプラインで CI/CD を実装しています。SageMaker Pipelines と AWS CodePipeline を統合する正しいアーキテクチャは?

A. CodePipeline から直接SageMakerエンドポイントにデプロイする
B. CodePipeline → Lambda(パイプライン起動)→ SageMaker Pipelines(学習・評価)→ Lambda(承認確認)→ EventBridge → CodePipeline(デプロイステージ)
C. SageMaker Pipelines 内でCodeDeployを呼び出す
D. GitHub Actions からSageMaker Pipelinesを直接呼び出す

**答え: B**
**解説**: ベストプラクティスの統合パターンです。CodePipeline でソースコード変更をトリガーし、Lambdaで SageMaker Pipelines を実行、完了後に精度チェックと手動承認を経て本番デプロイを行います。EventBridge で SageMaker の状態変化を監視してCodePipelineに通知します。

---

**問題 17**
SageMaker Autopilot でAutoMLを実行しました。生成されたモデルの仕組みを理解したい場合のアプローチは?

A. Autopilot は説明不可能なブラックボックスモデルを生成する
B. 生成されたノートブック(Data Exploration・Candidate Definition)を確認し、使用されたアルゴリズムとハイパーパラメータを調べる
C. SageMaker Clarify でのみ確認できる
D. AWS サポートに問い合わせる

**答え: B**
**解説**: SageMaker Autopilot は完全な透明性を提供します。実行後にData ExplorationノートブックとCandidate Definitionノートブックが生成され、前処理パイプライン、使用アルゴリズム(線形モデル/XGBoost/深層学習など)、ハイパーパラメータを完全に確認・カスタマイズできます。

---

**問題 18**
本番環境のSageMakerエンドポイントへのアクセスを特定のVPC内のアプリケーションのみに制限したい。実装方法は?

A. エンドポイントにセキュリティグループを設定する
B. VPCエンドポイント(Interface Endpoint)を作成し、エンドポイントポリシーでアクセスを制限する
C. WAFをSageMakerエンドポイントの前に配置する
D. IPホワイトリストをSageMakerエンドポイントのリソースポリシーに設定する

**答え: B**
**解説**: SageMaker VPCエンドポイント(com.amazonaws.region.sagemaker.runtime)を作成することでインターネットを経由せずVPC内からエンドポイントを呼び出せます。エンドポイントポリシーで特定のIAMプリンシパルやVPCのみにアクセスを制限します。

---

**問題 19**
SageMaker Ground Truth でラベリングジョブを設定しています。高品質なラベルを効率的に収集するための機能は?

A. クラウドソーシングのみを使用する
B. 自動ラベリングのみを使用する
C. Automated Data Labeling(機械学習支援ラベリング)を有効化し、信頼度が高いサンプルは自動ラベリング、不確実なサンプルのみ人間がレビューする
D. すべてのサンプルを専門家に依頼する

**答え: C**
**解説**: Ground Truth の自動ラベリング機能はアクティブラーニングを使用します。初期のラベル済みデータでモデルを学習し、信頼度スコアが閾値以上のサンプルは自動ラベリング、不確実なサンプルのみ人間(Amazon Mechanical Turk/専門家)に送ります。ラベリングコストを最大70%削減できます。

---

**問題 20**
MLflowを使って実験管理を行っていますが、SageMakerへの移行を検討しています。MLflow とSageMaker の統合方法は?

A. MLflow はSageMakerと統合できない
B. SageMaker MLflow Tracking Server を使用し、既存の MLflow コードを変更せずにSageMaker上で実行できる
C. SageMaker Experiments API に完全に書き直す必要がある
D. MLflow モデルレジストリをSageMakerモデルレジストリに手動でコピーする

**答え: B**
**解説**: SageMaker はマネージド MLflow Tracking Server を提供します。既存の `mlflow.set_tracking_uri()` を SageMaker のトラッキングサーバーURIに変更するだけで、実験メトリクス・パラメータ・アーティファクトをSageMaker上のMLflowに記録できます。コードの大幅な変更は不要です。

---

## 11. MLS試験 最終チェックリスト

### ドメイン別重要ポイント

#### データエンジニアリング (Domain 1: 24%)
- [ ] SageMaker Data Wrangler: データ変換・可視化・品質確認
- [ ] Glue DataBrew: ノーコードデータ前処理
- [ ] Feature Store: Online(低レイテンシ)/ Offline(バッチ)の違い
- [ ] S3 + Athena: 大規模データレイク構築
- [ ] Kinesis Data Streams: リアルタイムデータ取り込み
- [ ] カテゴリ変数: One-Hot Encoding vs Ordinal Encoding の使い分け
- [ ] 欠損値処理: 削除 / 平均補完 / 最頻値 / KNN補完 / モデルベース補完

#### 探索的データ分析 (Domain 2: 36%)
- [ ] 相関分析: ピアソン(線形)、スピアマン(順序)、ポイント二列(二値vs連続)
- [ ] 特徴量エンジニアリング: 正規化・標準化・対数変換・ビニング
- [ ] 不均衡データ: SMOTE(オーバーサンプリング)、クラス重み付け
- [ ] 次元削減: PCA(線形)、t-SNE(非線形可視化)、UMAP
- [ ] 外れ値検出: IQR法、Z-score、Isolation Forest、RCF

#### モデリング (Domain 3: 36%)
- [ ] アルゴリズム選択:
  - 分類: XGBoost、Linear Learner、KNN、Image Classification
  - 回帰: XGBoost、Linear Learner
  - クラスタリング: K-Means、LDA(トピック)
  - 異常検知: RCF(Random Cut Forest)、IP Insights
  - 時系列: DeepAR、Forecast
  - 推薦: Factorization Machines、Personalize
  - NLP: BlazingText(Word2Vec)、Sequence to Sequence
  - 画像: Image Classification(ResNet)、Object Detection(SSD/YOLO)
- [ ] 過学習対策: ドロップアウト・L1/L2正則化・early stopping・cross-validation
- [ ] ハイパーパラメータ最適化: SageMaker Automatic Model Tuning(Bayesian最適化)

#### 実装・運用 (Domain 4: 4% → ただし出題あり)
- [ ] SageMaker Pipelines: 再現可能なML ワークフロー
- [ ] Model Monitor: データドリフト、モデル品質、バイアス、説明可能性
- [ ] A/B テスト: Production Variants
- [ ] Blue/Green デプロイ: canary / all-at-once
- [ ] SageMaker Neo: エッジ最適化
- [ ] Serverless Inference: 低頻度アクセス
- [ ] Multi-Model Endpoint: 多数の類似モデル

### よく出るAWSサービス対応表

| ユースケース | AWS サービス |
|---|---|
| 画像分類・物体検出 | SageMaker Image Classification / Rekognition Custom Labels |
| テキスト分類・感情分析 | Comprehend / BlazingText |
| 翻訳 | Translate |
| 音声認識 | Transcribe |
| テキスト読み上げ | Polly |
| 異常検知 | SageMaker RCF / Lookout for Metrics |
| 需要予測 | Forecast / DeepAR |
| 推薦システム | Personalize / Factorization Machines |
| 文書検索 | Kendra |
| 会話AI | Lex |
| コード生成 | CodeWhisperer / Bedrock |
| トピックモデリング | Comprehend / LDA |
| 不正検出 | Fraud Detector / IP Insights |

---

*MLS-C01 完全学習ガイド(拡張版)完了。SageMaker Pipelines・Feature Store・Model Monitor の実装パターンと追加模擬試験20問を収録しました。*