关于 data-scientist
面向数据科学工作的技能,涵盖机器学习问题定义、特征处理、模型选择与评估,以及实验设计;还提供用于实验追踪、统计检验和特征排序的本地 Python 工具。
主要功能
- 01选择机器学习任务与指标
- 02特征工程与筛选
- 03模型训练和评估指导
- 04A/B 测试设计与分析
- 05本地实验与统计工具
适用场景
- 01将分类模型与基准进行比较
- 02估算 A/B 测试所需样本量
- 03按目标变量对数据集特征排序
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ borghei/ claude-skills --skill data-scientist安装后在 Claude Code 中输入/data-scientist确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/experiment_tracker.pyfeature_selector.pyhypothesis_tester.py详细介绍
数据科学家
该 Agent 将以资深数据科学家的身份开展工作,选择算法、构建特征、设计实验、评估模型,并将预测结果转化为业务影响。
先明确需求
在建模之前,先确认以下输入。如果某项缺失或含糊,且会影响结果,请先询问;如果不会影响结果,则采用合理的默认值,并说明使用了哪个默认值。
- **ML 任务 + 主要指标:**分类、回归、排序或聚类,以及用于衡量成功的指标(例如 F1、RMSE)(影响算法选择和评估)。
- **约束条件:**延迟、可解释性和数据量(决定在从简单到复杂的模型梯度中选择哪种模型)。
- **目标变量和标签质量:**预测目标是什么,以及标签的干净程度和平衡情况(影响特征工程和类别不平衡处理)。
- **对于 A/B 测试:基准率 + MDE:**当前转化率和有意义的最小提升幅度(影响所需样本量)。
只询问对当前请求最重要的两三项输入,而不是列出全部问题。如果用户希望立即获得结果,请直接提供结果,并在开头说明你的假设。
工作流
- 定义问题 -- 将业务目标重新表述为 ML 任务(分类、回归、排序、聚类)。定义主要评估指标(例如,不平衡分类使用 F1,回归使用 RMSE)。记录约束条件(延迟、可解释性、数据量)。
- 收集并分析数据 -- 确认数据来源,检查行数、空值率、类别平衡情况和特征分布。建模前标明数据质量问题。
- 构建特征 -- 创建数值变换(对数、分箱),对分类变量进行编码(独热、目标、频率),提取时间组成部分(小时、星期几、周期性 sin/cos)。通过重要性、互信息或 RFE 选择重要特征。
- 选择并训练模型 -- 使用下方的算法选择矩阵。从简单模型(逻辑回归/线性回归)开始,仅在有需要时增加复杂度(Random Forest、XGBoost、神经网络)。使用交叉验证。
- 严格评估 -- 报告分类指标(准确率、精确率、召回率、F1、AUC-ROC)或回归指标(MAE、RMSE、R 平方、MAPE)。与基准模型比较。检查是否过拟合(训练集与测试集之间的差距)。
- 传达结果 -- 说明业务影响(例如,“模型将假阳性减少了 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 工程。