简化 scikit-learn 模型比较
项目描述
介绍
poniard /ˈpɒnjərd/ 或 poignard(法语)是一种长而轻的刺刀(维基百科)。
Poniard 是一个 scikit-learn 配套库,它简化了拟合不同机器学习模型并进行比较的过程。它旨在衡量问题/数据集的“挑战性”程度,哪些类型的模型适合该任务,并帮助决定选择哪种算法。
这并不意味着是端到端的解决方案,在您完成 Poniard 之后,您绝对应该继续处理您的模型。
核心功能已经过测试,可以在 Linux 系统上的 Python 3.7 到 3.10 以及 macOS 上的 3.8 到 3.10 上运行。
安装
稳定版:
pip install poniard
具有最新更改的开发版本:
pip install git+https://github.com/rxavier/poniard.git@develop#egg=poniard
文档
查看Read The Docs中的完整文档。
用法/功能
基本
该 API 的设计考虑了表格回归和分类任务,如果使用了适当的交叉验证策略,它还应该与时间序列任务一起使用(不要打乱!)
通常的 Poniard 流程是:
- 定义一些估计量。
- 定义一些指标。
- 定义交叉验证策略。
- 适合一切。
- 显示结果。
Poniard 为 1、2 和 3 提供了合理的默认值,因此在大多数情况下,您可以这样做...
from poniard import PoniardClassifier
pnd = PoniardClassifier()
pnd.setup(X_train, y_train)
pnd.fit()
pnd.get_results()
...并获得一个漂亮的表格,显示每个模型所有折叠中每个指标的平均值,包括拟合和得分时间(感谢 scikit-learncross_validate函数!)
| test_roc_auc | test_accuracy | 测试精度 | 测试召回 | 测试_f1 | 适合时间 | score_time | |
|---|---|---|---|---|---|---|---|
| 逻辑回归 | 0.995456 | 0.978916 | 0.975411 | 0.991549 | 0.983351 | 0.0455776 | 0.00492911 |
| SVC | 0.994139 | 0.975408 | 0.975111 | 0.985955 | 0.980477 | 0.0135186 | 0.00860071 |
| HistGradientBoostingClassifier | 0.994128 | 0.970129 | 0.967263 | 0.985955 | 0.976433 | 1.02461 | 0.0249005 |
| XGB分类器 | 0.994123 | 0.970129 | 0.967554 | 0.985915 | 0.976469 | 0.0533132 | 0.00457506 |
| 随机森林分类器 | 0.992264 | 0.964881 | 0.964647 | 0.980282 | 0.972192 | 0.0795071 | 0.00955095 |
| 高斯NB | 0.98873 | 0.9297 | 0.940993 | 0.949413 | 0.9443 | 0.00533643 | 0.00397215 |
| KNeighbors分类器 | 0.98061 | 0.964881 | 0.955018 | 0.991628 | 0.972746 | 0.00236444 | 0.0104116 |
| 决策树分类器 | 0.920983 | 0.926223 | 0.941672 | 0.94108 | 0.941054 | 0.00618615 | 0.00303702 |
| 虚拟分类器 | 0.5 | 0.627418 | 0.627418 | 1 | 0.771052 | 0.00240407 | 0.00279222 |
或者,您还可以使用该estimator.plot.metrics()方法获得不同指标的漂亮图。
您可能想知道为什么setup()存在并且需要在之前调用fit()(这又不接受任何参数,这与您在 sklearn 中习惯的不同)。基本上,因为 Poniard 执行类型推断来构建预处理器,解耦fit()允许用户在训练模型之前检查预处理器是否合适并在必要时进行更改,这可能需要很长时间。
类型推断
Poniard 使用一些基本的启发式方法来推断数据类型。
如果唯一值的数量大于categorical_threshold参数指示的数量,则浮点和整数列被定义为数字。
假定字符串/对象/分类列是分类的。
日期时间功能使用自定义编码器单独处理。
对于分类特征,高低基数由cardinality_threshold参数定义。只有低基数的分类特征是单热编码的。
合奏
Poniard 可以很容易地在堆叠或投票集成中组合各种估计器。可以根据性能(top-n)或名称选择基本估计器。
Poniard 还报告了估计器的预测有多相似,因此可以构建具有不同基本估计器的集成。为回归任务构建了交叉验证预测的基本相关表,而Cramér's V用于分类。
默认情况下,它计算预测误差的相似性而不是实际预测;这有助于构建具有良好评分估计器和不相关错误的集合。
超参数优化
该tune_estimator方法可用于优化给定估计器的超参数,通过传递参数网格或使用可用于默认估计器的内置参数。调整后的估计器将被添加到估计器列表中,并在下次fit()调用时计分。
from poniard import PoniardRegressor
pnd = PoniardRegressor()
pnd.setup(x, y)
pnd.fit()
pnd.get_results()
pnd.tune_estimator("RandomForestRegressor", mode="grid")
pnd.fit() # This will only fit new estimators
绘图
plot访问器基于附加的 Poniard 估计器实例提供了几种绘图方法。这些 Plotly 图基于默认模板,但可以通过将不同的参数传递PoniardPlotFactory给 Poniardplot_options 参数来进行修改。
插件系统
pluginsPoniard estimators 中的参数接受一个插件或插件的子类列表BasePlugin。这些插件可以访问 Poniard 估计器实例并连接到流程的不同部分,例如,在设置开始时、在拟合结束时、在移除估计器时等。
这使得第三方可以轻松扩展 Poniard 的功能。
目前 Poniard 内置了两个插件:
- 权重和偏差:将您的数据记录到工件、绘图、运行 wandb scikit-learn 分析、保存模型工件等。
- Pandas Profiling:生成特征和目标的 HTML 报告。如果存在权重和偏差插件,还会将此报告记录到 wandb 运行。
这些插件的要求不包含在基本 Poniard 依赖项中,因此如果您不打算使用它们,可以放心地忽略它们。
设计理念
不是另一个依赖
我们非常努力地避免在这个库之外使用您不会使用的东西使环境变得混乱。Poniard 的依赖项是:
- scikit-learn (duh)
- 熊猫
- XGBoost
- 情节
- tqdm
- 而已!
除了tqdm并且可能Plotly,所有依赖项很可能无论如何都会安装,因此 Poniard 增加的占用空间应该很小。
我们在这里不这样做(AutoML)
Poniard 尽量不从用户手中夺走控制权。因此,它并非旨在执行 2 小时的特征工程和选择,在阳光下尝试每个模型以及无尽的集成,并根据某些指标选择性能最佳的模型。
相反,它努力抽象出一些适合和比较多个模型所需的样板代码,并允许用户决定如何处理结果。
Poniard 可能是您第一次尝试解决预测问题,但绝对不应该是您的最后一次。
认为有少数例外
虽然可以修改一些参数来控制变量类型推断和预处理的执行方式,但 API 旨在防止参数扩散。
交叉验证所有东西
Poniard 中的所有内容都默认使用交叉验证运行,实际上没有交叉验证就无法使用相关功能。
使用基线
模型比较中始终包含一个虚拟估计器,因此您可以衡量您的模型是否比一个愚蠢的策略更好。
快速 TTFM(第一个模型的时间)
预处理试图确保您的模型成功运行,而无需大量数据修改。默认情况下,Poniard 会估算缺失数据和 one-hot 编码或目标编码(取决于基数)推断的分类变量,在大多数情况下,这足以让 scikit-learn 算法毫无怨言地适应。此外,它还可以缩放数字数据并删除具有单个唯一值的特征。
类似项目
Poniard 并不是一个开创性的想法,许多库都遵循类似的方法。
ATOM可能是与 Poniard 最相似的库,尽管 API 采用了不同的方法。
LazyPredict的相似之处在于它运行多个估计器并为各种指标提供结果。与 Poniard 不同,默认情况下它会尝试大多数 scikit-learn 估计器,而不是基于交叉验证。
PyCaret是一个完全不同的野兽,包括模型可解释性、部署、绘图、NLP、异常检测等,这导致依赖关系列表比 Poniard 大几倍,并且抽象级别更高。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。