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

相关推荐
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
martian6651 小时前
【人工智能数学基础篇】——深入详解多变量微积分:在机器学习模型中优化损失函数时应用
人工智能·机器学习·微积分·数学基础
人机与认知实验室2 小时前
人、机、环境中各有其神经网络系统
人工智能·深度学习·神经网络·机器学习
古希腊掌管学习的神6 小时前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
海棠AI实验室8 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
IT古董9 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
落魄君子9 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
四口鲸鱼爱吃盐9 小时前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类
落魄君子9 小时前
ELM分类-单隐藏层前馈神经网络(Single Hidden Layer Feedforward Neural Network, SLFN)
神经网络·分类·数据挖掘
睡觉狂魔er9 小时前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶