MLArena:一款不错的AutoML工具介绍
独特工具通过将智能自动化与专家级定制能力相结合,弥合了手动机器学习开发与全自动 AutoML 平台之间的差距。完整度还是很高的。
github地址:
https://github.com/MenaWANG/mlarena
文章目录
- 1 MLArena 概述
- 1.1 传统机器学习开发的挑战
- 1.2 核心架构
- 1.2.1 MLPipeline
- 1.2.2. PreProcessor
- 1.3 主要功能
- 1.3.1 与算法无关的设计
- 1.3.2 全面评估
- 1.3.3 模型可解释性
- 1.3.4 超参数优化
- 1.3.5 实用函数
- 1.4 入门指南
- 2 MLArena快速教程指南
- 2.1 MLArena 的特点
- 2.2 安装
- 2.3 3分钟快速上手第一个模型
- 2.3.1 第1步:导入库并加载数据
- 2.3.2 第2步:创建并训练您的管道
- 2.3.3 第3步:评估您的模型
- 2.3.4 第4步:解释您的模型
- 2.4 切换模型毫不费力
- 2.5 试试回归任务
- 2.6 保存和部署您的模型
- 3 高级使用技巧
- 3.1 高级超参数调优
- 3.1.1 设置高级调优
- 3.1.2 理解调优过程
- 3.1.3 高级调优功能
- 3.1.3.1 带方差惩罚的交叉验证
- 3.1.3.2 提前停止和剪枝
- 3.1.3.3 Spark 分布式调优
- 3.2 高级模型解释
- 3.2.1 全局模型解释
- 3.2.2 局部案例解释
- 3.2.3 特征依赖分析
- 3.3 高级评估和阈值优化
- 3.3.1 全面分类评估
- 3.3.2 高级回归评估
- 3.3.3 阈值优化
- 3.4 高级可视化和诊断
- 3.4.1 分类可视化套件
- 3.4.2 回归诊断图
- 3.4.3 超参数搜索可视化
- 3.5 生产就绪功能
- 3.5.1 MLflow 集成
- 3.5.2 模型部署
- 3.6 综合应用:高级工作流示例
- 3.7 高级使用的最佳实践
- 3.7.1 参数范围选择
- 3.7.2. 方差惩罚调优
- 3.7.3. 提前停止配置
- 3.7.4. 解释策略
- 3.8 结论
- 4 功效分析示例
- 4.1 功效分析的基本问题
- 4.2 比例的功效分析
- 4.2.1 估算所需样本量
- 4.2.2 用固定样本量估算功效
- 4.2.3 选择合适的功效水平
- 4.3 数值指标的功效分析
- 4.3.1 理解效应量
- 4.3.2 计算数值指标的样本量
- 4.3.3 不同效应量的样本量需求
- 4.3.4 根据真实数据计算效应量
- 4.4 与 MLArena 的 A/B 测试工作流集成
- 4.5 功效分析的最佳实践
- 4.5.1. 始终在实验前进行功效分析
- 4.5.2. 使用现实的效应量
- 4.5.3. 考虑多种场景
- 4.5.4. 考虑实际约束
- 4.5.5. 使用适当的统计方法
1 MLArena 概述
MLArena 是一个与算法无关的机器学习工具包,旨在简化模型训练、诊断和优化流程。作为自定义的 mlflow.pyfunc
模型构建,它与 MLflow 生态系统无缝集成,提供强大的实验跟踪、模型版本控制和框架无关的部署功能。这个独特工具通过将智能自动化与专家级定制能力相结合,弥合了手动机器学习开发与全自动 AutoML 平台之间的差距。
1.1 传统机器学习开发的挑战
传统机器学习开发通常需要在自动化与控制之间进行权衡。AutoML 解决方案提供便利但灵活性有限,而手动开发提供完全控制但需要大量样板代码。MLArena 通过以下方式应对这一挑战:
- 提供统一接口:适用于任何 scikit-learn 兼容模型,让您可以在不中断部署管道的情况下切换算法
- 自动化最佳实践:同时保持定制机器学习工作流程每个方面的灵活性
- 提供全面评估:开箱即用的详细指标和可视化功能
- 与 MLflow 无缝集成:用于实验跟踪和生产部署
1.2 核心架构
MLArena 围绕两个主要组件构建,它们协同工作以创建完整的机器学习管道:
1.2.1 MLPipeline
MLPipeline
类作为模型训练、评估和部署的主要接口。它扩展了 mlflow.pyfunc.PythonModel
以确保与 MLflow 生态系统的兼容性。
from mlarena import MLPipeline
import lightgbm as lgb# 使用任何 scikit-learn 兼容模型定义管道
mlpipeline = MLPipeline(model=lgb.LGBMClassifier(verbose=-1),preprocessor=PreProcessor()
)# 训练模型
mlpipeline.fit(X_train, y_train)# 进行预测
y_pred = mlpipeline.predict(context=None, model_input=X_test)# 使用全面指标和可视化进行评估
results = mlpipeline.evaluate(X_test, y_test, verbose=True, visualize=True)
MLPipeline 处理:
- 模型训练和预测
- 使用指标和可视化进行综合评估
- 使用 SHAP 值进行模型解释
- 带交叉验证的超参数优化
- 分类任务的阈值优化
- 与 MLflow 集成进行实验跟踪
1.2.2. PreProcessor
PreProcessor
类使用智能默认值和自定义选项处理所有数据预处理任务:
from mlarena import PreProcessor# 使用智能默认值初始化
preprocessor = PreProcessor()# 拟合并转换训练数据
X_train_transformed = preprocessor.fit_transform(X_train)# 转换测试数据
X_test_transformed = preprocessor.transform(X_test)
PreProcessor 提供:
- 自动特征分析和编码建议
- 智能处理缺失值
- 可配置平滑的目标编码
- 特征缩放和独热编码
- 特征名称清理以防止管道故障
1.3 主要功能
1.3.1 与算法无关的设计
MLArena 适用于任何 scikit-learn 兼容模型,让您可以在不更改管道的情况下轻松切换算法:
# 从 LightGBM 切换到随机森林
mlpipeline = MLPipeline(model=RandomForestClassifier(), # 只需更改模型preprocessor=PreProcessor() # 其他一切保持不变
)
1.3.2 全面评估
MLArena 自动生成包含以下内容的详细评估报告:
分类任务:
- 核心指标:准确率、AUC、精确率、召回率、F1 分数、MCC
- 可视化:ROC 曲线、混淆矩阵、指标与阈值关系图
- 使用可配置 F-beta 评分进行阈值优化
回归任务:
- 核心指标:RMSE、MAE、R²、调整后 R²、MAPE、SMAPE
- 可视化:残差分析、预测误差图
- 相对于基线模型的改进
1.3.3 模型可解释性
MLArena 使用 SHAP 值提供内置模型解释:
# 生成全局和局部解释
mlpipeline.explain_model(X_test)
这将创建:
- 全局特征重要性图
- 局部预测解释
- 特征交互的依赖图
1.3.4 超参数优化
MLArena 包含高效的超参数调优功能:
# 使用交叉验证优化超参数
mlpipeline.optimize_hyperparameters(X_train, y_train,n_trials=50,cv=5,scoring='accuracy'
)
功能包括:
- 带耐心剪枝的提前停止
- 用于搜索空间诊断的平行坐标可视化
- 带方差惩罚的交叉验证
- 支持多种优化指标
1.3.5 实用函数
MLArena 包含一套全面的实用工具,用于:
数据分析:
plot_box_scatter
:比较类别的数值分布plot_distribution_over_time
:跟踪时间段内的分布plot_stacked_bar_over_time
:可视化时间段内的类别分布
统计分析:
- 功效分析和样本量计算
- 带统计检验的组比较工具
- 效应量计算
数据处理:
- 主键验证和重复项管理
- 智能日期列转换
- 架构和数据质量实用工具
1.4 入门指南
开始使用 MLArena:
- 安装软件包:
pip install mlarena==0.4.3
- 导入主要组件:
from mlarena import MLPipeline, PreProcessor
- 使用您偏好的模型创建管道:
mlpipeline = MLPipeline(model=YourFavoriteModel(),preprocessor=PreProcessor()
)
- 仅需几行代码即可训练、评估和解释您的模型。
MLArena 旨在让机器学习更易于使用,同时为经验丰富的从业者提供所需的功能和灵活性。无论您是构建第一个模型还是部署到生产环境,MLArena 都能在不牺牲控制的情况下简化流程。
2 MLArena快速教程指南
本指南将在短短 3分钟 内带您快速上手第一个机器学习模型。MLArena 是一个算法无关的机器学习工具包,能够以最少的代码简化模型训练、评估和部署流程。
2.1 MLArena 的特点
MLArena 是一个功能强大且用户友好的机器学习库,它弥合了手动机器学习开发与全自动 AutoML 平台之间的差距。它提供:
- 统一接口:适用于任何与 scikit-learn 兼容的模型
- 智能预处理:通过智能默认值自动完成数据准备
- 全面评估:开箱即用的丰富指标和可视化功能
- 模型可解释性:基于 SHAP 的内置解释功能,支持全局和局部可解释性
- MLflow 集成:无缝的实验跟踪和模型部署
2.2 安装
首先,使用 pip 安装 MLArena。由于该包正在积极开发中,我们建议安装特定版本:
%pip install mlarena==0.4.3
如果您使用的是 Databricks ML Runtime 16.0+,可以无依赖安装:
%pip install mlarena==0.4.3 --no-deps
2.3 3分钟快速上手第一个模型
让我们用 MLArena 构建您的第一个机器学习模型。我们将从使用泰坦尼克号数据集的分类示例开始。
2.3.1 第1步:导入库并加载数据
# 标准库导入
import pandas as pd
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
import lightgbm as lgb# 导入 MLArena 组件
from mlarena import PreProcessor, MLPipeline# 加载数据
titanic = fetch_openml('titanic', version=1, as_frame=True)
X = titanic.data
y = titanic.target.astype(int)# 删除不需要的列
X = X.drop(['boat', 'body', 'home.dest', 'ticket', 'cabin', 'name'], axis=1)# 为 MLArena 准备数据
X = PreProcessor.mlflow_input_prep(X)# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2.3.2 第2步:创建并训练您的管道
使用 MLArena,创建完整的机器学习管道只需几行代码:
# 定义管道
mlpipeline = MLPipeline(model=lgb.LGBMClassifier(verbose=-1), # 任何兼容 sklearn 的模型preprocessor=PreProcessor() # 带默认值的智能预处理
)# 训练管道
mlpipeline.fit(X_train, y_train)
2.3.3 第3步:评估您的模型
MLArena 提供全面的评估功能,包含丰富的指标和可视化:
# 使用详细指标和图表进行评估
results = mlpipeline.evaluate(X_test, y_test, verbose=True, visualize=True)
这个单一命令会生成:
- 核心性能指标:准确率、精确率、召回率、F1、AUC、对数损失、MCC
- 可视化:ROC 曲线、混淆矩阵、指标与阈值对比图
- 详细报告:易于阅读的性能摘要
2.3.4 第4步:解释您的模型
理解模型做出预测的原因至关重要。MLArena 让这一过程变得简单:
# 全局特征重要性
mlpipeline.explain_model(X_test)# 特定案例的局部解释
mlpipeline.explain_case(5) # 解释第5个测试案例# 特征依赖分析
mlpipeline.explain_dependence(feature_1="age", feature_2="sex_male")
这些命令会生成直观的可视化图表,展示:
- 哪些特征在全局层面驱动预测
- 各个特征如何影响特定预测
- 特征之间如何相互作用
2.4 切换模型毫不费力
MLArena 的主要优势之一是算法无关性。切换到不同模型只需最少的代码更改:
# 使用随机森林创建新管道
mlpipeline_rf = MLPipeline(model=RandomForestClassifier(), # 只需替换模型!preprocessor=PreProcessor()
)# 训练和评估
mlpipeline_rf.fit(X_train, y_train)
results = mlpipeline_rf.evaluate(X_test, y_test, verbose=True, visualize=True)# 解释新模型
mlpipeline_rf.explain_model(X_test)
2.5 试试回归任务
MLArena 同样适用于回归任务。这是一个快速示例:
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor# 加载回归数据
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
X = PreProcessor.mlflow_input_prep(X)
y = california.target# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建并训练回归管道
mlpipeline_reg = MLPipeline(model=RandomForestRegressor(),preprocessor=PreProcessor()
)# 训练和评估
mlpipeline_reg.fit(X_train, y_train)
results = mlpipeline_reg.evaluate(X_test, y_test, verbose=True, visualize=True)
对于回归任务,您将获得:
- 误差指标:RMSE、MAE、中位 AE、NRMSE 变体、MAPE、SMAPE
- 拟合优度:R²、调整后 R²
- 可视化:残差图、预测误差图
- 基线比较:相比均值/中位数预测的改进程度
2.6 保存和部署您的模型
MLArena 基于 MLflow 构建,使模型部署变得无缝:
import mlflow# 评估并将模型记录到 MLflow
results = mlpipeline.evaluate(X_test, y_test, log_model=True)
model_info = results['model_info']# 重新加载模型
loaded_model = mlflow.pyfunc.load_model(model_uri=model_info.model_uri)# 使用加载的模型进行预测
predictions = loaded_model.predict(X_test)
当您使用 log_model=True
记录时,MLArena 会自动:
- 启动 MLflow 运行
- 记录所有超参数和指标
- 保存完整管道(预处理器 + 模型)
- 推断模型签名以用于生产部署
3 高级使用技巧
基础模型训练往往远远不够。您需要系统地优化超参数、解释模型决策,并为生产环境准备模型。MLArena 在集成框架中提供了这些高级功能,让您无需拼凑多种工具和库。
我们将介绍的高级技术将帮助您:
- 通过智能超参数调优找到最佳模型配置
- 通过基于 SHAP 的可解释性理解模型做出特定预测的 原因
- 使用全面的评估指标处理分类和回归任务
- 通过 MLflow 集成无缝部署模型
3.1 高级超参数调优
让我们从 MLArena 最强大的功能之一开始:使用 Optuna 进行智能超参数调优。与基础网格搜索不同,MLArena 的调优方法采用贝叶斯优化来高效探索超参数空间。
3.1.1 设置高级调优
tune()
方法是一个静态方法,它协调整个超参数优化过程。该方法处理交叉验证、提前停止,甚至支持 Spark 分布式计算。
import lightgbm as lgb
from mlarena.pipeline import MLPipeline# 定义优化参数范围
param_ranges = {'n_estimators': (50, 500),'max_depth': (3, 10),'learning_rate': (0.01, 0.3),'subsample': (0.6, 1.0),'colsample_bytree': (0.6, 1.0)
}# 运行高级超参数调优
results = MLPipeline.tune(X=X, y=y,algorithm=lgb.LGBMClassifier,preprocessor=your_preprocessor,param_ranges=param_ranges,max_evals=100,cv=5,cv_variance_penalty=0.1,early_stopping=20,tune_metric='auc'
)
3.1.2 理解调优过程
调优过程遵循一个平衡性能和稳定性的复杂工作流:
- 数据分割
- 交叉验证设置
- Optuna 目标函数
- 参数建议
- 模型训练
- 交叉验证评估
- 方差惩罚计算
- 分数返回
- 提前停止检查
- 继续?
- 最佳模型选择
- 最终评估
这种方法的高级之处在于 方差惩罚 功能。与仅优化平均性能的标准调优不同,MLArena 会对交叉验证折中的高方差进行惩罚。这确保您的模型不仅准确,而且稳定可靠。
3.1.3 高级调优功能
3.1.3.1 带方差惩罚的交叉验证
框架实现了一个同时考虑性能和稳定性的复杂评分系统:
# 分类任务(最大化 AUC 等指标)
score = mean_score - cv_variance_penalty * std_score# 回归任务(最小化 RMSE 等指标)
score = mean_score + cv_variance_penalty * std_score
这种双重优化确保您获得的模型在不同数据子集上都能持续表现良好,而不仅仅是平均表现良好。
3.1.3.2 提前停止和剪枝
MLArena 实现了智能提前停止以避免计算资源浪费:
pruner = MedianPruner(n_startup_trials=5, # 开始剪枝前的试验次数n_warmup_steps=0 # 每次试验剪枝前的步数
)
MedianPruner 将试验性能与之前试验的中位数进行比较,提前终止无希望的配置。
3.1.3.3 Spark 分布式调优
对于大规模问题,MLArena 支持使用 Spark 进行分布式超参数调优:
results = MLPipeline.tune(X=X, y=y,algorithm=lgb.LGBMClassifier,param_ranges=param_ranges,use_spark=True,n_jobs=4,study_name="my-spark-tuning",mlflow_storage="mlflow-tracking-uri"
)
此功能会自动检测 Spark 可用性,如果 Spark 不可用则优雅地回退到标准 Optuna。
3.2 高级模型解释
理解模型做出预测的 原因 对于建立信任和调试问题至关重要。MLArena 提供了全面的基于 SHAP 的可解释性功能。
3.2.1 全局模型解释
explain_model()
方法生成全面的特征重要性可视化:
# 首先训练模型
pipeline = MLPipeline(model=best_model, preprocessor=preprocessor)
pipeline.fit(X_train, y_train)# 生成全局解释
pipeline.explain_model(X=X_test,plot_type="beeswarm", # 或 "summary" 或 "auto"max_features=15,group_remaining_features=True
)
此方法自动处理不同的模型类型并创建适当的 SHAP 解释器。蜂群图在单个可视化中显示特征重要性和影响方向。
3.2.2 局部案例解释
要理解单个预测,使用 explain_case()
方法:
# 解释特定预测
pipeline.explain_case(n=1) # 解释第一个案例
这会生成一个瀑布图,显示每个特征如何从基值开始,最终影响模型输出。
3.2.3 特征依赖分析
要理解特征交互和非线性关系:
# 单特征依赖
pipeline.explain_dependence(feature_1="age")# 特征交互分析
pipeline.explain_dependence(feature_1="age", feature_2="income")
这些图揭示了特征如何相互交互并影响预测,帮助您发现数据中的隐藏模式。
3.3 高级评估和阈值优化
3.3.1 全面分类评估
MLArena 超越基础准确率指标,提供模型性能的完整图景:
evaluation_results = pipeline.evaluate(X_test=X_test,y_test=y_test,threshold=0.5,beta=1.0, # F-beta 分数权重verbose=True,visualize=True
)
这会生成详细指标,包括:
- 核心指标:准确率、精确率、召回率、F1、AUC、对数损失
- 高级指标:马修斯相关系数
- 上下文信息:正例率与基率比较
- 类别不平衡或过拟合的诊断警告
3.3.2 高级回归评估
对于回归任务,MLArena 提供全面的误差分析:
regression_results = pipeline.evaluate(X_test=X_test,y_test=y_test,verbose=True,visualize=True
)
回归评估包括:
- 标准指标:RMSE、MAE、R²
- 归一化指标:NRMSE(按均值、标准差、四分位距)
- 百分比误差:MAPE、SMAPE
- 基线比较:相对于均值/中位数的改进
- 样本特征比诊断
3.3.3 阈值优化
对于分类任务,找到最佳阈值对业务应用至关重要:
# 根据业务偏好找到最佳阈值
optimal_threshold = MLPipeline.threshold_analysis(y_true=y_train, y_pred_proba=y_pred_proba,beta=1.0 # beta > 1 时更重视召回率而非精确率
)["optimal_threshold"]# 在评估中使用最佳阈值
results = pipeline.evaluate(X_test, y_test, threshold=optimal_threshold)
此分析帮助您根据特定业务需求平衡精确率和召回率。
3.4 高级可视化和诊断
3.4.1 分类可视化套件
MLArena 自动为分类生成全面的可视化图表:
- 分类评估
- 指标与阈值关系图
- ROC 曲线
- 混淆矩阵
- 精确率/召回率/F1 权衡
- 排序质量评估
- 错误模式分析
指标与阈值关系图对于理解不同阈值如何影响业务指标特别有价值。
3.4.2 回归诊断图
对于回归模型,MLArena 提供帮助识别模型问题的诊断图:
# 评估期间自动生成
pipeline._plot_regression_metrics(X_test, y_test, y_pred)
这些图包括:
- 残差分析:显示残差是否随机分布
- 预测误差图:揭示系统性偏差
- 95% 预测区间:显示不确定性边界
3.4.3 超参数搜索可视化
调优后,可视化搜索空间以理解参数交互:
# 调优期间自动生成
fig_parallel = plot_parallel_coordinate(study,target=lambda t: t.user_attrs[target_attr],target_name=target_name,
)
平行坐标图显示不同参数组合如何影响性能,帮助您理解超参数景观。
3.5 生产就绪功能
3.5.1 MLflow 集成
MLArena 与 MLflow 无缝集成,用于实验跟踪和模型部署:
# 调优和评估期间自动记录
results = MLPipeline.tune(X=X, y=y,algorithm=algorithm,param_ranges=param_ranges,log_best_model=True # 自动记录到 MLflow
)# 自定义工作流的手动记录
pipeline._log_model(metrics=evaluation_metrics,params=model_params,sample_input=X_sample,sample_output=y_sample
)
这种集成确保您的模型通过适当的版本控制、元数据和部署工件实现生产就绪。
3.5.2 模型部署
MLPipeline 类继承自 mlflow.pyfunc.PythonModel
,使其部署就绪:
# 保存模型以供部署
mlflow.pyfunc.save_model(path="model_path",python_model=pipeline,signature=infer_signature(X_train, y_train)
)# 在生产环境中加载和使用
loaded_model = mlflow.pyfunc.load_model("model_path")
predictions = loaded_model.predict(X_new)
保存到 MLflow 时始终包含模型签名。这确保了输入验证和生产环境中正确的模型服务。
3.6 综合应用:高级工作流示例
让我们将这些高级技术组合成一个完整的工作流:
# 1. 高级超参数调优
tuning_results = MLPipeline.tune(X=X, y=y,algorithm=lgb.LGBMClassifier,preprocessor=preprocessor,param_ranges={'n_estimators': (100, 500),'max_depth': (3, 10),'learning_rate': (0.01, 0.2)},max_evals=50,cv=5,cv_variance_penalty=0.1,early_stopping=15,tune_metric='auc',log_best_model=True
)# 2. 提取最佳模型
best_pipeline = tuning_results['best_pipeline']# 3. 高级模型解释
best_pipeline.explain_model(X_test, plot_type="beeswarm")
best_pipeline.explain_case(n=1) # 解释第一个预测# 4. 特征交互分析
best_pipeline.explain_dependence("feature_1", "feature_2")# 5. 使用最佳阈值进行全面评估
evaluation_results = best_pipeline.evaluate(X_test=X_test,y_test=y_test,threshold=tuning_results.get('optimal_threshold', 0.5),verbose=True,visualize=True
)# 6. 生产部署
mlflow.pyfunc.save_model(path="production_model",python_model=best_pipeline,signature=infer_signature(X_test, y_test)
)
3.7 高级使用的最佳实践
3.7.1 参数范围选择
定义调优参数范围时:
- 对学习率和正则化参数使用对数尺度
- 考虑基于树模型参数的计算约束
- 从较宽范围开始,根据初始结果进行细化
3.7.2. 方差惩罚调优
cv_variance_penalty
参数至关重要:
- 较高值(0.2-0.3):优先考虑模型稳定性,适用于关键应用
- 较低值(0.05-0.1):优先考虑原始性能,适用于竞赛
- 默认值(0.1):大多数应用的良好平衡
3.7.3. 提前停止配置
根据计算预算配置提前停止:
- 小数据集(n < 1000):10-20 次无改进试验
- 中等数据集(n < 10,000):20-50 次无改进试验
- 大数据集(n > 10,000):50-100 次无改进试验
3.7.4. 解释策略
对于模型解释:
- 始终从全局解释开始,了解整体特征重要性
- 对高风险预测或调试使用案例解释
- 分析特征依赖性以发现非线性关系
- 将 SHAP 值与领域知识结合,获得可操作的洞察
3.8 结论
MLArena 的高级功能为复杂的机器学习工作流提供了完整的工具包。从智能超参数调优到全面的模型解释和生产部署,框架处理了复杂性,让您可以专注于解决业务问题。
关键优势在于这些高级功能在单一、连贯框架中的 集成。您无需管理多种工具和库,而是获得一个统一的工作流,确保整个机器学习项目生命周期的一致性和可重现性。
随着您继续探索 MLArena,请记住这些高级技术是协同工作的。超参数调优为模型解释提供信息,进而指导进一步优化,为您的机器学习模型创建持续改进的循环。
4 功效分析示例
功效分析是一种关键的统计工具,通过确定检测显著效应所需的样本量,帮助您设计有效的实验。无论您是在网站上运行 A/B 测试、评估医疗方案还是比较机器学习模型,功效分析都能确保您的实验既不会功效不足(遗漏真实效应),也不会功效过剩(浪费资源)。
在本示例中,我们将探讨 MLArena 的功效分析功能如何帮助您自信地规划实验,涵盖基于比例的测试(如转化率)和数值指标(如收入或会话时长)。
4.1 功效分析的基本问题
功效分析回答三个基本问题:
- 样本量:要检测给定大小的效应,我需要多少观察值?
- 功效:如果效应确实存在,我检测到它的概率是多少?
- 效应量:我能可靠检测到的最小有意义差异是多少?
功效是在零假设为假时正确拒绝零假设的概率——简单来说,就是您检测到真实效应的机会。行业标准是80%功效,这意味着您有80%的机会检测到真实效应。
4.2 比例的功效分析
让我们从一个常见场景开始:测试转化率的改进。假设您希望将网站的转化率从5%提高到6%。
4.2.1 估算所需样本量
要确定每组需要多少用户才能以80%的功效检测到这一改进:
import mlarena.utils.stats_utils as sut# 计算检测5%→6%改进所需的样本量
sample_size_result = sut.sample_size_proportion(baseline_rate=0.05,treatment_rate=0.06,power=0.8,alpha=0.05
)print(f"每组所需样本量: {sample_size_result['sample_size_per_group']:,}")
print(f"总所需样本量: {sample_size_result['total_sample_size']:,}")
这告诉我们,每组需要 8,143名用户(总共16,286名),才能有80%的机会检测到转化率1个百分点的提升。
4.2.2 用固定样本量估算功效
如果您的用户数量有限怎么办?您可以计算能达到的功效:
# 每组10,000名用户的功效是多少?
power_result = sut.power_analysis_proportion(baseline_rate=0.05,treatment_rate=0.06,sample_size_per_group=10000
)print(f"检测改进的功效: {power_result['power']*100:.1f}%")
每组10,000名用户时,您将有 87.4%的功效——高于标准的80%,如果效应存在,您有更高的机会检测到它。
4.2.3 选择合适的功效水平
功效水平的选择取决于您的具体情况和风险承受能力:
功效水平 | 样本量 (5%→6%) | 遗漏效应的风险 | 使用场景 |
---|---|---|---|
70% | 每组6,403 | 30% | 早期探索,低成本变更 |
80% | 每组8,143 | 20% | 行业标准,平衡方法 |
90% | 每组10,901 | 10% | 高风险决策,监管要求 |
95% | 每组13,482 | 5% | 关键应用,高成本实施 |
请注意,将功效从80%提高到90%需要增加约34%的样本量,而对于许多商业应用来说,风险的降低(从20%到10%)可能无法证明这一成本是合理的。
4.3 数值指标的功效分析
对于收入、会话时长或用户满意度分数等连续结果,我们使用基于效应量而非原始差异的不同统计方法。
4.3.1 理解效应量
在数值功效分析中,我们使用 Cohen’s d 作为效应量的标准化度量:
- 0.1:非常小的效应
- 0.2:小效应
- 0.5:中等效应
- 0.8:大效应
Cohen’s d 以标准差为单位表示组间差异。d=0.5 表示组间相差半个标准差。
4.3.2 计算数值指标的样本量
# 检测中等效应量(d=0.5)所需的样本量
sample_size_numeric_result = sut.sample_size_numeric(effect_size=0.5, # 中等效应量power=0.8,alpha=0.05
)print(f"每组所需样本量: {sample_size_numeric_result['sample_size_per_group']}")
print(f"总所需样本量: {sample_size_numeric_result['total_sample_size']}")
检测中等效应量(d=0.5)仅需 每组34名用户——比比例测试少得多,因为我们使用信息量更大的连续数据而非二元结果。
4.3.3 不同效应量的样本量需求
效应量 | 解释 | 每组样本量 | 总样本量 |
---|---|---|---|
0.1 | 非常小 | 787 | 1,574 |
0.2 | 小 | 199 | 398 |
0.3 | 小 | 90 | 180 |
0.5 | 中等 | 34 | 68 |
0.8 | 大 | 15 | 30 |
请注意,随着效应量的增加,样本量需求急剧下降。这就是为什么在规划实验时对效应量有切合实际的期望至关重要。
4.3.4 根据真实数据计算效应量
在规划实验时,您通常有历史数据并期望特定的改进。numeric_effectsize()
函数帮助将原始差异转换为标准化效应量:
# 历史平均值:100美元
# 预期增长:5美元(即新平均值=105美元)
# 历史标准差:20美元# 选项1:直接使用平均值
d = sut.numeric_effectsize(mean1=105, mean2=100, std=20)# 选项2:使用平均差异
d = sut.numeric_effectsize(mean_diff=5, std=20)print(f"Cohen's d: {d:.3f}")
这给出 Cohen’s d = 0.250,这是一个小到中等效应量,需要约253名用户才能以80%的功效检测到。
4.4 与 MLArena 的 A/B 测试工作流集成
MLArena 的真正威力来自于将功效分析与完整的 A/B 测试工作流相结合。以下是结合这些工具的方法:
from mlarena.utils.stats_utils import compare_groups, add_stratified_groups# 步骤1:用功效分析规划测试
target_sample = sut.sample_size_proportion(0.05, 0.06, power=0.8)
print(f"每组需要{target_sample['sample_size_per_group']:,}名用户")# 步骤2:创建适当分层的组
user_data = pd.DataFrame({'user_id': range(target_sample['total_sample_size']),'region': np.random.choice(['North', 'South', 'East', 'West'], target_sample['total_sample_size']),'user_segment': np.random.choice(['New', 'Returning', 'VIP'], target_sample['total_sample_size']),'metric1': np.random.normal(100, 15, target_sample['total_sample_size'])
})stratified_data = add_stratified_groups(user_data, stratifier_col=['region', 'user_segment'],group_labels=('control', 'treatment')
)# 步骤3:测试完成后分析结果
stratified_data['converted'] = np.where(stratified_data['stratified_group'] == 'control',np.random.binomial(1, 0.05, len(stratified_data)),np.random.binomial(1, 0.06, len(stratified_data))
)effect_size, summary = compare_groups(stratified_data,'stratified_group', ['converted'],cat_test='chi2'
)
这种集成工作流确保您的 A/B 测试功效适当,在重要用户细分中平衡良好,并使用适当方法进行统计分析。
4.5 功效分析的最佳实践
4.5.1. 始终在实验前进行功效分析
功效分析是规划工具,不是分析工具。收集数据后进行会导致结果偏差和错误结论。
4.5.2. 使用现实的效应量
估算效应量时要保守。许多实验显示的效应比最初预期的要小。考虑:
- 类似实验的历史数据
- 行业基准
- 对您的业务有意义的最小可检测效应
4.5.3. 考虑多种场景
不要依赖单一的功效计算。创建一个表格,显示不同效应量和功效水平的样本量需求。这有助于利益相关者理解权衡并做出明智决策。
4.5.4. 考虑实际约束
功效分析给出统计要求,但您还需要考虑:
- 时间:收集所需样本需要多长时间?
- 成本:检测效应的价值与实验成本相比如何?
- 业务影响:遗漏真实效应(II类错误)的成本是多少?
4.5.5. 使用适当的统计方法
MLArena 为不同场景提供不同函数:
- 对二元结果(转化率、点击率)使用
sample_size_proportion()
- 对连续结果(收入、网站停留时间、满意度分数)使用
sample_size_numeric()
- 使用
numeric_effectsize()
将业务指标转换为标准化效应量