📢 转载信息
原文作者:Bala Priya C
作为一名机器学习工程师,您可能喜欢从事有趣的任务,例如试验模型架构、微调超参数和分析结果。但您一天中有多少时间实际上花在了那些不那么有趣的任务上,比如预处理数据、管理实验配置、调试模型性能问题,或者跟踪数十次训练运行中哪些超参数效果最好?
如果您诚实地说,这很可能占据了您工作时间的很大一部分。机器学习从业者在处理缺失值、标准化特征、设置交叉验证折叠、记录实验等重复性任务上花费了无数小时,而本该专注于构建更好的模型。
本文将介绍五个专门用于解决消耗您实验时间的重复性机器学习流程任务的 Python 脚本。让我们开始吧!
🔗 您可以在 GitHub 上找到代码。有关要求、入门、使用示例等的说明,请参阅 README 文件。
1. 自动化特征工程流水线
痛点:每个新数据集都需要相同的繁琐预处理步骤。您需要手动检查缺失值、编码分类变量、缩放数值特征、处理异常值,并设计特定领域的特征。当您在项目之间切换时,您会不断地用略有不同的要求重写相似的预处理逻辑。
脚本功能:该脚本通过可配置的流水线自动处理常见的特征工程任务。它能检测特征类型,应用适当的转换,根据预定义策略生成工程特征,处理缺失数据,并创建可以在项目间保存和重用的、一致的预处理流水线。它还提供有关所应用转换和工程化后特征重要性的详细报告。
工作原理:脚本会自动分析您的数据集以检测数值、分类、日期时间(datetime)和文本列。它对每种类型应用合适的转换:
- 对数值变量进行鲁棒缩放或标准化;
- 对分类变量进行目标编码或独热编码;以及
- 对日期时间特征进行周期性编码。
该脚本使用迭代插补(iterative imputation)来处理缺失值,使用 IQR 或 隔离森林(isolation forests)检测和封顶异常值,并为数值列生成多项式特征和交互项。
2. 超参数优化管理器
痛点:您正在运行网格搜索或随机搜索进行超参数调优,但管理所有配置、跟踪尝试过的组合以及分析结果是一团糟。您的 Jupyter 笔记本中很可能充满了超参数字典、手动记录的结果,并且没有系统化的方法来比较运行情况。当您找到好的参数时,您不确定是否能做得更好;而重新开始则意味着丢失了已探索内容的记录。
脚本功能:使用多种策略(网格搜索、随机搜索、贝叶斯优化和后半截(successive halving))提供统一的超参数优化接口。它会自动记录所有实验的参数、指标和元数据。生成优化报告,显示参数重要性、收敛图和最佳配置。支持提前停止(early stopping)和资源分配,以避免在配置不佳的实验上浪费计算资源。
工作原理:该脚本将各种优化库——scikit-learn、Optuna、Scikit-Optimize——封装到一个统一的接口中。它通过使用后半截或 Hyperband 尽早淘汰配置不佳的实验来分配计算资源。所有试验都记录到数据库或 JSON 文件中,包含参数、交叉验证分数、训练时间和时间戳。该脚本使用 函数方差分析(functional ANOVA)计算参数重要性,并生成可视化图表,显示收敛情况、参数分布以及参数与性能之间的相关性。结果可以被查询和过滤,以分析特定的参数范围或从之前的运行中恢复优化。
3. 模型性能调试器
痛点:您的模型性能突然下降,或者在某些数据片段上的表现不符合预期。您需要手动按不同特征对数据进行切片,计算每个切片上的指标,检查预测分布,并查找数据漂移(data drift)。这是一个耗时的过程,缺乏系统方法。您可能会错过隐藏在特定子群或特征交互中的重要问题。
脚本功能:通过分析数据片段上的性能,检测模型表现不佳的片段、识别特征漂移和预测漂移、检查标签泄露和数据质量问题,并生成带有可操作见解的详细诊断报告,从而执行全面的模型调试。它还比较当前模型性能与基线指标,以检测随时间变化的性能退化。
工作原理:该脚本通过沿每个特征维度自动划分数据并计算每个片段的指标来进行基于片段的分析。
- 它使用统计检验来识别性能明显低于整体性能的片段。
- 对于漂移检测,它使用 Kolmogorov-Smirnov 检验或 总体稳定性指数(population stability index)来比较训练数据和测试数据之间的特征分布。
该脚本还执行自动特征重要性分析,并通过检查具有可疑高重要性的特征来识别潜在的标签泄露。所有发现都汇总到一个带有可视化效果的交互式报告中。
4. 交叉验证策略管理器
痛点:不同的数据集需要不同的交叉验证策略:
- 时间序列数据需要基于时间的划分;
- 不平衡数据集需要分层划分;以及
- 分组数据需要依赖分组的划分。
您需要为每个项目手动实现这些策略,编写自定义代码以确保没有数据泄露,并验证划分是合理的。这容易出错且重复,特别是当您需要比较多种划分策略以查看哪种能提供最可靠的性能估计时。
脚本功能:为各种数据类型和机器学习项目提供预配置的交叉验证策略。根据数据特征自动检测合适的划分策略,确保折叠之间没有数据泄露,为不平衡数据生成分层划分,使用适当的时间顺序处理时间序列数据,并支持分组/聚类数据划分。验证划分质量,并提供有关折叠分布和平衡的指标。
工作原理:该脚本分析数据集特征以确定适当的划分策略。
- 对于时间数据,它创建尊重时间顺序的扩展窗口或滚动窗口划分。
- 对于不平衡数据集,它使用分层划分来保持不同折叠中的类别比例。
- 当指定分组列时,它确保同一组的所有样本都保留在同一个折叠中。
该脚本通过检查数据泄露(时间序列中训练集中的未来信息)、分组污染和类别分布不平衡来验证划分。它提供了与 scikit-learn 兼容的划分迭代器,可与 cross_val_score 和 GridSearchCV 配合使用。
5. 实验跟踪器
痛点:您已经运行了数十个使用不同模型、特征和超参数的实验,但跟踪所有内容却是一场混乱。您的目录中散落着笔记本,命名约定不一致,并且没有简单的方法来比较结果。当有人问“哪个模型表现最好?”或“我们尝试了哪些特征?”时,您必须翻阅文件以重建实验历史。由于不确定确切使用了哪些代码和数据,重现过去的结果变得非常具有挑战性。
脚本功能:实验跟踪脚本提供轻量级的实验跟踪功能,记录所有模型训练运行的参数、指标、特征集、数据版本和代码版本。它捕获模型工件、训练配置和环境详细信息。生成实验间的比较表和可视化图表。支持按项目或目标标记和组织实验。通过记录重现结果所需的一切,使实验完全可复现。
工作原理:该脚本为每个实验创建一个结构化的目录,其中包含 JSON 格式的所有元数据。它执行以下操作:
该脚本以可查询的格式存储所有实验,从而可以轻松过滤和比较。它生成 Pandas DataFrame 以进行表格比较,并生成可视化图表以比较不同实验的指标。跟踪数据库可以本地使用 SQLite,或者根据需要与远程存储集成。
总结
这五个脚本着重解决了机器学习从业者经常遇到的核心操作挑战。以下是这些脚本功能的快速回顾:
- 自动化特征工程流水线:一致地处理重复性的预处理和特征创建。
- 超参数优化管理器:系统地探索参数空间并跟踪所有实验。
- 模型性能调试器:自动识别性能问题并诊断模型故障。
- 交叉验证策略管理器:确保针对不同数据类型进行适当的验证且没有数据泄露。
- 实验跟踪器:组织您的所有机器学习实验并使结果可复现。
编写 Python 脚本来解决最常见的痛点可能是一种有益且有趣的练习。如果需要,您可以稍后切换到 MLflow 或 Weights & Biases 等工具进行实验跟踪。祝您实验顺利!
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区