APIを使ってアプリケーションを構築するとき、突然の利用者増加に備えて「どれだけの容量を確保すればいいか?」という問題を抱えた経験はないでしょうか?特にClaude APIのような高性能なAIサービスを運用している場合、適切な容量計画はコスト最適化とサービス品質の両面で重要です。

本記事では、機械学習を使ってClaude APIの呼び出し量を予測し、効率的な容量計画を実現する方法について、プログラミング経験が全くない完全な初心者でも理解できるように丁寧に解説します。

なぜ容量計画に機械学習が必要なのか

従来の容量計画では、直近の使用量に一定の成長率を掛けるだけという簡易的な方法が主流でした。しかし、この方法には大きな欠点があります。

機械学習ベースの予測モデルは、これらのパターンを自動的に学習し、より精度の高い容量計画を可能にします。

予測モデルの構築:ステップバイステップ

Step 1:必要なライブラリのインストール

まずは予測モデルを構築するために必要なPythonライブラリをインストールしましょう。初心者の方も、このコマンドをコピーしてターミナルで実行するだけで準備が完了します。

# 必要なライブラリのインストール
pip install pandas numpy scikit-learn prophet requests

動作確認

python -c "import pandas; import numpy; import sklearn; print('環境構築完了')"

Step 2:API使用履歴の収集

HolySheep AIでは、APIダッシュボードから使用量の詳細データを取得できます。まずはHolySheepのAPIを呼び出して、過去の呼び出し量データを収集するスクリプトを作成しましょう。

💡 スクリーンショットポイント: HolySheepダッシュボードの「使用履歴」タブでは、日別・時間別のAPI呼び出し回数とトークン消費量を確認できます。エクスポート機能を使ってCSV形式でダウンロードすることも可能です。

import requests
import pandas as pd
from datetime import datetime, timedelta

HolySheep API設定

BASE_URL = "https://api.holysheep.ai/v1" API_KEY = "YOUR_HOLYSHEEP_API_KEY" def fetch_api_usage(days=90): """ HolySheep APIから過去の利用履歴を取得 """ headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # 使用量サマリーを取得 response = requests.get( f"{BASE_URL}/usage/summary", headers=headers, params={"period": "daily", "days": days} ) if response.status_code == 200: data = response.json() return pd.DataFrame(data.get("daily_usage", [])) else: print(f"エラー: ステータスコード {response.status_code}") print(f"詳細: {response.text}") return None

過去90日分のデータを取得

usage_df = fetch_api_usage(90) if usage_df is not None: print(f"取得レコード数: {len(usage_df)}") print(usage_df.head())

Step 3:特徴量エンジニアリング

機械学習モデルが正確に予測するために、データから有用な特徴を抽出します。初心者の方は「特徴量エンジニアリング」という言葉が難しいかもしれませんが、要は「予測に有用的な情報をデータから作ること」です。

import pandas as pd
import numpy as np

def create_features(df):
    """
    予測用の特徴量を生成
    """
    df = df.copy()
    
    # 日付から特徴量を抽出
    df['date'] = pd.to_datetime(df['date'])
    df['day_of_week'] = df['date'].dt.dayofweek  # 曜日 (0=月〜6=日)
    df['day_of_month'] = df['date'].dt.day       # 月の何日か
    df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)  # 週末フラグ
    df['is_month_start'] = df['date'].dt.is_month_start.astype(int)
    df['is_month_end'] = df['date'].dt.is_month_end.astype(int)
    
    # 移動平均特徴量(トレンド把握)
    df['rolling_7d_avg'] = df['api_calls'].rolling(window=7, min_periods=1).mean()
    df['rolling_30d_avg'] = df['api_calls'].rolling(window=30, min_periods=1).mean()
    
    # 前週同曜日の値(曜日パターン捕捉)
    df['same_day_last_week'] = df['api_calls'].shift(7)
    
    # 成長率
    df['growth_rate'] = df['api_calls'].pct_change()
    df['growth_rate_7d'] = df['api_calls'].pct_change(7)
    
    return df.fillna(0)

特徴量作成の適用

enhanced_df = create_features(usage_df) print("特徴量リスト:") print(enhanced_df.columns.tolist())

Step 4:予測モデルの訓練と評価

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np

def train_prediction_model(df, target_col='api_calls'):
    """
    ランダムフォレストで呼び出し量予測モデルを作成
    """
    # 特徴量とターゲットの定義
    feature_cols = [
        'day_of_week', 'day_of_month', 'is_weekend',
        'is_month_start', 'is_month_end',
        'rolling_7d_avg', 'rolling_30d_avg',
        'same_day_last_week', 'growth_rate_7d'
    ]
    
    X = df[feature_cols]
    y = df[target_col]
    
    # 訓練データとテストデータに分割
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42, shuffle=False
    )
    
    # モデルの訓練
    model = RandomForestRegressor(
        n_estimators=100,
        max_depth=10,
        random_state=42,
        n_jobs=-1
    )
    model.fit(X_train, y_train)
    
    # 予測と評価
    y_pred = model.predict(X_test)
    mae = mean_absolute_error(y_test, y_pred)
    rmse = np.sqrt(mean_squared_error(y_test, y_pred))
    
    print(f"平均絶対誤差 (MAE): {mae:.2f} 呼び出し")
    print(f"二乗平均平方根誤差 (RMSE): {rmse:.2f} 呼び出し")
    print(f"正解率 (MAPE): {np.mean(np.abs((y_test - y_pred) / y_test)) * 100:.2f}%")
    
    # 特徴量の重要度を表示
    importance = pd.DataFrame({
        'feature': feature_cols,
        'importance': model.feature_importances_
    }).sort_values('importance', ascending