跳到主要内容

训练

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) 的输出

输出看起来非常相似,但如果仔细观察,指标现在不同,这是因为这些不是平均交叉验证得分,而是测试/保留集上的指标。

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

在集群上进行分布式训练

要在大型数据集上扩展,你可以在集群上以分布式模式运行 compare_models 函数,使用名为 parallel 的参数。它利用 Fugue 抽象层在 Spark 或 Dask 集群上运行 compare_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', 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)) 的输出

请注意,在使用本地 Spark 进行测试时,需要在 setup 中将 n_jobs = 1 设置好,因为某些模型会尝试使用所有可用核心,并且并行运行此类模型可能因资源争用而导致死锁。

对于 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"))

有关完整示例以及与分布式执行相关的其他功能,请参见 此示例。该示例还演示了如何实时获取排行榜。在分布式环境中,这通常需要设置一个 RPCClient,但 Fugue 简化了这一过程。

create_model

该函数使用交叉验证训练并评估给定估计器的性能。该函数的输出是按折提供交叉验证分数的评分网格。交叉验证期间评估的指标可以通过 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') 的输出

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

更改 fold 参数

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

Output from create_model('lr', cross_validation = False)

这些是在测试/hold-out 集上的指标。这就是为什么你只会看到一行,而不是原始输出中的 12 行。当你禁用 cross_validation 时,模型只训练一次,使用整个训练数据集进行训练,并使用测试/hold-out 集进行评分。

注意:** 此功能仅在 分类回归 模块中可用。

返回训练集得分

默认的评分表显示按折(fold)划分的验证集上的性能指标。如果你也想查看按折划分的训练集上的性能指标以检查过拟合/欠拟合,可以使用 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) 的输出