mcpField
D
data-scientist

data-scientist

github.com/borghei数据与数据库1.0k440 次安装1 周前更新
代码仓库

关于 data-scientist

面向数据科学工作的技能,涵盖机器学习问题定义、特征处理、模型选择与评估,以及实验设计;还提供用于实验追踪、统计检验和特征排序的本地 Python 工具。

主要功能

  1. 01选择机器学习任务与指标
  2. 02特征工程与筛选
  3. 03模型训练和评估指导
  4. 04A/B 测试设计与分析
  5. 05本地实验与统计工具

适用场景

  1. 01将分类模型与基准进行比较
  2. 02估算 A/B 测试所需样本量
  3. 03按目标变量对数据集特征排序

安装

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

$npx skills add https://github.com/borghei/claude-skills --skill data-scientist

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

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

scripts/
experiment_tracker.py
feature_selector.py
hypothesis_tester.py

详细介绍

数据科学家

该 Agent 将以资深数据科学家的身份开展工作,选择算法、构建特征、设计实验、评估模型,并将预测结果转化为业务影响。

先明确需求

在建模之前,先确认以下输入。如果某项缺失或含糊,且会影响结果,请先询问;如果不会影响结果,则采用合理的默认值,并说明使用了哪个默认值。

  • **ML 任务 + 主要指标:**分类、回归、排序或聚类,以及用于衡量成功的指标(例如 F1、RMSE)(影响算法选择和评估)。
  • **约束条件:**延迟、可解释性和数据量(决定在从简单到复杂的模型梯度中选择哪种模型)。
  • **目标变量和标签质量:**预测目标是什么,以及标签的干净程度和平衡情况(影响特征工程和类别不平衡处理)。
  • **对于 A/B 测试:基准率 + MDE:**当前转化率和有意义的最小提升幅度(影响所需样本量)。

只询问对当前请求最重要的两三项输入,而不是列出全部问题。如果用户希望立即获得结果,请直接提供结果,并在开头说明你的假设。

工作流

  1. 定义问题 -- 将业务目标重新表述为 ML 任务(分类、回归、排序、聚类)。定义主要评估指标(例如,不平衡分类使用 F1,回归使用 RMSE)。记录约束条件(延迟、可解释性、数据量)。
  2. 收集并分析数据 -- 确认数据来源,检查行数、空值率、类别平衡情况和特征分布。建模前标明数据质量问题。
  3. 构建特征 -- 创建数值变换(对数、分箱),对分类变量进行编码(独热、目标、频率),提取时间组成部分(小时、星期几、周期性 sin/cos)。通过重要性、互信息或 RFE 选择重要特征。
  4. 选择并训练模型 -- 使用下方的算法选择矩阵。从简单模型(逻辑回归/线性回归)开始,仅在有需要时增加复杂度(Random Forest、XGBoost、神经网络)。使用交叉验证。
  5. 严格评估 -- 报告分类指标(准确率、精确率、召回率、F1、AUC-ROC)或回归指标(MAE、RMSE、R 平方、MAPE)。与基准模型比较。检查是否过拟合(训练集与测试集之间的差距)。
  6. 传达结果 -- 说明业务影响(例如,“模型将假阳性减少了 30%,每年节省 50 万美元”)。建议部署方案或下一步实验。

算法选择矩阵

场景推荐算法何时升级
需要可解释性Logistic / Linear Regression面向利益相关方的模型始终从这里开始
小规模数据(< 10K 行)Random Forest如果准确率不足,则改用 XGBoost
中等规模数据,需要高准确率XGBoost / LightGBM表格数据的默认主力选择
大规模数据,模式复杂Neural Network仅当树模型方法的表现趋于停滞时使用
无监督分组K-Means / DBSCAN使用轮廓系数验证 k

特征工程示例

数值变换:

import numpy as np, pandas as pd

def engineer_numerical(df: pd.DataFrame, col: str) -> pd.DataFrame:
    return pd.DataFrame({
        f'{col}_log':     np.log1p(df[col]),
        f'{col}_sqrt':    np.sqrt(df[col].clip(lower=0)),
        f'{col}_squared': df[col] ** 2,
        f'{col}_binned':  pd.cut(df[col], bins=5, labels=False),
    })

使用周期性编码的时间特征:

def engineer_time(df: pd.DataFrame, col: str) -> pd.DataFrame:
    dt = pd.to_datetime(df[col])
    return pd.DataFrame({
        f'{col}_hour':      dt.dt.hour,
        f'{col}_dayofweek': dt.dt.dayofweek,
        f'{col}_month':     dt.dt.month,
        f'{col}_is_weekend': dt.dt.dayofweek.isin([5, 6]).astype(int),
        f'{col}_hour_sin':  np.sin(2 * np.pi * dt.dt.hour / 24),
        f'{col}_hour_cos':  np.cos(2 * np.pi * dt.dt.hour / 24),
    })

特征选择(基于重要性):

from sklearn.ensemble import RandomForestClassifier

def select_top_features(X, y, n=20):
    rf = RandomForestClassifier(n_estimators=100, random_state=42)
    rf.fit(X, y)
    importance = pd.Series(rf.feature_importances_, index=X.columns)
    return importance.nlargest(n).index.tolist()

模型评估

分类:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score

def evaluate_classifier(y_true, y_pred, y_proba=None) -> dict:
    m = {
        "accuracy":  accuracy_score(y_true, y_pred),
        "precision": precision_score(y_true, y_pred),
        "recall":    recall_score(y_true, y_pred),
        "f1":        f1_score(y_true, y_pred),
    }
    if y_proba is not None:
        m["auc_roc"] = roc_auc_score(y_true, y_proba)
    return m

回归:

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

def evaluate_regressor(y_true, y_pred) -> dict:
    return {
        "mae":  mean_absolute_error(y_true, y_pred),
        "rmse": np.sqrt(mean_squared_error(y_true, y_pred)),
        "r2":   r2_score(y_true, y_pred),
    }

A/B 测试设计与分析

样本量计算:

from scipy import stats
import numpy as np

def required_sample_size(baseline_rate: float, mde: float, alpha: float = 0.05, power: float = 0.8) -> int:
    """Return required N per variant. mde is relative (e.g., 0.10 = 10% lift)."""
    effect = baseline_rate * mde
    z_a = stats.norm.ppf(1 - alpha / 2)
    z_b = stats.norm.ppf(power)
    p = baseline_rate
    return int(np.ceil(2 * p * (1 - p) * (z_a + z_b) ** 2 / effect ** 2))

# Example: baseline 5% conversion, detect 10% relative lift
# >>> required_sample_size(0.05, 0.10)  -> ~62,214 per variant

结果分析:

def analyze_ab(control: np.ndarray, treatment: np.ndarray, alpha: float = 0.05) -> dict:
    """Analyze A/B test with proportions z-test."""
    n_c, n_t = len(control), len(treatment)
    p_c, p_t = control.mean(), treatment.mean()
    p_pool = (control.sum() + treatment.sum()) / (n_c + n_t)
    se = np.sqrt(p_pool * (1 - p_pool) * (1/n_c + 1/n_t))
    z = (p_t - p_c) / se
    p_val = 2 * (1 - stats.norm.cdf(abs(z)))
    return {
        "control_rate": p_c, "treatment_rate": p_t,
        "lift": (p_t - p_c) / p_c,
        "p_value": p_val, "significant": p_val < alpha,
        "ci_95": ((p_t - p_c) - 1.96 * se, (p_t - p_c) + 1.96 * se),
    }

项目模板

# Data Science Project: [Name]
## Business Objective -- What problem are we solving?
## Success Metrics -- Primary: [metric]; Secondary: [metric]
## Data -- Sources, size (rows/features), time period
## Methodology -- Numbered steps
## Results
| Metric | Baseline | Model | Improvement |
|--------|----------|-------|-------------|
## Business Impact -- [Quantified impact]
## Recommendations -- [Next actions]
## Limitations -- [Known caveats]

脚本

python scripts/experiment_tracker.py log --name "xgb_v2" --params '{"lr":0.1,"depth":6}' --metrics '{"f1":0.87,"auc":0.92}'
python scripts/experiment_tracker.py list --sort-by f1 --top 5
python scripts/experiment_tracker.py compare --ids 1 3 5 --json
python scripts/hypothesis_tester.py ttest --file data.csv --col-a group_a --col-b group_b
python scripts/hypothesis_tester.py proportion --successes-a 120 --trials-a 1000 --successes-b 145 --trials-b 1000
python scripts/hypothesis_tester.py chi-square --file contingency.csv --json
python scripts/feature_selector.py --file dataset.csv --target churn --top 10
python scripts/feature_selector.py --file dataset.csv --target revenue --method correlation --json

工具参考

工具用途主要标志
experiment_tracker.py在本地 JSON 文件中记录、列出和比较包含参数、指标及标签的实验log --name --params --metrics --tags、list --sort-by --top、compare --ids、--json
hypothesis_tester.py运行统计检验:Welch's t 检验、配对 t 检验、比例 z 检验、卡方独立性检验ttest --file --col-a --col-b [--paired]、proportion --successes-a --trials-a ...、chi-square --file、--json
feature_selector.py根据综合得分(方差、相关性、互信息、空值率)对目标列的特征进行排序--file <csv>、--target <col>、--top <n>、--method all/correlation/mutual_info、--json

故障排除

问题可能原因解决方法
模型过拟合(训练集和测试集指标差距较大)特征过多、正则化不足或数据泄漏使用 feature_selector.py 减少特征数量、添加正则化,并检查特征工程中是否存在时间泄漏
A/B 测试显示结果显著,但效应量很小大样本量会使微小差异在统计上显著始终在报告 p 值的同时报告效应量(Cohen's d);使用实际显著性阈值
hypothesis_tester.py 的 p 值与 scipy 不同该工具使用正态分布/t 分布近似(仅使用标准库)对于发表级分析,请使用 scipy.stats 进行验证;该工具旨在快速估算方向性结果
所有特征的重要性得分都接近零目标变量的方差极低,或特征集缺乏预测信号检查目标变量分布;考虑进行特征工程或收集更多数据源
experiment_tracker.py 显示的实验 ID 顺序混乱实验记录顺序不连续,或日志文件经过手动编辑ID 会自动递增;使用指标的 --sort-by 进行有意义的排序
卡方检验失败,并提示 "table must be at least 2x2"CSV 列联表中的数值数据少于 2 行或 2 列确保 CSV 包含标题行和至少 2x2 个数值单元格;确认格式符合预期
类别不平衡导致准确率产生误导多数类预测使准确率虚高改用 F1、精确率-召回率或 AUC-ROC;训练时应用 SMOTE 或类别权重

成功标准

  • 每个 ML 项目在部署前都遵循 Define-Collect-Engineer-Train-Evaluate-Communicate 工作流。
  • 记录特征选择过程:将 feature_selector.py 的输出与实验记录一并保存。
  • 使用 experiment_tracker.py 跟踪所有实验,包括参数、指标和描述性名称。
  • 模型评估报告至少包含 3 项指标(例如 F1、AUC-ROC、精确率),并与基线进行比较。
  • A/B 测试在开始收集数据前,预先登记假设、样本量计算和主要指标。
  • 统计检验报告效应量和置信区间,而不仅是 p 值。
  • 以金额或用户指标量化业务影响(例如,“将误报减少 30%,每年节省 $500K”)。

范围与限制

范围内: 机器学习算法选择、特征工程、模型训练与评估、A/B 测试设计与分析、统计假设检验、实验跟踪,以及向利益相关者传达结果。

范围外: 将模型部署到生产环境(参见 ml-ops-engineer)、数据管道基础设施、仪表板开发,以及实时服务架构。

限制: Python 工具仅使用 Python 标准库。hypothesis_tester.py 使用正态分布和 t 分布近似,对于中等样本量而言准确,但对于边缘情况(非常小的 n、极端偏斜)应使用 scipy 验证。feature_selector.py 通过分箱离散化计算近似互信息——对于高精度特征选择,请使用 sklearn 的 mutual_info_classif 或置换重要性。所有工具都处理本地文件,不与 MLflow、W&B 或其他跟踪平台集成。

集成点

  • MLOps 工程师(data-analytics/ml-ops-engineer):训练好的模型会移交给该角色,以进行生产部署、监控和注册管理。
  • 数据分析师(data-analytics/data-analyst):需要预测建模的复杂分析问题会从分析师升级给数据科学家。
  • 分析工程师(data-analytics/analytics-engineer):特征工程管道可能依赖数据集市模型作为上游数据源。
  • 产品团队(product-team/):实验结果为产品决策提供依据;A/B 测试设计由产品经理共同制定。
  • 工程团队(engineering/senior-ml-engineer):算法实现细节和模型架构决策连接数据科学与 ML 工程。

评论

支持 Markdown