当前位置:   article > 正文

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

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

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


1、简介

  PyCaret是一个开源的、不用写很多代码的Python机器学习库,可以自动化机器学习工作流程,是一个端到端的机器学习和模型管理工具,可以成倍地加快实验周期,提高工作效率。
  PyCaret本质上是几个机器学习库和框架的封装,比如scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray等等。
  一字诗:棒~


2、安装PyCaret

安装命令:

pip install pycaret
  • 1

安装后测试:

import pycaret
pycaret.__version__
'3.3.0'
  • 1
  • 2
  • 3

3、PyCaret建模

  PyCaret中一个典型的工作流程由以下5个步骤组成:
  Setup ➡️ Compare Models ➡️ Analyze Model ➡️ Prediction ➡️ Save Model

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

from pycaret.datasets import get_data
data = get_data('iris')
  • 1
  • 2

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

报错: 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 形式就可以啦~

在这里插入图片描述

数据集构建代码:

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

检查一下数据格式:

在这里插入图片描述

完美,可以继续啦~

3.1 Setup

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

from pycaret.classification import *
s = setup(data, target = 'species', session_id = 123)
  • 1
  • 2

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函数使用交叉验证训练和评估模型库中可用模型的性能,其输出是平均交叉验证分数。

比较基线模型:

best = compare_models()
  • 1

输出默认按ACC排序:

在这里插入图片描述
打印最优模型:

print(best)
  • 1

输出为最优模型的参数:

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)
  • 1
  • 2
  • 3
  • 4
  • 5

我靠,发没发现,又出问题了,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)画混淆矩阵

plot_model(best, plot = 'confusion_matrix')
  • 1

在这里插入图片描述
(2)画AUC曲线

plot_model(best, plot = 'auc')
  • 1

在这里插入图片描述

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

(3)画特征重要性

plot_model(best, plot = 'feature')
  • 1

在这里插入图片描述

3.4 Prediction

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

holdout_pred = predict_model(best)
  • 1

指标结果:

在这里插入图片描述
返回的dataframe:

在这里插入图片描述

3.5 Save Model

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

save_model(best, 'iris_pipeline')
  • 1

保存后是一个pkl文件:

在这里插入图片描述

保存后的模型再加载:

loaded_best_pipeline = load_model('iris_pipeline')
  • 1

4、代码整合

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')
  • 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

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


参考资料:PyCaret Multiclass Classification Tutorial
更多学习:用PyCaret创建整个机器学习管道
PyCaret的github仓库:https://github.com/pycaret/pycaret/tree/master


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/286424
推荐阅读
相关标签
  

闽ICP备14008679号