
在 PyCaret 中构建自定义模型管道:从数据准备到生产
图片来源:Editor | Canva
在 PyCaret 中构建自定义模型管道可以使机器学习更加轻松。PyCaret 能够自动化许多步骤,包括数据准备和模型训练。它还可以让你创建和使用自己的自定义模型。
在本文中,我们将一步一步地使用 PyCaret 构建自定义机器学习管道。
什么是 PyCaret?
PyCaret 是一个自动化机器学习工作流的工具。它处理重复性任务,如数据缩放、变量编码和超参数调优。PyCaret 支持许多机器学习任务,包括
- 分类(预测类别)
- 回归(预测数字)
- 聚类(数据分组)
- 异常检测(识别离群值)
PyCaret 与 scikit-learn、XGBoost 和 LightGBM 等流行库配合良好。
设置环境
首先,使用 pip 安装 PyCaret
1 |
pip install pycaret |
接下来,导入适合你任务的模块
1 2 |
from pycaret.classification import * # 用于分类任务 from pycaret.regression import * # 用于回归任务 |
准备数据
在开始机器学习项目之前,你需要准备数据。PyCaret 与 Pandas 配合良好,这种组合可以帮助你进行数据准备。
以下是加载和探索 Iris 数据集的方法
1 2 3 4 5 6 |
from sklearn.datasets import load_iris import pandas as pd iris = load_iris() data = pd.DataFrame(iris.data, columns=iris.feature_names) data['target'] = iris.target |
确保你的数据是干净的,并且包含一个目标列——在我们的例子中,这是 iris.target。这是你想预测的变量。
设置 PyCaret 环境
PyCaret 的 setup() 函数可以为你的数据进行训练准备。它会处理诸如以下任务:
- 填充缺失值:自动用适当的值替换缺失数据
- 编码分类变量:将非数字类别转换为数字
- 缩放数值特征:对数据进行归一化以确保一致性
设置方法如下
1 2 3 4 |
from pycaret.classification import setup # 初始化环境 exp1 = setup(data, target='target') |
一些值得提及的重要 setup 参数包括
- preprocess=True/False:用于控制预处理
- session_id:允许结果可复现
- fold:用于描述和使用交叉验证策略
- fix_imbalance=True:此参数允许处理不平衡数据集
总之,这一步准备了数据并为模型训练奠定了基础。
可用模型
PyCaret 提供了多种机器学习算法。你可以使用 models() 函数查看支持的模型列表
1 2 |
# 列出可用模型 models() |
此函数生成一个表格,显示每个模型的名称、简短标识符(ID)和简要描述。用户可以快速查看并评估哪些算法适合他们的任务。
模型比较
compare_models() 函数根据性能指标评估和排名多个模型,是 PyCaret 许多有益的工作流函数之一。它通过比较模型(使用准确率、R² 等指标)来帮助识别数据集的最佳模型。
- 准确率:用于分类任务
- R-squared:用于回归任务
使用方法如下
1 2 3 4 5 |
# 比较模型并找到最佳模型 best_model = compare_models() # 打印最佳模型 print(best_model) |
这将使用默认超参数比较所有可用模型,并打印出基于性能指标的最佳模型的详细信息。best_model 对象将包含性能得分最好的模型。
创建模型
在通过 compare_models() 比较模型后,您可以使用 create_model() 函数来创建最佳模型。
1 2 |
# 训练最佳模型 model = create_model(best_model) |
此函数将在您的数据集上训练选定的模型。
超参数调优
微调模型的参数可以显著提高其性能。PyCaret 通过智能搜索策略自动化了此过程。
1 2 3 4 5 6 7 8 |
# 使用随机搜索调优模型 tuned_model = tune_model(model, n_iter=50, optimize='Accuracy') # 使用自定义网格调优 tuned_model = tune_model(model, custom_grid={ 'n_estimators': [100, 200, 300], 'max_depth': [3, 5, 7] }) |
PyCaret 在调优期间自动执行交叉验证,并根据您选择的指标选择最佳参数。您还可以指定自定义参数网格以更好地控制调优过程。
tune_model() 还支持不同的调优策略,如网格搜索和贝叶斯优化。
1 2 3 4 5 |
# 网格搜索 tuned_model = tune_model(model, search_library='scikit-learn', search_algorithm='grid') # 贝叶斯优化 tuned_model = tune_model(model, search_library='optuna') |
评估模型
评估模型性能以了解其在未见过的数据上的行为非常重要。PyCaret 的 evaluate_model() 函数提供了对模型性能的详细、交互式审查。
以下是 PyCaret 中可用于模型评估的一些常见评估图。
混淆矩阵
混淆矩阵显示了模型在数据集中的每个类别上的分类效果。它比较了预测标签和真实标签。此图有助于您理解分类中的错误。
1 2 |
# 绘制混淆矩阵 plot_model(tuned_model, plot='confusion_matrix') |
ROC 曲线
ROC 曲线(接收者操作特征曲线)显示了在各种阈值设置下,真正例率(灵敏度)和假正例率(1 – 特异度)之间的权衡。它对于评估分类模型非常有用,尤其是在存在类别不平衡的情况下。
1 2 |
# 绘制 ROC 曲线 plot_model(tuned_model, plot='roc') |
学习曲线
学习曲线显示了模型的性能随着训练样本数量的增加而提高。它可以帮助您识别模型是否欠拟合或过拟合。
1 2 |
# 绘制学习曲线 plot_model(tuned_model, plot='learning') |
模型解释
理解模型如何做出决策对于调试和建立信任都很重要。PyCaret 提供了几种模型解释工具。
1 2 3 4 5 6 7 8 |
# 获取特征重要性 interpret_model(model, plot='feature') # 生成 SHAP 值 interpret_model(model, plot='summary') # 创建相关性分析 interpret_model(model, plot='correlation') |
这些可视化有助于解释哪些特征对模型的预测影响最大。对于分类任务,您还可以分析决策边界和混淆矩阵来理解模型行为。
保存和加载自定义模型
在训练和微调模型后,您通常希望将其保存以备将来使用。PyCaret 使此过程变得简单。但是,为了正确保存模型,您还需要保存预处理管道。使用以下代码完成这两个过程。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 训练和调优您的模型 model = create_model('rf') tuned_model = tune_model(model) # 保存模型 save_model(tuned_model, 'final_model', prep_pipeline=True) # 加载模型 loaded_model = load_model('final_model') # 使用模型 predictions = predict_model(loaded_model, new_data) |
发生了什么
- save_model(tuned_model, ‘final_model’, prep_pipeline=True):将您的 tuned_model 和相关的预处理管道一起保存到 final_model.pkl 文件
- loaded_model = (‘final_model’):将保存的模型加载到 loaded_model
- predictions = predict_model(loaded_model, new_data):使用模型,并通过保存的管道自动应用预处理
创建生产管道
从实验和模型构建到生产和模型部署需要健壮、可复现的管道。PyCaret 通过内置的管道创建简化了这一过渡。
1 2 3 4 5 6 7 8 9 |
# 创建部署管道 final_pipeline = pipeline_model(model) # 添加自定义转换器 from sklearn.preprocessing import StandardScaler pipeline = pipeline_model(model, transformation_pipe=[StandardScaler()]) # 导出管道用于部署 save_model(pipeline, 'production_ready_model') |
这些管道确保所有预处理步骤、特征工程和模型推理都按正确的顺序进行,从而使部署更加可靠。
生产部署
将模型部署到生产环境需要小心处理模型构件和预处理步骤。PyCaret 提供了工具来使此过程无缝进行。
1 2 3 4 5 6 7 8 9 10 |
# 保存完整管道 deployment_ready_model = save_model(final_pipeline, 'production_model') # 生产使用示例 loaded_pipeline = load_model('production_model') predictions = predict_model(loaded_pipeline, new_data) # 监控模型性能 predictions = predict_model(loaded_pipeline, new_data, raw_score=True) print(predictions['Score']) |
这种方法确保了训练和生产环境之间的一致性。保存的管道会自动处理所有必要的数据转换,从而降低了生产中预处理不匹配的风险。
使用自定义模型
在 PyCaret 中创建自定义模型在以下情况下非常有用:
- 您想实现标准库中没有的新颖算法
- 您需要修改现有算法以适应您的特定问题
- 您希望更精细地控制模型的行为或性能
在 PyCaret 中,您可以使用 scikit-learn 创建自己的自定义机器学习模型,这使您能够更精细地控制模型的行为。要在 PyCaret 中使用自定义模型,您需要继承 scikit-learn 的两个类
- BaseEstimator:此类提供了训练和使用模型的基本功能,例如拟合和预测。
- ClassifierMixin:此类为分类任务添加了方法,例如预测样本所属的类别。
为了演示如何创建自定义模型,让我们通过实现加权 K-近邻(KNN)分类器来逐步介绍。
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 33 34 |
from sklearn.base import BaseEstimator, ClassifierMixin from sklearn.neighbors import NearestNeighbors from sklearn.utils.validation import check_X_y, check_array, check_is_fitted from sklearn.utils.multiclass import unique_labels import numpy as np class WeightedKNN(BaseEstimator, ClassifierMixin): def __init__(self, n_neighbors=5): self.n_neighbors = n_neighbors def fit(self, X, y): X, y = check_X_y(X, y) self.classes_ = unique_labels(y) self.nn_ = NearestNeighbors(n_neighbors=self.n_neighbors).fit(X) self.y_ = y return self def predict_proba(self, X): check_is_fitted(self) X = check_array(X) distances, indices = self.nn_.kneighbors(X) weights = 1 / (distances + np.finfo(float).eps) weights /= np.sum(weights, axis=1)[:, np.newaxis] proba = np.zeros((X.shape[0], len(self.classes_))) for i in range(X.shape[0]): for j in range(self.n_neighbors): class_idx = np.where(self.classes_ == self.y_[indices[i, j]])[0][0] proba[i, class_idx] += weights[i, j] return proba def predict(self, X): return self.classes_[np.argmax(self.predict_proba(X), axis=1)] |
创建自定义模型后,您可以使用 create_model() 函数轻松将其集成到 PyCaret 中。此函数将允许 PyCaret 像处理内置模型一样处理自定义模型。
1 |
custom_knn = create_model(WeightedKNN(n_neighbors=3)) |
结论
在 PyCaret 中创建自定义模型管道可以使您的整个机器学习工作流更易于实施。PyCaret 可以帮助进行数据准备、模型构建和评估。您甚至可以添加自己的自定义模型,并使用 PyCaret 的工具来改进它们。在调优和测试之后,可以将模型保存并在生产中使用。
暂无评论。