APIを使ってアプリケーションを構築するとき、突然の利用者増加に備えて「どれだけの容量を確保すればいいか?」という問題を抱えた経験はないでしょうか?特にClaude APIのような高性能なAIサービスを運用している場合、適切な容量計画はコスト最適化とサービス品質の両面で重要です。
本記事では、機械学習を使ってClaude APIの呼び出し量を予測し、効率的な容量計画を実現する方法について、プログラミング経験が全くない完全な初心者でも理解できるように丁寧に解説します。
なぜ容量計画に機械学習が必要なのか
従来の容量計画では、直近の使用量に一定の成長率を掛けるだけという簡易的な方法が主流でした。しかし、この方法には大きな欠点があります。
- 突発的なトラフィック増加に対応できない — SNSでバズった、夜間に一括処理が走るなどの予期せぬパターンに対応できません
- 過度なリソース確保でコストが膨らむ — 常に最大負荷を前提に調達するため、资源の無駄が発生します
- 需要の季節性や曜日パターンを考慮できない — 平日と週末、平旦と夜間では使用パターンが全く異なります
機械学習ベースの予測モデルは、これらのパターンを自動的に学習し、より精度の高い容量計画を可能にします。
予測モデルの構築:ステップバイステップ
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