文档
  • PyCaret 3.0
  • 开始
    • 💻安装
    • 🚀快速入门
    • ⭐教程
    • 📶模块
    • ⚙️数据预处理
      • 数据准备
      • 缩放与转换
      • 特征工程
      • 特征选择
      • 其他设置参数
    • 💡函数
      • 初始化
      • 训练
      • 优化
      • 分析
      • 部署
      • 其他
  • 学习 PYCARET
    • 📖博客
      • 宣布 PyCaret 1.0
      • 宣布 PyCaret 2.0
      • 关于 PyCaret 你不知道的 5 件事
      • 构建和部署你的第一个机器学习 Web 应用
      • 使用 PyCaret 在 Power BI 中构建自己的 AutoML
      • 在 Google Kubernetes 上部署 ML Pipeline
      • 在 AWS Fargate 上部署 PyCaret 和 Streamlit
      • 使用 PyCaret 在 Power BI 中进行异常检测
      • 在 Google Kubernetes 上部署 ML 应用
      • 在 GKE 上部署机器学习 Pipeline
      • 在 AWS Fargate 上部署机器学习 Pipeline
      • 使用 Docker 在云端部署 ML Pipeline
      • 使用 PyCaret 在 Power BI 中进行聚类分析
      • 使用 ONNX Runtime 在边缘部署 PyCaret 模型
      • GitHub 是你唯一需要的 AutoML
      • 在 AWS Fargate 上部署 PyCaret 和 Streamlit
      • 使用 PyCaret 和 MLflow 实现简单的 MLOps
      • 使用 PyCaret 在 Power BI 中进行聚类分析
      • 使用 PyCaret 在 Alteryx 中进行机器学习
      • 使用 PyCaret 在 KNIME 中进行机器学习
      • 使用 PyCaret 在 SQL 中进行机器学习 第一部分
      • 使用 PyCaret 在 Power BI 中进行机器学习
      • 使用 PyCaret 在 Tableau 中进行机器学习
      • 使用 PyCaret 进行多元时间序列预测
      • 使用 PyCaret 预测客户流失
      • 使用 PyCaret(正确方式)预测潜在客户得分
      • 使用 PyCaret 在 Python 中进行 NLP 文本分类
      • 使用 PyCaret(正确方式)预测潜在客户得分
      • 使用 PyCaret 预测黄金价格暴跌
      • 使用机器学习预测黄金价格
      • PyCaret 2.1 功能摘要
      • 使用 PyCaret 将 ML 模型部署到 SQL Server
      • 使用 PyCaret 和 Gradio 加速你的 ML
      • 时间序列 101 - 入门
      • 使用 PyCaret 进行时间序列异常检测
      • 使用 PyCaret 回归进行时间序列预测
      • 使用 PyCaret 在 Power BI 中进行主题建模
      • 使用 PyCaret 编写和训练自定义 ML 模型
      • 使用 PyCaret 和 Streamlit 构建和部署 ML 应用
      • PyCaret 2.3.6 发布了!了解新特性?
    • 📺视频
    • 🛩️速查表
    • ❓常见问题解答
    • 👩‍💻示例
  • 重要链接
    • 🛠️发行说明
    • ⚙️API 参考
    • 🙋 讨论
    • 📤问题
    • 👮 许可证
  • 媒体
    • 💻Slack
    • 📺YouTube
    • 🔗LinkedIn
    • 😾GitHub
    • 🔅Stack Overflow
由 GitBook 提供支持
本页内容
  • compare_models
  • 示例
  • 更改排序顺序
  • 只比较少数模型
  • 返回多个模型
  • 设置预算时间
  • 设置概率阈值
  • 禁用交叉验证
  • 在集群上进行分布式训练
  • create_model
  • 示例
  • 更改折叠参数
  • 模型库
  • 使用自定义参数的模型
  • 访问评分网格
  • 禁用交叉验证
  • 返回训练分数
  • 设置概率阈值
  • 在循环中训练模型
  • 训练自定义模型
  • 编写你自己的模型

这篇文章有用吗?

  1. 开始
  2. 函数

训练

PyCaret 中的训练函数

上一篇初始化下一篇优化

最后更新于 2 年前

这篇文章有用吗?

compare_models

此函数使用交叉验证训练并评估模型库中所有估计器的性能。此函数的输出是一个包含平均交叉验证分数的评分网格。交叉验证期间评估的指标可以使用 get_metrics 函数访问。可以使用 add_metric 和 remove_metric 函数添加或删除自定义指标。

示例

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models()

默认情况下,compare_models 函数仅返回基于 sort 参数中定义的标准表现最好的模型。对于分类实验,它是 Accuracy,对于回归实验,它是 R2。您可以通过传递您希望进行模型选择所依据的指标名称来更改 sort 顺序。

更改排序顺序

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models(sort = 'F1')

请注意,评分网格的排序顺序已更改,此函数返回的最佳模型也基于 F1 进行选择。

print(best)

只比较少数模型

如果您不想对整个模型库进行全面比较,您可以使用 include 参数仅比较您选择的少数模型。

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models(include = ['lr', 'dt', 'lightgbm'])

或者,您也可以使用 exclude 参数。这将比较所有模型,除了在 exclude 参数中传递的模型。

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models(exclude = ['lr', 'dt', 'lightgbm'])

返回多个模型

默认情况下,compare_models 仅返回表现最佳的模型,但如果您愿意,可以获取前 N 个模型,而不仅仅是一个模型。

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models(n_select = 3)

请注意,结果没有变化,但是,如果您检查变量 best,它现在将包含排名前 3 个模型的列表,而不是像之前那样只有一个模型。

type(best)
# >>> list

print(best)

设置预算时间

如果您时间不足,并希望为此函数设置固定的运行时间预算,可以通过设置 budget_time 参数来实现。

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models(budget_time = 0.5)

设置概率阈值

执行二元分类时,您可以更改硬标签的概率阈值或截止值。默认情况下,所有分类器都使用 0.5 作为默认阈值。

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models(probability_threshold = 0.25)

请注意,除了 AUC 之外的所有指标现在都不同了。AUC 不会改变,因为它不依赖于硬标签,其他所有指标都依赖于硬标签,而硬标签现在使用 probability_threshold=0.25 获得。

禁用交叉验证

如果您不想使用交叉验证来评估模型,而只想训练它们并在测试/保留集上查看指标,可以将 cross_validation 设置为 False。

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

# compare models
best = compare_models(cross_validation=False)

输出看起来很相似,但如果您仔细观察,指标现在不同了,这是因为它们不再是平均交叉验证分数,而是测试/保留集上的指标。

在集群上进行分布式训练

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable', n_jobs = 1)

# create pyspark session
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

# import parallel back-end
from pycaret.parallel import FugueBackend

# compare models
best = compare_models(parallel = FugueBackend(spark))

请注意,我们需要在设置中将 n_jobs 设置为 1,以便在本地 Spark 环境中进行测试,因为某些模型已经尝试使用所有可用核心,并且并行运行这些模型可能会导致资源争用引起的死锁。

对于 Dask,我们可以在 FugueBackend 中指定 "dask",它将拉取可用的 Dask 客户端。

# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')

# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable', n_jobs = 1)

# import parallel back-end
from pycaret.parallel import FugueBackend

# compare models
best = compare_models(parallel = FugueBackend("dask"))

create_model

此函数使用交叉验证训练并评估给定估计器的性能。此函数的输出是一个包含按折叠划分的 CV 分数的评分网格。交叉验证期间评估的指标可以使用 get_metrics 函数访问。可以使用 add_metric 和 remove_metric 函数添加或删除自定义指标。所有可用模型都可以使用 models 函数访问。

示例

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train logistic regression
lr = create_model('lr')

更改折叠参数

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train logistic regression
lr = create_model('lr', fold = 5)

此函数返回的模型与上面相同,但是性能评估是使用 5 折交叉验证完成的。

模型库

要查看任何模块中可用模型的列表,可以使用 models 函数。

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# check available models
models()

使用自定义参数的模型

当您只运行 create_model('dt') 时,它将使用所有默认超参数设置训练决策树模型。如果您想更改这些设置,只需在 create_model 函数中传递属性即可。

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train decision tree
dt = create_model('dt', max_depth = 5)
# see models params
print(dt)

访问评分网格

您在 create_model 后看到的性能指标/评分网格仅显示,并未返回。因此,如果您想将该网格作为 pandas.DataFrame 访问,则需要在 create_model 后使用 pull 命令。

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train decision tree
dt = create_model('dt', max_depth = 5)

# access the scoring grid
dt_results = pull()
print(dt_results)
# check type
type(dt_results)
# >>> pandas.core.frame.DataFrame

# select only Mean
dt_results.loc[['Mean']]

禁用交叉验证

如果您不想使用交叉验证来评估模型,而只想训练它们并在测试/保留集上查看指标,可以将 cross_validation 设置为 False。

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train model without cv
lr = create_model('lr', cross_validation = False)

这些是测试/保留集上的指标。因此您只看到一行,而不是原始输出中的 12 行。当您禁用 cross_validation 时,模型仅对整个训练数据集进行一次训练,并使用测试/保留集进行评分。

返回训练分数

默认的评分网格显示了按折叠划分的验证集上的性能指标。如果您也想查看按折叠划分的训练集上的性能指标以检查过拟合/欠拟合情况,可以使用 return_train_score 参数。

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train model without cv
lr = create_model('lr', return_train_score = True)

设置概率阈值

执行二元分类时,您可以更改硬标签的概率阈值或截止值。默认情况下,所有分类器都使用 0.5 作为默认阈值。

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train model with 0.25 threshold
lr = create_model('lr', probability_threshold = 0.25)
# see the model
print(lr)

在循环中训练模型

您可以在循环中使用 create_model 函数来训练多个模型,或者使用不同的配置训练同一个模型,并比较它们的结果。

import numpy as npimport pandas as pd

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# train models in a loop
lgbs  = [create_model('lightgbm', learning_rate = i) for i in np.arange(0.1,1,0.1)]
type(lgbs)
# >>> list

len(lgbs)
# >>> 9

如果您想跟踪指标,就像在大多数情况下一样,可以这样实现。

import numpy as np
import pandas as pd

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# start a loop
models = []
results = []

for i in np.arange(0.1,1,0.1):
    model = create_model('lightgbm', learning_rate = i)
    model_results = pull().loc[['Mean']]
    models.append(model)
    results.append(model_results)
    
results = pd.concat(results, axis=0)
results.index = np.arange(0.1,1,0.1)
results.plot()

训练自定义模型

您可以使用自己的自定义模型进行训练,或使用 PyCaret 不支持的其他库中的模型。只要它们的 API 与 sklearn 一致,就可以轻松运行。

# install gplearn library
# pip install gplearn

# load dataset 
from pycaret.datasets import get_data 
diabetes = get_data('diabetes') 

# init setup
from pycaret.classification import * 
clf1 = setup(data = diabetes, target = 'Class variable')

# import custom model
from gplearn.genetic import SymbolicClassifier
sc = SymbolicClassifier()

# train custom model
sc_trained = create_model(sc)
type(sc_trained)
# >>> gplearn.genetic.SymbolicClassifier

print(sc_trained)

编写你自己的模型

您还可以编写自己的类,包含 fit 和 predict 函数。PyCaret 将与此类兼容。这里有一个简单的示例:

# load dataset 
from pycaret.datasets import get_data 
insurance= get_data('insurance') 

# init setup
from pycaret.regression import * 
reg1 = setup(data = insurance, target = 'charges')

# create custom estimator
import numpy as np
from sklearn.base import BaseEstimator
class MyOwnModel(BaseEstimator):
    
    def __init__(self):
        self.mean = 0
        
    def fit(self, X, y):
        self.mean = y.mean()
        return self
    
    def predict(self, X):
        return np.array(X.shape[0]*[self.mean])
        
# create an instance
my_own_model = MyOwnModel()

# train model
my_model_trained = create_model(my_own_model)

注意:此参数仅在PyCaret 的模块中可用。

注意:此函数仅在和模块中可用。

要在大型数据集上进行扩展,您可以使用名为 parallel 的参数在分布式模式下的集群上运行 compare_models 函数。它利用了

抽象层,以便在 Spark 或 Dask 集群上运行 compare_models。有关完整示例和与分布式执行相关的其他功能,请查看此示例。此示例还展示了如何实时获取排行榜。在分布式设置中,这涉及到设置 RPCClient,但 Fugue 简化了这一点。

此函数按折叠显示性能指标,并显示每个指标的平均值和标准差,并返回训练好的模型。默认情况下,它使用 10 折叠,这可以在 setup 函数中全局更改,也可以在 create_model 中局部更改。函数中更改,也可以在 create_model 中局部更改。

注意:此函数仅在和模块中可用。

💡
分类
分类
回归
Fugue
此示例
分类
回归
setup
compare_models 的输出
compare_models(sort = 'F1') 的输出
print(best) 的输出
compare_models(include = ['lr', 'dt', 'lightgbm']) 的输出
compare_models(exclude = ['lr', 'dt', 'lightgbm']) 的输出
compare_models(n_select = 3) 的输出
print(best) 的输出
compare_models(budget_time = 0.5) 的输出
compare_models(probability_threshold = 0.25) 的输出
compare_models(cross_validation=False) 的输出
compare_models(parallel = FugueBackend(spark)) 的输出
create_model('lr') 的输出
create_model('lr', fold = 5) 的输出
models() 的输出
create_model('dt', max_depth = 5) 的输出
print(dt_results) 的输出
dt_results.loc[['Mean']] 的输出
create_model('lr', cross_validation = False) 的输出
create_model('lr', return_train_score = True) 的输出
create_model('lr', probability_threshold = 0.25) 的输出
print(lr) 的输出
results.plot() 的输出
create_model(sc) 的输出
print(sc_trained) 的输出
create_model(my_own_model) 的输出