【PyCaret】使用PyCaret创建机器学习Pipeline进行多分类任务

  发现一个好东西,PyCaret机器学习Pipeline,记录一下用其进行多分类任务的使用方法。


1、简介

  PyCaret是一个开源的、不用写很多代码的Python机器学习库,可以自动化机器学习工作流程,是一个端到端的机器学习和模型管理工具,可以成倍地加快实验周期,提高工作效率。

  PyCaret本质上是几个机器学习库和框架的封装,比如scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray等等。

  一字诗:棒~


2、安装PyCaret

安装命令:

python 复制代码
pip install pycaret

安装后测试:

python 复制代码
import pycaret
pycaret.__version__
'3.3.0'

3、PyCaret建模

  PyCaret中一个典型的工作流程由以下5个步骤组成:

  Setup ➡️ Compare Models ➡️ Analyze Model ➡️ Prediction ➡️ Save Model

首先,从pycaret数据集模块加载样本数据集(鸢尾花)

python 复制代码
from pycaret.datasets import get_data
data = get_data('iris')

非常不幸,在第一步就夭折了...

报错: requests.exceptions.ConnectionError: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443): Max retries exceeded with url: /pycaret/datasets/main/data/common/iris.csv (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000224EF2D0C40>: Failed to establish a new connection: Errno 11004 getaddrinfo failed'))

原因: https://raw.githubusercontent.com/pycaret/datasets/main/ 这个网址打不开,咋办呢,没有条件创造条件也要上...

解决: 发现 get_data('iris') 加载的数据集应该是如下的 dataframe 形式,一般情况下自己的数据集应该也是这样子的,因此我们把 sklearn.datasets 的鸢尾花数据集重建为 dataframe 形式就可以啦~

数据集构建代码:

python 复制代码
from sklearn.datasets import load_iris
import pandas as pd
target = load_iris().target
target_names = load_iris().target_names
mapping = {'0': target_names[0], '1': target_names[1], '2': target_names[2]}
df_data = pd.DataFrame(load_iris().data, columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
target_str = pd.DataFrame([mapping[str(num)] for num in target], columns=['species'])
data = pd.concat([df_data, target_str], axis=1)

检查一下数据格式:

完美,可以继续啦~

3.1 Setup

  Setup函数初始化训练环境并创建transformation pipeline。Setup函数必须在执行PyCaret中的任何其他函数之前调用,只有两个必需的参数,data和target,其他参数均为可选参数。

python 复制代码
from pycaret.classification import *
s = setup(data, target = 'species', session_id = 123)

Setup成功执行后,会显示以下实验信息:

信息说明:

  (1)Session id:随机数种子;

  (2)Target type:自动检测目标类型,二分类、多分类还是回归;

  (3)Target mapping:标签编码,字符串映射为0、1;

  (4)Original data shape:原始数据大小;

  (5)Transformed train set shape:训练集大小;

  (6)Transformed test set shape:测试集大小;

  (7)Numeric features:数字特征的数量;

3.2 Compare Models

  compare_models函数使用交叉验证训练和评估模型库中可用模型的性能,其输出是平均交叉验证分数。

比较基线模型:

python 复制代码
best = compare_models()

输出默认按ACC排序:

打印最优模型:

python 复制代码
print(best)

输出为最优模型的参数:

python 复制代码
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=1000,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=123, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)

我靠,发没发现,又出问题了,AUC怎么不显示啊啊啊啊啊...学习的路上总是充满坎坷...

调查了一下这个问题,发现这是一个很新的问题,但似乎并没有被解决,大家可以去看看,似乎是我的 PyCaret == 3.3.0 和 scikit-learn==1.4.1.post1 不太匹配的问题:
https://github.com/pycaret/pycaret/pull/3935
https://github.com/pycaret/pycaret/issues/3932

倔强的我,在linux环境中重新配了PyCaret == 3.2.0, scikit-learn==1.0.2,这下可以显示AUC了,舒服了~

后面哪位朋友解决了3.3.0的AUC不显示问题,记得踢我一下喔~

3.3 Analyze Model

(1)画混淆矩阵

python 复制代码
plot_model(best, plot = 'confusion_matrix')

(2)画AUC曲线

python 复制代码
plot_model(best, plot = 'auc')

这时候AUC又行了...显着你了...估计前面是哪传参数有问题...

(3)画特征重要性

python 复制代码
plot_model(best, plot = 'feature')

3.4 Prediction

  predict_model函数返回 prediction_label 和 prediction_score(预测类的概率)作为数据表中新的列。当data为None(默认)时,它使用测试集(在setup函数期间创建)进行评分。

python 复制代码
holdout_pred = predict_model(best)

指标结果:


返回的dataframe:

3.5 Save Model

  使用pycaret的save_model函数将整个Pipeline进行保存

python 复制代码
save_model(best, 'iris_pipeline')

保存后是一个pkl文件:

保存后的模型再加载:

python 复制代码
loaded_best_pipeline = load_model('iris_pipeline')

4、代码整合

python 复制代码
from sklearn.datasets import load_iris
import pandas as pd
from pycaret.classification import *

# 数据集加载
target = load_iris().target
target_names = load_iris().target_names
mapping = {'0': target_names[0], '1': target_names[1], '2': target_names[2]}
df_data = pd.DataFrame(load_iris().data, columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
target_str = pd.DataFrame([mapping[str(num)] for num in target], columns=['species'])
data = pd.concat([df_data, target_str], axis=1)

# Setup
s = setup(data, target='species', session_id=123)

# Compare Models
best = compare_models()
print(best)

# Analyze Model
plot_model(best, plot = 'confusion_matrix')
plot_model(best, plot = 'auc')
plot_model(best, plot = 'feature')

# Prediction
holdout_pred = predict_model(best)

# Save Model
save_model(best, 'iris_pipeline')

# Load Model
loaded_best_pipeline = load_model('iris_pipeline')

代码是非常简洁明了的,但封装的太好了,有些想改的也不好改了~


参考资料:PyCaret Multiclass Classification Tutorial

更多学习:用PyCaret创建整个机器学习管道

PyCaret的github仓库:https://github.com/pycaret/pycaret/tree/master


最后说一句,PyCaret的Pipeline还是用JupyterLab运行最舒服,Spyter运行不显示,Pycharm运行不好看...

相关推荐
长夜多忧思22 分钟前
机器学习_批量梯度下降法(BGD)
机器学习·批量梯度下降法
renhongxia132 分钟前
原生多模态对应用架构的重塑
人工智能·深度学习·机器学习·自然语言处理·架构·机器人
金融小师妹41 分钟前
人工智能推演框架:非农降温信号如何重构黄金定价模型
数据结构·人工智能·机器学习·transformer
2601_962344622 小时前
计算机毕业设计之基于大数据的投保数据的分析系统的设计与实现
大数据·人工智能·深度学习·机器学习·信息可视化·小程序·课程设计
星马梦缘2 小时前
机器学习与模式识别 第八章 MAP与偏方差 模拟卷及答案
人工智能·机器学习·map·岭回归·mle·双重下降
JackHCC3 小时前
自进化智能体协同进化综述
人工智能·机器学习
星马梦缘3 小时前
机器学习与模式识别 第十二章 自适应学习优化器 考点压缩
人工智能·机器学习·优化器·sgd·adam·rmsprop
qcx234 小时前
Agentic RAG不止能回答问题,已经能自动修复真实CVE漏洞了
人工智能·机器学习·ai·llm·脑信号
jaychouchannel4 小时前
RecursiveCharacterTextSplitter 中文切分隐形缺陷:重叠、断语义、列表割裂完整复现与修复
人工智能·机器学习
天佑木枫5 小时前
AI:AI 开车撞了人,谁赔钱?——自动驾驶的法律黑洞
人工智能·机器学习·自动驾驶