machine-learning について
PyTorch と scikit-learn を使って再現可能な機械学習パイプラインを構築するスキルです。モデル選択、評価、チューニング、解釈性、実験管理を扱い、ノートブックの試行を体系的なワークフローに整える用途に向いています。
主な機能
- 01PyTorch と scikit-learn のパイプライン構築
- 02訓練・検証・テストデータの分割
- 03Optuna によるハイパーパラメータ調整
- 04交差検証によるモデル評価
- 05SHAP と特徴量重要度による予測の説明
- 06実験設定、指標、成果物の記録
活用シーン
- 01分類モデルと回帰モデルの開発
- 02交差検証によるモデル比較
- 03モデルのハイパーパラメータの体系的な調整
- 04研究や重要な業務での予測根拠の説明
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itallstartedwithaidea/ agent-skills --skill machine-learningインストール後、Claude Code で/machine-learningを入力して読み込まれたか確認します。
詳細
機械学習
googleadsagent.ai™ による Agent Skills™ の一部です
説明
Machine Learning は、PyTorch と scikit-learn を使用したエンドツーエンドの ML パイプライン構築を提供し、モデル選択、トレーニング、評価、解釈可能性、ハイパーパラメーター調整、実験トラッキングを網羅します。エージェントは、バージョン管理された実験、決定論的なトレーニング、解釈可能な結果といったソフトウェアエンジニアリングのベストプラクティスに従う、再現可能な ML ワークフローを構築します。
動作するノートブックと本番環境用の ML パイプラインとの間には、大きな隔たりがあります。このスキルは、構造化された実験管理、適切なトレーニング/検証/テスト分割、層化交差検証、学習曲線分析、体系的なハイパーパラメーター最適化を徹底することで、その隔たりを埋めます。エージェントは、各実験の設定、メトリクス、成果物をすべて追跡するため、数カ月後でもあらゆる結果を再現できます。
モデルの解釈可能性は、任意の事後分析ではなく、最優先の要件として扱われます。すべてのモデルには、モデルが何を学習し、なぜ特定の予測を行うのかを説明する SHAP 値、特徴量重要度ランキング、部分依存プロットが付属します。説明のないブラックボックス予測では、科学的用途やビジネス上重要な用途には不十分です。
使用する場面
- 分類モデルまたは回帰モデルを構築する場合
- ハイパーパラメーターを体系的に調整する場合
- SHAP または特徴量重要度を使ってモデルの予測を説明する場合
- ML プロジェクトの実験トラッキングを設定する場合
- 適切な交差検証を使ってモデルの性能を評価する場合
- 構造化されたトレーニングループで PyTorch モデルをトレーニングする場合
仕組み
graph TD
A[Dataset] --> B[Train/Val/Test Split]
B --> C[Feature Engineering]
C --> D[Model Selection]
D --> E[Hyperparameter Tuning: Optuna]
E --> F[Cross-Validation]
F --> G[Best Model Training]
G --> H[Evaluation on Test Set]
H --> I[Interpretability: SHAP]
I --> J[Experiment Logging]
J --> K[Model Registry]
このパイプラインでは、調整(検証データを使用)と最終評価(保留したテストデータを使用)を厳密に分離します。情報漏洩を防ぐため、テストセットは厳密に一度だけ使用します。
実装
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import classification_report, roc_auc_score
import optuna
import shap
import numpy as np
class Classifier(nn.Module):
def __init__(self, input_dim: int, hidden_dim: int, dropout: float):
super().__init__()
self.net = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(hidden_dim, hidden_dim // 2),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(hidden_dim // 2, 1),
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.net(x)
def train_epoch(model, loader, optimizer, criterion, device):
model.train()
total_loss = 0
for X_batch, y_batch in loader:
X_batch, y_batch = X_batch.to(device), y_batch.to(device)
optimizer.zero_grad()
pred = model(X_batch).squeeze()
loss = criterion(pred, y_batch.float())
loss.backward()
optimizer.step()
total_loss += loss.item() * len(X_batch)
return total_loss / len(loader.dataset)
def hyperparameter_search(X: np.ndarray, y: np.ndarray, n_trials: int = 50) -> dict:
def objective(trial):
hidden = trial.suggest_int("hidden_dim", 32, 256)
lr = trial.suggest_float("lr", 1e-4, 1e-2, log=True)
dropout = trial.suggest_float("dropout", 0.1, 0.5)
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = []
for train_idx, val_idx in skf.split(X, y):
model = Classifier(X.shape[1], hidden, dropout)
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
criterion = nn.BCEWithLogitsLoss()
train_ds = TensorDataset(torch.tensor(X[train_idx], dtype=torch.float32),
torch.tensor(y[train_idx], dtype=torch.float32))
loader = DataLoader(train_ds, batch_size=64, shuffle=True)
for _ in range(20):
train_epoch(model, loader, optimizer, criterion, "cpu")
model.eval()
with torch.no_grad():
val_pred = model(torch.tensor(X[val_idx], dtype=torch.float32)).squeeze()
scores.append(roc_auc_score(y[val_idx], val_pred.numpy()))
return np.mean(scores)
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=n_trials)
return study.best_params
def explain_model(model, X_sample: np.ndarray, feature_names: list[str]):
model.eval()
explainer = shap.DeepExplainer(model, torch.tensor(X_sample[:100], dtype=torch.float32))
shap_values = explainer.shap_values(torch.tensor(X_sample, dtype=torch.float32))
shap.summary_plot(shap_values, X_sample, feature_names=feature_names, show=False)
ベストプラクティス
- 再現性を確保するため、numpy、torch、Python の random モジュールの乱数シードを設定します
- クラス分布を維持するため、分類では層化分割を使用します
- テストセットは厳密に一度だけ使用します。テストデータでハイパーパラメーターを調整してはいけません
- 単一実行のメトリクスではなく、交差検証による信頼区間を報告します
- ベースラインを超えるすべてのモデルに SHAP または順列重要度を含めます
- 再現性のため、すべての実験パラメーター、メトリクス、成果物を記録します
プラットフォームの互換性
| プラットフォーム | サポート | 備考 |
|---|---|---|
| Cursor | フル | Python + PyTorch + Jupyter |
| VS Code | フル | ML 拡張機能のエコシステム |
| Windsurf | フル | ML ワークフローをサポート |
| Claude Code | フル | トレーニングスクリプトの生成 |
| Cline | フル | ML パイプラインの構築 |
| aider | 部分的 | コード生成のみ |
関連スキル
キーワード
machine-learning pytorch scikit-learn hyperparameter-tuning optuna shap interpretability experiment-tracking cross-validation
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License