训练
PyCaret 中的训练函数
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 的输出
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_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')

来自 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) 的输出
编写你自己的模型
你也可以编写一个包含 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)

来自 create_model(my_own_model) 的输出