PyCaret是一个开源的Python机器学习库,旨在简化机器学习项目中的标准任务执行。
它是R语言中流行的Caret机器学习包的Python版本,因为它允许使用几行代码就可以在给定的数据集上评估、比较和调整模型。
PyCaret库提供了这些功能,使Python中的机器学习实践者能够通过单次函数调用,在分类或回归数据集上快速检查一套标准机器学习算法。
在本教程中,您将了解PyCaret这个开源的Python机器学习库。
完成本教程后,您将了解:
- PyCaret是R语言中流行且广泛使用的caret机器学习包的Python版本。
- 如何使用PyCaret轻松评估和比较数据集上的标准机器学习模型。
- 如何使用PyCaret轻松调整表现良好的机器学习模型的超参数。
让我们开始吧。

PyCaret 机器学习简明介绍
图片作者:Thomas,部分权利保留。
教程概述
本教程分为四个部分;它们是
- 什么是PyCaret?
- 声纳数据集
- 比较机器学习模型
- 调整机器学习模型
什么是PyCaret?
PyCaret是一个开源的Python机器学习库,灵感来源于caret R包。
caret包的目标是自动化评估和比较分类和回归机器学习算法的主要步骤。该库的主要优点在于,只需很少的代码和很少的手动配置即可实现许多目标。PyCaret库将这些能力带入了Python。
PyCaret是一个开源的、低代码的Python机器学习库,旨在缩短从假设到洞察的周期时间。它非常适合经验丰富的数据科学家,他们希望通过在工作流程中使用PyCaret来提高ML实验的生产力,也适合公民数据科学家以及刚接触数据科学且很少或没有编程背景的人。
PyCaret库自动化了机器学习项目的许多步骤,例如:
- 定义要执行的数据转换(setup())
- 评估和比较标准模型(compare_models())
- 调整模型超参数(tune_model())
以及更多功能,不仅限于创建集成、保存模型和部署模型。
PyCaret库提供了丰富的API使用文档,您可以在此处开始学习。
在本教程中,我们不会介绍该库的所有功能,而是专注于简单的机器学习模型比较和超参数调整。
您可以使用Python包管理器(如pip)来安装PyCaret。例如:
1 |
pip install pycaret |
安装完成后,我们可以通过打印已安装的版本号来确认该库在您的开发环境中可用并且正常工作。
1 2 3 |
# 检查pycaret版本 import pycaret print('PyCaret: %s' % pycaret.__version__) |
运行此示例将加载PyCaret库并打印已安装的版本号。
您的版本号应与此相同或更高。
1 |
PyCaret: 2.0.0 |
如果您需要有关在您的系统上安装PyCaret的帮助,请在此处查看安装说明。
现在我们已经了解了PyCaret是什么,让我们看看如何在机器学习项目中使用它。
声纳数据集
我们将使用Sonar标准二分类数据集。您可以在此处了解更多信息。
我们可以直接从URL下载数据集并将其加载为Pandas DataFrame。
1 2 3 4 5 6 7 |
... # 定义数据集位置 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv' # 加载数据集 df = read_csv(url, header=None) # 总结数据集的形状 print(df.shape) |
PyCaret似乎要求数据集具有列名,而我们的数据集没有列名,因此我们可以直接将列号设置为列名。
1 2 3 4 |
... # 将列名设置为列号 n_cols = df.shape[1] df.columns = [str(i) for i in range(n_cols)] |
最后,我们可以总结数据的前几行。
1 2 3 |
... # 总结数据的前几行 print(df.head()) |
将这些内容整合起来,下面列出了加载和总结Sonar数据集的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 加载sonar数据集 from pandas import read_csv # 定义数据集位置 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv' # 加载数据集 df = read_csv(url, header=None) # 总结数据集的形状 print(df.shape) # 将列名设置为列号 n_cols = df.shape[1] df.columns = [str(i) for i in range(n_cols)] # 总结数据的前几行 print(df.head()) |
运行此示例将首先加载数据集并报告其形状,显示它有208行和61列。
然后打印前五行,显示输入变量都是数字,目标变量是“60”列,具有字符串标签。
1 2 3 4 5 6 7 |
(208, 61) 0 1 2 3 4 ... 56 57 58 59 60 0 0.0200 0.0371 0.0428 0.0207 0.0954 ... 0.0180 0.0084 0.0090 0.0032 R 1 0.0453 0.0523 0.0843 0.0689 0.1183 ... 0.0140 0.0049 0.0052 0.0044 R 2 0.0262 0.0582 0.1099 0.1083 0.0974 ... 0.0316 0.0164 0.0095 0.0078 R 3 0.0100 0.0171 0.0623 0.0205 0.0205 ... 0.0050 0.0044 0.0040 0.0117 R 4 0.0762 0.0666 0.0481 0.0394 0.0590 ... 0.0072 0.0048 0.0107 0.0094 R |
接下来,我们可以使用PyCaret来评估和比较一套标准机器学习模型,以快速发现哪些模型在此数据集上表现良好。
PyCaret用于比较机器学习模型
在本节中,我们将评估和比较Sonar分类数据集上标准机器学习模型的性能。
首先,我们必须通过setup()函数将数据集与PyCaret库进行设置。这需要我们提供Pandas DataFrame并指定包含目标变量的列的名称。
setup()函数还允许您配置简单的数据预处理,例如缩放、幂变换、缺失数据处理和PCA转换。
我们将指定数据、目标变量,并关闭HTML输出、详细输出和用户反馈请求。
1 2 3 |
... # 设置数据集 grid = setup(data=df, target=df.columns[-1], html=False, silent=True, verbose=False) |
接下来,我们可以通过调用compare_models()函数来比较标准机器学习模型。
默认情况下,它将使用10折交叉验证来评估模型,按分类准确率对结果进行排序,并返回表现最佳的单个模型。
这些是合理的默认设置,我们无需更改任何内容。
1 2 3 |
... # 评估模型并比较模型 best = compare_models() |
调用compare_models()函数还将报告一个结果表,总结所有已评估的模型及其性能。
最后,我们可以报告表现最佳的模型及其配置。
将这些内容整合起来,下面列出了在Sonar分类数据集上评估一套标准模型所涉及的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 在sonar分类数据集上比较机器学习算法 from pandas import read_csv from pycaret.classification import setup from pycaret.classification import compare_models # 定义数据集位置 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv' # 加载数据集 df = read_csv(url, header=None) # 将列名设置为列号 n_cols = df.shape[1] df.columns = [str(i) for i in range(n_cols)] # 设置数据集 grid = setup(data=df, target=df.columns[-1], html=False, silent=True, verbose=False) # 评估模型并比较模型 best = compare_models() # 报告最佳模型 print(best) |
运行此示例将加载数据集,配置PyCaret库,评估一套标准模型,并报告为该数据集找到的最佳模型。
注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
在这种情况下,我们可以看到“Extra Trees Classifier”在数据集上具有最佳准确率,得分约为86.95%。
然后我们可以看到所用模型的配置,看起来它使用了默认的超参数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
模型 准确率 AUC 召回率 精确率 F1 \ 0 Extra Trees Classifier 0.8695 0.9497 0.8571 0.8778 0.8631 1 CatBoost Classifier 0.8695 0.9548 0.8143 0.9177 0.8508 2 Light Gradient Boosting Machine 0.8219 0.9096 0.8000 0.8327 0.8012 3 Gradient Boosting Classifier 0.8010 0.8801 0.7690 0.8110 0.7805 4 Ada Boost Classifier 0.8000 0.8474 0.7952 0.8071 0.7890 5 K Neighbors Classifier 0.7995 0.8613 0.7405 0.8276 0.7773 6 Extreme Gradient Boosting 0.7995 0.8934 0.7833 0.8095 0.7802 7 Random Forest Classifier 0.7662 0.8778 0.6976 0.8024 0.7345 8 Decision Tree Classifier 0.7533 0.7524 0.7119 0.7655 0.7213 9 Ridge Classifier 0.7448 0.0000 0.6952 0.7574 0.7135 10 Naive Bayes 0.7214 0.8159 0.8286 0.6700 0.7308 11 SVM - Linear Kernel 0.7181 0.0000 0.6286 0.7146 0.6309 12 Logistic Regression 0.7100 0.8104 0.6357 0.7263 0.6634 13 Linear Discriminant Analysis 0.6924 0.7510 0.6667 0.6762 0.6628 14 Quadratic Discriminant Analysis 0.5800 0.6308 0.1095 0.5000 0.1750 Kappa MCC TT (秒) 0 0.7383 0.7446 0.1415 1 0.7368 0.7552 1.9930 2 0.6410 0.6581 0.0134 3 0.5989 0.6090 0.1413 4 0.5979 0.6123 0.0726 5 0.5957 0.6038 0.0019 6 0.5970 0.6132 0.0287 7 0.5277 0.5438 0.1107 8 0.5028 0.5192 0.0035 9 0.4870 0.5003 0.0030 10 0.4488 0.4752 0.0019 11 0.4235 0.4609 0.0024 12 0.4143 0.4285 0.0059 13 0.3825 0.3927 0.0034 14 0.1172 0.1792 0.0033 ExtraTreesClassifier(bootstrap=False, ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, max_samples=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=-1, oob_score=False, random_state=2728, verbose=0, warm_start=False) |
我们可以直接使用此配置,并在整个数据集上拟合模型,然后用它来对新数据进行预测。
我们还可以使用结果表来了解在此数据集上表现良好的模型类型,在这种情况下,是决策树的集成。
现在我们已经熟悉了如何使用PyCaret比较机器学习模型,让我们看看如何使用该库来调整模型超参数。
调整机器学习模型
在本节中,我们将在Sonar分类数据集上调整机器学习模型的超参数。
我们需要像之前比较模型时一样加载和设置数据集。
1 2 3 |
... # 设置数据集 grid = setup(data=df, target=df.columns[-1], html=False, silent=True, verbose=False) |
我们可以使用PyCaret库中的tune_model()函数来调整模型超参数。
该函数将模型实例作为输入进行调整,并自动知道要调整哪些超参数。它会执行模型的随机超参数搜索,并通过“n_iter”参数控制评估的总次数。
默认情况下,该函数将优化“Accuracy”,并使用10折交叉验证来评估每个配置的性能,尽管这个合理的默认配置可以更改。
我们可以如下对Extra Trees Classifier执行随机搜索:
1 2 3 |
... # 调整模型超参数 best = tune_model(ExtraTreesClassifier(), n_iter=200) |
该函数将返回表现最佳的模型,该模型可直接使用,或打印出来以确定所选的超参数。
它还将打印出最佳配置在k折交叉验证(例如10折)中的表现结果表。
将这些内容整合起来,下面列出了在Sonar数据集上调整Extra Trees Classifier的超参数的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 在sonar分类数据集上调整模型超参数 from pandas import read_csv from sklearn.ensemble import ExtraTreesClassifier from pycaret.classification import setup from pycaret.classification import tune_model # 定义数据集位置 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv' # 加载数据集 df = read_csv(url, header=None) # 将列名设置为列号 n_cols = df.shape[1] df.columns = [str(i) for i in range(n_cols)] # 设置数据集 grid = setup(data=df, target=df.columns[-1], html=False, silent=True, verbose=False) # 调整模型超参数 best = tune_model(ExtraTreesClassifier(), n_iter=200, choose_better=True) # 报告最佳模型 print(best) |
运行此示例将首先加载数据集并配置PyCaret库。
然后执行网格搜索,报告最佳配置在10折交叉验证中的表现以及平均准确率。
注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
在这种情况下,我们可以看到随机搜索找到的配置的准确率为75.29%,不如上一节中默认配置的86.95%。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
准确率 AUC 召回率 精确率 F1 Kappa MCC 0 0.8667 1.0000 1.0000 0.7778 0.8750 0.7368 0.7638 1 0.6667 0.8393 0.4286 0.7500 0.5455 0.3119 0.3425 2 0.6667 0.8036 0.2857 1.0000 0.4444 0.2991 0.4193 3 0.7333 0.7321 0.4286 1.0000 0.6000 0.4444 0.5345 4 0.6667 0.5714 0.2857 1.0000 0.4444 0.2991 0.4193 5 0.8571 0.8750 0.6667 1.0000 0.8000 0.6957 0.7303 6 0.8571 0.9583 0.6667 1.0000 0.8000 0.6957 0.7303 7 0.7857 0.8776 0.5714 1.0000 0.7273 0.5714 0.6325 8 0.6429 0.7959 0.2857 1.0000 0.4444 0.2857 0.4082 9 0.7857 0.8163 0.5714 1.0000 0.7273 0.5714 0.6325 平均 0.7529 0.8270 0.5190 0.9528 0.6408 0.4911 0.5613 标准差 0.0846 0.1132 0.2145 0.0946 0.1571 0.1753 0.1485 ExtraTreesClassifier(bootstrap=False, ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=1, max_features='auto', max_leaf_nodes=None, max_samples=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=4, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=120, n_jobs=None, oob_score=False, random_state=None, verbose=0, warm_start=False) |
通过向tune_model()函数指定要搜索的超参数和搜索范围,我们也许可以改进网格搜索。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在本教程中,您了解了PyCaret这个开源的Python机器学习库。
具体来说,你学到了:
- PyCaret是R语言中流行且广泛使用的caret机器学习包的Python版本。
- 如何使用PyCaret轻松评估和比较数据集上的标准机器学习模型。
- 如何使用PyCaret轻松调整表现良好的机器学习模型的超参数。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
PyCaret 对初学者和懒惰的程序员来说真是个巨大的福音。感谢分享。
不客气!
嗨,Jason,
很喜欢您的工作!我对pycaret是新手,那么我们如何将上面的内容与训练和测试数据一起使用呢?谢谢!
#将数据分割为95%和5%
data = dataset.sample(frac=0.95, random_state=786).reset_index(drop=True)
data_unseen = dataset.drop(data.index).reset_index(drop=True)
谢谢!
好问题,也许你可以查阅setup()函数的文档,看看如何指定自定义的训练/测试集。
https://pycaret.cn/classification/
在我的例子中,LGBMClassifier以0.8552的准确率获胜。我想知道在调参之前如何查看超参数的值?
你可以查阅文档了解默认的模型超参数,或者打印模型对象来查看使用了哪些超参数。
你好Jason,感谢分享这个不错的Pycaret快速入门指南。我想知道Pycaret是否能够处理无法容纳为单个pandas DataFrame的大型数据集(即大数据)?
不客气。
我不这么认为,但或许可以查阅文档。
谢谢Jason分享。我用他们的调参功能一直得到更差的结果,这有点令人费解。我很难相信这不是一个bug。
此外,我仍然喜欢用sklearn做很多自己的数据准备,因为我觉得pycaret缺乏透明度和功能。但你认为我们是否正朝着这样的方向发展,即这些框架正在自动化我们这些老派数据科学家从头开始做的一切?
我也喜欢自己动手。
是的,我认为 AutoML 工具和框架开始取代内存数据集的手动工作。
你好 Jason,
感谢提供如此有用的信息。非常棒!!
正如我所见,Pycaret以ACC、AUC等分类指标或MAE回归指标提供最终结果。
是否有选项可以获得预测标签(分类)和预测值(回归)?
谢谢你,
Iman
不客气。
我不知道,抱歉。
许多机器学习程序会为二元类别生成性能指标,例如心脏病和无心脏病。在PyCaret的情况下,您将target = target column设置为目标,但我没有看到预测单个类别的方法。在医学领域,您最常希望预测少数类别。当您查看PyCaret中的ROC曲线时,类别=0和类别=1的AUC总是相同的。我错过了什么?
ROC曲线和AUC始终是针对正类的。这可能会有帮助。
https://machinelearning.org.cn/roc-curves-and-precision-recall-curves-for-imbalanced-classification/