【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运行不好看...

相关推荐
2301_783360137 小时前
R语言机器学习系列|随机森林模型特征重要性排序的R语言实现
随机森林·机器学习·r语言
源码之家7 小时前
机器学习:基于python租房推荐系统 预测算法 协同过滤推荐算法 房源信息 可视化 机器学习-线性回归预测模型 Flask框架(源码+文档)✅
大数据·python·算法·机器学习·数据分析·线性回归·推荐算法
小狗照亮每一天12 小时前
【菜狗看背景】自动驾驶发展背景——20251117
人工智能·机器学习·自动驾驶
大白IT12 小时前
智能驾驶:从感知到规控的自动驾驶系统全解析
人工智能·机器学习·自动驾驶
数据与后端架构提升之路12 小时前
英伟达的 Alpamayo-R1:利用因果链推理赋能自动驾驶模型和数据工程剖析
人工智能·机器学习·自动驾驶
致Great12 小时前
RAG在医疗领域的批判性评估、推荐算法等最新研究进展
算法·机器学习·推荐算法
java1234_小锋14 小时前
[免费]基于python的Flask+Vue医疗疾病数据分析大屏可视化系统(机器学习随机森林算法+requests)【论文+源码+SQL脚本】
python·机器学习·数据分析·flask·疾病数据分析
权泽谦15 小时前
Java 在机器学习中的应用:基于 DL4J 与 Weka 的完整实战案例
java·机器学习·数据挖掘
江塘15 小时前
机器学习-决策树多种生成方法讲解及实战代码讲解(C++/Python实现)
c++·python·决策树·机器学习
木头左16 小时前
机器学习用于股票预测的策略
人工智能·机器学习