mcpField
M
machine-learning

machine-learning

github.com/itallstartedwithaidea数据与数据库4489 次安装29 周前更新
代码仓库

关于 machine-learning

使用 PyTorch 和 scikit-learn 构建可复现机器学习流程的技能,涵盖模型选择、评估、调优、可解释性和实验跟踪,适合将笔记本实验整理为规范工作流的从业者。

主要功能

  1. 01构建 PyTorch 和 scikit-learn 流程
  2. 02划分训练、验证和测试集
  3. 03使用 Optuna 调优超参数
  4. 04通过交叉验证评估模型
  5. 05使用 SHAP 和特征重要性解释预测
  6. 06跟踪实验配置、指标和产物

适用场景

  1. 01开发分类和回归模型
  2. 02通过交叉验证比较模型
  3. 03系统地调优模型超参数
  4. 04为科研或关键业务解释预测结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill machine-learning

安装后在 Claude Code 中输入/machine-learning确认已加载。

详细介绍

机器学习

Agent Skills™ 的一部分,由 googleadsagent.ai™ 提供

描述

机器学习通过 PyTorch 和 scikit-learn 提供端到端的 ML 流水线构建,涵盖模型选择、训练、评估、可解释性、超参数调优和实验跟踪。Agent 构建可复现的 ML 工作流,并遵循软件工程最佳实践:实验版本控制、确定性训练和结果可解释。

从可运行的笔记本到生产级 ML 流水线,差距巨大。这项技能通过强制执行结构化实验管理、恰当的训练集/验证集/测试集划分、分层交叉验证、学习曲线分析和系统化超参数优化,弥合这一差距。Agent 会跟踪每项实验的配置、指标和产物,使任何结果都能在数月后复现。

模型可解释性被视为首要要求,而非可有可无的事后分析。每个模型都附带 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

评论

支持 Markdown