利用pycaret:低代码,自动化机器学习框架解决分类问题
之前我介绍了利用pycaret来解决回归问题的博客,有兴趣的朋友可以查看我之前的博客,今天我再来介绍一下关于使用pycaret来解决分类问题,首先我们还是来简单介绍一下pycaret框架的基础知识:PyCaret 是 Python 中的一个开源、低代码机器学习库,它可以自动执行机器学习工作流。它是一种端到端的机器学习和模型管理工具,它可成倍的提高您的工作效率。与其他开源机器学习库相比,PyCare
之前我介绍了利用pycaret来解决回归问题的博客,有兴趣的朋友可以查看我之前的博客,今天我再来介绍一下关于使用pycaret来解决分类问题,首先我们还是来简单介绍一下pycaret框架的基础知识:PyCaret 是 Python 中的一个开源、低代码机器学习库,它可以自动执行机器学习工作流。它是一种端到端的机器学习和模型管理工具,它可成倍的提高您的工作效率。与其他开源机器学习库相比,PyCaret 是一个低代码的机器学习框架,可用于仅用几行代码替换您之前写的几百行代码。这使得开发过程以指数方式快速和高效。PyCaret 本质上是几个机器学习库和框架的 Python 包装器,例如 scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray 等等。今天我们通过一个简单的二分类的例子来看看pycaret有多么强大!
PyCaret 中的模块
PyCaret 是一个模块化库,按模块排列,每个模块代表一个机器学习用例。当前Pycaret支持以下功能模块:分类、聚类、回归、时间序列、NLP、异常探测等。
安装Pycaret
安装 PyCaret 非常简单,可以使用以下的命令。但是强烈建议使用虚拟环境来避免与其他库的潜在冲突。
pip install pycaret
分类问题的pycaret的解决方案
与之前解决分类问题类似,Pycaret解决回归问题一般以下几个步骤:
- Getting Data:从 PyCaret 存储库导入模拟数据,或者也可以读取外部真实数据
- Setting up Environment:在 PyCaret 中设置算法环境并开始构建回归模型
- Compare Model: 比较所有内置的算法模型以评估性能。
- Create Model:创建模型、执行交叉验证和评估回归指标
- Tune Model:自动调优回归模型的超参数
- Plot Model:使用各种绘图分析模型性能
- Finalize Model:在模型训练结束时确定最佳模型
- Predict Model:对新的/看不见的数据进行预测
- Save / Load Model:保存/加载模型以供将来使用
1.数据
今天我们要使用美国“威斯康星乳腺癌(诊断)数据集”,该数据集目前已经集成到了sklearn框架中,我们只要使用sklearn.datasets.load_breast_cancer命令就可以加载该数据集。
from sklearn import datasets
data = datasets.load_breast_cancer(as_frame=True)
df=data['frame']
df
"target"字段是我们的目标变量,其它所有的字段都是“特征变量”,我们查看一下所有字段的类型
df.info()
数据看上去比较完整,没有存在数据缺失的情况,接下来我们查看一下目标变量"target"的分布情况
df.target.value_counts().reset_index().plot.bar(x='index',y='target');
2.设置环境(setup)
在设置环境之前我们从整个数据集中随机抽取一小部分数据(如10%的数据),作为测试数据集,这部分数据不参与模型训练,将剩余的数据(90%的数据)用来训练模型。在执行setup()时会将这90%的数据被按70%和30%的比例进行了拆分,其中70%的数据用来做交叉训练,另外30%的数据用来做验证。
data = df.sample(frac=0.9, random_state=786)
data_unseen = df.drop(data.index)
data.reset_index(drop=True, inplace=True)
data_unseen.reset_index(drop=True, inplace=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))
这里我们随机抽取了57条数据作为测试集,这些数据不参与模型训练,当算法模型训练好以后我们要用这部分数据来验证模型分类的准确度。我们将剩余的512条数据来训练模型。
接下来我们使用setup() 函数初始化 pycaret 中的环境,并创建转换管道以准备数据并进行建模和部署。 setup() 必须在执行 pycaret 中第一个被调用的方法。它需要两个强制性参数:pandas 的dataframe和目标列的名称。这里明确一下我们的目标列是“target”字段,其他所有其他参数都是可选的。
执行 setup() 时,PyCaret 的内置推理算法将根据某些属性自动推断所有特征的数据类型。一般情况下能正确推断所有字段的数据类型,但有时候也会出错。为了解决这个问题,PyCaret 会在 setup() 执行后显示一个包含特征及其推断数据类型的表。如果所有的数据类型都被正确识别,可以按 Enter 键继续或键入 quit 键退出setup。确保数据类型正确在 PyCaret 中至关重要,因为它会自动执行一些预处理任务,这些任务对于任何机器学习算法来说都是必不可少的。对于每种数据类型,这些任务的执行方式不同,这意味着正确配置它们非常重要。在以后的教程中,我们将学习如何使用 setup() 中的 numeric_features 和 categorical_features 参数覆盖 PyCaret 的推断数据类型。
from pycaret.classification import *
setup(data = data, target = 'target', session_id=123)
成功执行setup()后,它会打印出一些和数据预处理有关的信息。下面我们说明一下这些信息中的一些主要信息的含义:
- session_id:一个伪随机数,作为种子分布在所有函数中,以供以后重现。如果没有传递 session_id,则会自动生成一个随机数,分发给所有函数。
- Target Type :它会自动识别出我们的目标变量中有多少个分类,在本例中只有0和1两个类所以是二分类Binary。
- Label Encoded:当目标变量是字符串类型(即“是”或“否”)而不是 1 或 0 时,它会自动将标签编码为 1 和 0,并显示映射(0:否,1:是)以供参考。 在本例中,不需要标签编码,因为目标变量是数字类型的0和1。
- Original Data:显示数据集的原始形状。在本例中 (512, 31) 表示 512个样本和 31个特征,包括目标列。
- Missing Values:当原始数据中存在缺失值时,则会显示为 True。在本例中,数据集中不存在缺失值,故显示为False。
- Numeric Features:推断为数字类型的特征数量。在本例中,除目标变量以为的所有特征变量均为数字类型所以数字特征变量的数量是30
- Categorical Features:推断为分类型的特征数量。在本例中不存在分类型变量所以是0
- Transformed Train Set:70%的训练集数据,表示经过转换后的训练集的形状,所谓转换后的训练集是指对数据集中的分类型特征(Categorical Features)和数字型特征(Numeric Features)做了一些预处理的操作,比如对分类型特征做one-hot编码,对数字型特征会删除线性相关的特征,在本例中由于都是数字型特征,所以做了删除线性相关的操后的尺寸是(358, 29),原来的数字特征列的数量是30,这说明有一个线性相关的字段被删除了。
- Transformed Test Set:30%的验证集数据,表示验证集经过转换后的形状,含义和上面的类似,只不过维度为:(154, 29)。,
注意一些必须执行数据预处理步骤例如缺失值补全、分类编码(one-hot),删除线性相关列等,setup()已经自动替你完成, 不需要任何人为操作,这大大节省了大家的开发时间。这里还要说明的是 setup() 中的参数是可选的,在本例中在setup()中除了两个必要的参数以外,其余参数我们都采用了默认参数,关于参数的详细说明请参阅pycaret官方文档。
3.比较模型(Compare Model)
在执行完setup()后,一般需要进行compare_models()操作,compare_models()的功能是比较模型库中所有模型以评估性能。(如果你明确知道哪个模型性能最好也可以不执行compare_mode,直接执行后续的create_model(),但通常情况大多数人都不会事先知道哪种模型性能最好)compare_models方法会训练模型库中的所有分类模型,并使用分层交叉验证对它们进行评分以便进行度量评估。 输出一个表格,显示Accuracy、AUC、Recall、Precision、F1、Kappa 、 MCC 等指标的评估值以及训练时间,这其中用高亮(黄色)标记出了各个指标最优的评估值。
best_model = compare_models()
这里使用了一行简单的代码,就完成了使用交叉验证训练和评估了 14 个内置的分类器模型。 上面打印的分数表格突出显示了性能最高的指标(黄色),这仅用于比较各个模型性能。在 默认情况下,表格中使用“Accuracy(准确度)",(从最高到最低)进行排序,这可以通过传递排序参数进行更改。 例如 compare_models(sort = 'Recall') 将按 Recall 而不是 Accuracy 对表格进行排序。 如果要将 fold 参数从默认值 10 更改为不同的值,则可以使用 fold 参数。 例如 compare_models(fold = 5) 将使用 5 折交叉验证来训练和比较所有模型。 减少fold将改善(减少)训练时间。 默认情况下, compare_models 根据默认排序顺序返回性能最佳的模型,但可用于通过使用 n_select 参数返回前 N 个模型的列表。
print(best_model)
上面显示了性能最优的模型为随机森林分类器(Random Forest Classifier),以及它的相关参数。
4.创建模型(create model)
执行完compare_models()后我们大致清楚那些模型的性能比较优秀,接下来我们可以使用create_model()方法来创建指定的算法模型,在创建指定的算法模型时任何会执行交叉验证来评估指定模型的性能。这里我们还能使用models()方法来罗列出pycaret所有的内置分类器:
models()
接下来我们根据compare_model()的评估结果并用create_model方法来创建一个性能最优的模型:随机森林分类器(Random Forest Classifier, rf)
rf= create_model('rf')
上面是经过默认的10折(fold)交叉验证后的评估结果,这个评估结果与 compare_models()结果中的第一条是完全一致的。与 compare_models() 类似,如果要将 fold 参数从默认值 10 更改为不同的值,则可以使用 fold 参数。 例如:create_model('rf', fold = 5) 将使用 5 折分层 CV 创建决策树分类器。
5.模型调优(Tune Model)
当使用 create_model 函数创建模型时,它使用默认超参数来训练模型。 为了调整模型的超参数,我们需要使用了 tune_model 函数。 此函数使用随机网格搜索(Random Grid Search)在预定义的搜索空间上自动调整模型的超参数。 最后输出打印一个分数表格,按交叉验证的顺序显示Accuracy、AUC、Recall、Precision、F1、Kappa 、 MCC等评估指标的结果。
tuned_rf = tune_model(rf)
在默认情况下tune_model()方法的迭代次数为10次,这意味着最多需要 10 次迭代才能找到超参数的最佳值。 增加迭代次数可能会提高性能,但也会增加训练时间。可以在tune_model()方法中设置n_iter参数如:tune_model(rf, n_iter = 50)。一般情况下经过超参数调优的模型性能要优于使用默认参数的模型。
这里还需要说明一点,在默认迭代次数下模型调优结果未必是最优的,有时候调优的结果会比默认参数的模型还要差,究其原因可能在迭代次数过少造成的,此时可以增加迭代次数后重新调试,但有时候为了避免模型调优时间过长,在调优模型性能比默认参数模型性能要差的情况下,优先选择默认参数模型。比如在本例中默认参数模型rf的Accuracy指标为0.9665(越大越好,1为最优),而经过参数调优的模型tuned_rf 的Accuracy指标为0.9637,显然默认参数模型rf的性能要优于调优模型tuned_rf,因此在这里我们的后续操作仍然使用默认参数模型rf,而放弃调优模型tuned_rf。
6.模型可视化(Plot Model)
在模型最终确定之前,plot_model() 函数可用于分析不同方面的性能,例如 AUC、confusion_matrix、决策边界等。该函数采用经过训练的模型对象并返回基于测试/保留集的图。
关于AUC等评估指标的解释请参考我之前写过的一篇博客
6.1 AUC Plot
6.2 Precision-Recall Curve
6.3 Feature Importance Plot
6.4 Confusion Matrix(混淆矩阵)
分析模型性能的另一种方法是使用 evaluate_model() 函数,该函数显示给定模型的所有可用图的用户界面。
evaluate_model(rf)
6.5 查看在验证集上的预测结果
在最终确定模型之前,建议通过预测验证集并查看评估指标来完成最终的模型检查步骤。 在前面setup()设置算法环境的时候,训练数据被按70%和30%的比例进行了拆分,其中70%的数据用来做交叉训练,另外30%的数据用来做验证。如果想改变训练集合验证集的比例,可以在执行setup时指定train_size参数,在本例中 30%(154 个样本)的数据已作为验证集样本分离出来。 我们在上面看到的所有评估指标都是仅基于训练集 (70%,358个样本) 的交叉验证结果。 现在,使用已创建的 rf 模型实例来预测验证集并评估模型性能。
predict_model(rf);
从上面的结果中我们发现对验证集的预测Accuracy为0.9675,而我们在通过交叉验证的create_model('rf')时的Accuracy为0.9665, 显然这两者有细微的差异,但不是明显的差异,如果预测验证的结果和通过交叉验证的create_model或者tune_model的结果之间存在很大差异,则这通常表明过度拟合,但也可能是由于其他几个因素,需要进一步调查。
7.确定最终模型(Finalize Model)
模型定型是建模的最后一步。 PyCaret 中的正常机器学习工作流程从 setup() 开始,然后使用 compare_models() 比较所有模型,并列出一些候选模型(基于感兴趣的指标)以执行多种建模技术,例如超参数调整、集成、堆叠等 . 此工作流程最终将引导您找到用于对未知数据进行预测的最佳模型。 finalize_model() 函数将模型拟合到完整的数据集上,包括验证集(setup中拆分出来的30%数据)此功能的目的是在将模型部署到生产环境之前在完整数据集上训练模型。下面我们将执行finalize_model(),并打印出算法模型中使用的超参数:
final_rf = finalize_model(rf)
print(rf)
注意: 在执行 finalize_model() 时包括训练集和验证集在内的整个数据集将用于训练。 因此,如果在使用 finalize_model() 后的模型用于对验证集的预测,则打印的出来的评估指标将具有误导性,因为您预测的数据是在训练模型时使用的数据由此产生的评估结果将由欺骗性。
下面我们来演示一下这种欺骗性,我们用 final_rf模型来预测验证集中的数据:
predict_model(final_rf);
我们对30%的验证集进行预测后得到了100%的准确率,这是因为我们执行了finalize_model操作,该方法让模型在整个数据集上进行了训练,也就是说验证集的数据也参与了训练,所以再对验证集进行预测会得到一个非常高的Accuracy,但是这不具有参考性,因为被预测对象实际参与了模型训练。
8.对未知数据的预测
predict_model() 方法也用于在未见过的数据集上进行预测。 与上面的唯一区别是,这次我们将传递 data参数,我们需要将未知数据传递给predict_model方法。 data_unseen 是在之前创建的变量,它包含从未暴露给 PyCaret 的原始数据集的 10%的数据(57个样本)。
unseen_predictions = predict_model(final_rf, data=data_unseen)
unseen_predictions.head()
在执行了predict_model方法后,data_unseen 数据集中被添加了两列:Label和Score,其中Label表示预测的结果,而Score表示预测结果的概率。同时我们也得到了在data_unseen中的Accuracy为0.9649。
9.保存/加载模型
我们可以使用save_model方法将我们最终模型保存在磁盘中(生成pkl文件),当有新的未知数据产生时,我们还可以使用load_model方法加载磁盘上的模型文件生成一个模型的实例来对未知数据进行预测。
#保存模型
save_model(final_rf,'my_final_rf')
#加载模型,并对未知数据进行预测
my_final_rf = load_model('my_final_rf')
new_prediction = predict_model(my_final_rf, data=data_unseen)
new_prediction.head(10)
总结
本教程涵盖了从数据预处理、模型训练、超参数调整、预测和保存模型以供以后使用的整个机器学习算法的过程。 我们在不到 10 个命令中完成了所有这些步骤,例如compare_models() create_model()、tune_model()。 在大多数机器学习类库中,如果不使用 PyCaret来实现机器学习算法,将至少需要 100 多行代码,尤其是在特征的选择和特征的预处理的过程会非常的繁琐。
在这里我们只介绍 pycaret.classification的基础知识。 在接下来的教程中,我们将更深入地介绍高级预处理、集成、广义堆叠和其他技术。
参考资料
更多推荐
所有评论(0)