发现一个好东西,PyCaret机器学习Pipeline,记录一下用其进行多分类任务的使用方法。
1、简介
PyCaret是一个开源的、不用写很多代码的Python机器学习库,可以自动化机器学习工作流程,是一个端到端的机器学习和模型管理工具,可以成倍地加快实验周期,提高工作效率。
PyCaret本质上是几个机器学习库和框架的封装,比如scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray等等。
一字诗:棒~
2、安装PyCaret
安装命令:
pip install pycaret
安装后测试:
import pycaret
pycaret.__version__
'3.3.0'
3、PyCaret建模
PyCaret中一个典型的工作流程由以下5个步骤组成:
Setup ➡️ Compare Models ➡️ Analyze Model ➡️ Prediction ➡️ Save Model
首先,从pycaret数据集模块加载样本数据集(鸢尾花)
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 形式就可以啦~
数据集构建代码:
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,其他参数均为可选参数。
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函数使用交叉验证训练和评估模型库中可用模型的性能,其输出是平均交叉验证分数。
比较基线模型:
best = compare_models()
输出默认按ACC排序:
打印最优模型:
print(best)
输出为最优模型的参数:
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)画混淆矩阵
plot_model(best, plot = 'confusion_matrix')
(2)画AUC曲线
plot_model(best, plot = 'auc')
这时候AUC又行了…显着你了…估计前面是哪传参数有问题…
(3)画特征重要性
plot_model(best, plot = 'feature')
3.4 Prediction
predict_model函数返回 prediction_label 和 prediction_score(预测类的概率)作为数据表中新的列。当data为None(默认)时,它使用测试集(在setup函数期间创建)进行评分。
holdout_pred = predict_model(best)
指标结果:
返回的dataframe:
3.5 Save Model
使用pycaret的save_model函数将整个Pipeline进行保存
save_model(best, 'iris_pipeline')
保存后是一个pkl文件:
保存后的模型再加载:
loaded_best_pipeline = load_model('iris_pipeline')
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')
代码是非常简洁明了的,但封装的太好了,有些想改的也不好改了~
参考资料:PyCaret Multiclass Classification Tutorial
更多学习:用PyCaret创建整个机器学习管道
PyCaret的github仓库:https://github.com/pycaret/pycaret/tree/master
最后说一句,PyCaret的Pipeline还是用JupyterLab运行最舒服,Spyter运行不显示,Pycharm运行不好看…