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
进行选择。
只比较少数模型
如果您不想对整个模型库进行全面比较,您可以使用 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))
对于 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)