训练

PyCaret 中的训练函数

compare_models

此函数使用交叉验证训练并评估模型库中所有估计器的性能。此函数的输出是一个包含平均交叉验证分数的评分网格。交叉验证期间评估的指标可以使用 get_metrics 函数访问。可以使用 add_metricremove_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 的输出

默认情况下,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')
compare_models(sort = 'F1') 的输出

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

print(best)
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'])
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(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)
compare_models(n_select = 3) 的输出

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

type(best)
# >>> list

print(best)
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)
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)
compare_models(probability_threshold = 0.25) 的输出

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

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

禁用交叉验证

如果您不想使用交叉验证来评估模型,而只想训练它们并在测试/保留集上查看指标,可以将 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)
compare_models(cross_validation=False) 的输出

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

注意:此函数仅在分类回归模块中可用。

在集群上进行分布式训练

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

# 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))
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"))

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

create_model

此函数使用交叉验证训练并评估给定估计器的性能。此函数的输出是一个包含按折叠划分的 CV 分数的评分网格。交叉验证期间评估的指标可以使用 get_metrics 函数访问。可以使用 add_metricremove_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')
create_model('lr') 的输出

此函数按折叠显示性能指标,并显示每个指标的平均值和标准差,并返回训练好的模型。默认情况下,它使用 10 折叠,这可以在 setup 函数中全局更改,也可以在 create_model 中局部更改。setup函数中更改,也可以在 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 logistic regression
lr = create_model('lr', fold = 5)
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()
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)
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)
print(dt_results) 的输出
# check type
type(dt_results)
# >>> pandas.core.frame.DataFrame

# select only Mean
dt_results.loc[['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)
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)
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)
create_model('lr', probability_threshold = 0.25) 的输出
# see the model
print(lr)
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()
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)
create_model(sc) 的输出
type(sc_trained)
# >>> gplearn.genetic.SymbolicClassifier

print(sc_trained)
print(sc_trained) 的输出

编写你自己的模型

您还可以编写自己的类,包含 fitpredict 函数。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)
create_model(my_own_model) 的输出

最后更新于

这篇文章有用吗?