Py学习  »  机器学习算法

【机器学习资源】PyCaret :可创建多种模型预测的超强开源工具

GISer last • 7 月前 • 428 次点击  

代码前期获取数据,可能较卡,后面都很顺利。

如嫌文章内容太长,或者翻译不准确,可直接到文末,点击原文或者链接,自行去学习哈。

本教程涵盖了整个 ML 流程,从数据摄取、预处理、模型训练、超参数拟合、预测和存储模型以备后用。

我们将在不到 10 个命令中完成所有这些步骤,这些命令是自然构建的并且非常直观易记,例如

create_model(), 
tune_model(),
compare_models()
plot_model()
evaluate_model()
predict_model()

让我们看看全貌

在大多数库中,在没有 PyCaret 的情况下重新创建整个实验需要 100 多行代码。该库还允许您执行更高级的操作,例如高级预处理、集成、通用堆栈和其他技术,这些技术允许您完全自定义 ML 管道,并且是任何数据科学家的必备工具。

PyCaret 是一个开源的低级 ML 和 Python 库,可让您在几分钟内完成从准备数据到部署模型的操作。允许科学家和数据分析师高效地从头到尾执行迭代数据科学实验,并允许他们更快地得出结论,因为花在编程上的时间要少得多。此库与 Caret de R 非常相似,但使用 python 实现

在从事数据科学项目时,通常需要很长时间来理解数据(EDA 和特征工程)。那么,如果我们可以将花在项目建模部分的时间减少一半呢?

让我们看看如何操作

首先,我们需要这个先决条件

  • Python 3.6 或更高版本

  • PyCaret 2.0 或更高版本

在这里,您可以找到库文档和其他文档。

首先,请运行以下命令:!pip3 install pycaret

对于 Google Colab 用户:如果您在 Google Colab 中运行此笔记本,请在笔记本顶部运行以下代码以显示交互式图像

from pycaret.utils import enable_colab
enable_colab()

Pycaret 模块

Pycaret 根据我们想要执行的任务进行划分,并且具有不同的模块,分别代表每种类型的学习(监督式或无监督式)。在本教程中,我们将使用二元分类算法开发监督学习模块。

分类模块

PyCaret 分类模块 () 是一个监督式机器学习模块,用于根据各种技术和算法将元素分类为二进制组。分类问题的一些常见用途包括预测客户违约(是或否)、客户放弃(客户将离开或留下)、遇到的疾病(阳性或阴性)等。pycaret.classification

PyCaret 分类模块可用于二进制或多类分类问题。它有超过 18 种算法和 14 个用于分析模型性能的绘图。无论是超参数调整、集成还是堆叠等高级技术,PyCaret 的分类模块都能满足您的需求。

分类模型

在本教程中,我们将使用一个名为 Default of Credit Card Clients Dataset 的 UCI 数据集。该数据集包含 2005 年 4 月至 2005 年 9 月期间台湾信用卡客户的违约付款、人口统计、信用数据、付款历史和账单等信息。有 24,000 个样本和 25 个特征。

数据集可以在这里找到。或者在这里,您可以找到直接下载链接。

因此,将数据集下载到您的环境中,然后我们将像这样加载它

在 [2] 中:

import pandas as pd

在 [3] 中:

df = pd.read_csv('datasets/default of credit card clients.csv')

在 [4] 中:

df.head()

输出[4]:


未命名:0X1X2X3X4X5 系列X6X7 系列X8 系列X9 系列...X15 系列X16X17X18 系列X19 系列X20 系列X21 系列X22 系列X23 系列Y
0身份证LIMIT_BAL教育年龄PAY_0PAY_2 PAY_3PAY_4...BILL_AMT4BILL_AMT5BILL_AMT6PAY_AMT1PAY_AMT2PAY_AMT3PAY_AMT4PAY_AMT5PAY_AMT6下个月违约金
11200002212422-1-1...0000689000 01
2212000022226-1200...3272345532610100010001000020001
33900002223400 00...1433114948155491518150010001000100050000
4450000221370000...283142895929547200020191200110010691000 0

5 行 × 25 列

1- 获取数据

我们还有另一种加载方法。事实上,这将是我们在本教程中将使用的默认方式。它直接来自 PyCaret 数据集,是我们 Pipeline 的第一种方法

在 [5] 中:

from pycaret.datasets import get_data
dataset = get_data('credit')

LIMIT_BAL教育年龄PAY_1PAY_2PAY_3PAY_4PAY_5...BILL_AMT4BILL_AMT5BILL_AMT6PAY_AMT1PAY_AMT2PAY_AMT3PAY_AMT4PAY_AMT5PAY_AMT6违约
0200002212422-1-1-2...0.00.00.00.0689.00.00.00.00.01
1900002223400000... 14331.014948.015549.01518.01500.01000.01000.01000.05000.00
2500002213700000...28314.028959.029547.02000.02019.01200.01100.01069.01000.00
35000012157-10-100...20940.019146.019131.02000.036681.010000.09000.0689.0679.00
4500001123700000... 19394.019619.020024.02500.01815.0657.01000.01000.0800.00

5 行 × 24 列

在 [6] 中:

#check the shape of data
dataset.shape

出局[6]:

(24000, 24)

为了在看不见的数据上演示该功能,我们保留了原始数据集中的 1200 条记录样本,用于预测。这不应与训练/测试拆分混淆,因为此特定拆分是为了模拟真实场景。另一种思考方式是,在执行 ML 实验时,这 1200 条记录不可用。predict_model()

在 [7] 中:

## sample returns a random sample from an axis of the object. That would be 22,800 samples, not 24,000
data = dataset.sample(frac=0.95, random_state=786)

在 [8] 中:

data

出局[8]:


LIMIT_BAL教育年龄PAY_1PAY_2PAY_3PAY_4PAY_5 ...BILL_AMT4BILL_AMT5BILL_AMT6PAY_AMT1PAY_AMT2PAY_AMT3PAY_AMT4PAY_AMT5PAY_AMT6违约
205342700002123400200...44908.019508.015860.04025.05.034000.00.00.00.0 0
688516000021242-2-2-2-2-2...0.0741.00.00.00.00.0741.00.00.00
1553360000212300000 0...146117.0145884.0147645.06000.06000.04818.05000.05000.04500.00
1952200002122500000...18964.019676.020116.01700.01300.0662.01000.0747.0602.0 0
21422700001222900000...48538.049034.049689.02200.08808.02200.02000.02000.02300.00
.............................. ....................................
45161300001324500-10-1...1261.0390.0390.01000.02522.00.0390.0390.0390.0 0
8641290000212290000-1...-77.08123.0210989.01690.03000.00.08200.0205000.06000.00
6206210000121411200 0...69670.059502.0119494.00.05000.03600.02000.02000.05000.00
21105500001214700000...30000.00.00.010000.020000.05000.00.00.00.0 0
40422000001122800000...161221.0162438.0157415.07000.08016.05000.012000.06000.07000.00

22800 行 × 24 列

在 [9] 中:

# we remove from the original dataset this random data
data_unseen = dataset.drop(data.index)

在 [10] 中:

data_unseen

输出[10]:


LIMIT_BAL教育 年龄PAY_1PAY_2PAY_3PAY_4PAY_5...BILL_AMT4BILL_AMT5BILL_AMT6PAY_AMT1PAY_AMT2PAY_AMT3PAY_AMT4PAY_AMT5PAY_AMT6违约
5100000222230-1-100...221.0-159.0 567.0380.0601.00.0581.01687.01542.00
3938000012232-1-1-1-1-1...32018.011849.011873.021540.015138.024677.011851.011875.08251.00
572000002 2132-1-1-1-12...5247.03848.03151.05818.015.09102.017.03165.01395.00
722000001115322222...144098.0147124.0149531.0 6300.05500.05500.05500.05000.05000.01
103240000112411-1-100...3164.0360.01737.02622.03301.00.0360.01737.0924.00
......... .........................................................
23978500001213712220...2846.01585.01324.0 0.03000.00.00.01000.01000.01
239792200001214100-1-1-2...5924.01759.01824.08840.06643.05924.01759.01824.07022.00
239814200001 123400000...141695.0144839.0147954.07000.07000.05500.05500.05600.05000.00
23985900001213600000...11328.012036.014329.0 1500.01500.01500.01200.02500.00.01
23999500001214600000...36535.032428.015313.02078.01800.01430.01000.01000.01000.01

1200 行 × 24 列

在 [11] 中:

## we reset the index of both datasets
data.reset_index(inplace=True, drop= True)
data_unseen.reset_index(inplace=True, drop=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))
Data for Modeling: (22800, 24)
Unseen Data For Predictions: (1200, 24)

拆分数据

我们划分数据集的方式很重要,因为在建模过程中,有些数据我们不会使用,最后我们将通过模拟真实数据来验证我们的结果。我们用于建模的数据对其进行细分,以评估两种情况,即训练和测试。因此,我们做了以下工作

看不见的数据集(也称为验证数据集)

  • 用于提供对最终模型的公正评估的数据样本。

  • 验证数据集提供了用于评估模型的黄金标准。

  • 只有在模型经过完全训练后(使用训练集和测试集)才会使用它。

  • 验证集通常用于评估比赛的模型(例如,在许多 Kaggle 或 DataSource.ai 比赛中,测试集最初与训练集和测试集一起发布,而验证集仅在比赛即将结束时发布,并且验证集模型的结果决定了获胜者)。

  • 很多时候,测试集被用作验证集,但这不是一个好的做法。

  • 验证集通常愈合良好。

  • 它包含仔细采样的数据,涵盖模型在现实世界中使用时将面临的各种类。

训练数据集

  • 训练数据集:用于训练模型的数据样本。

  • 我们用于训练模型的数据集

  • 模型可以看到这些数据并从中学习。

测试数据集

  • 测试数据集:在调整模型的超参数时,用于提供模型无偏评估的数据样本与训练数据集匹配。

  • 随着测试数据集中的技能被纳入模型配置,评估会变得更加偏颇。

  • 测试集用于评估给定模型,但这用于频繁评估。

  • 作为 ML 工程师,我们使用此数据来微调模型的超参数。

  • 因此,模型偶尔会看到这些数据,但从不从中“学习”。

  • 我们使用测试集的结果,并更新更高级别的超参数

  • 因此,测试集会影响模型,但只是间接影响。

  • 测试集也称为 Development 集。这是有道理的,因为此数据集在模型的 “开发” 阶段有所帮助。

术语混淆

  • 有一种趋势是将 test 和 validation 的名称混淆。

  • 根据教程、来源、书籍、视频或老师/导师的术语会发生变化,重要的是保持概念。

  • 在我们的例子中,我们已经在开始时分离了验证集(1,200 个data_unseen)

2- 设置 PyCaret 环境

现在让我们设置 Pycaret 环境。该函数在 pycaret 中初始化环境并创建转换管道以准备用于建模和部署的数据。必须在执行 pycaret 中的任何其他函数之前调用。它采用两个必需参数:pandas 数据帧和目标列的名称。这部分配置的大部分是自动完成的,但有些参数可以手动设置。例如: setup()setup()

  • 默认的除法比例是(如上一段所示),但可以用 “” 更改。70:30train_size

  • K 折叠交叉验证默认设置为10

  • "session_id“是我们的经典”random_state"

在 [12] 中:

## setting up the environment
from pycaret.classification import *

:运行以下命令后,必须按 Enter 键才能完成该过程。我们将解释他们是如何做到的。设置过程可能需要一些时间才能完成。

在 [13] 中:

model_setup = setup(data=data, target='default', session_id=123)

描述价值
0session_id123
1目标违约
2目标类型 二元的
3标签编码0: 0, 1: 1
4原始数据(22800, 24)
5缺失值
6数值特征14
7分类特征9
8序数特征
9高基数功能
10高基数方法没有
11 变换的火车组(15959, 88)
12转换后的测试集(6841, 88)
13Shuffle Train-Test
14分层训练测试
15Fold Generator分层 KFold
16折叠数10
17CPU 作业-1
18使用 GPU
19对数实验
20实验名称clf 默认名称
21环旭电子6e18
22插补类型简单
23迭代插补迭代没有
24数字插补器意味 着
25迭代插补数值模型没有
26分类插补不断
27迭代插补分类模型没有
28未知分类处理 least_frequent
29正常化
30Normalize 方法(Normalize Method)没有
31转型
32变换方法没有
33主成分分析
34PCA 方法没有
35PCA 组件没有
36忽略低方差
37结合稀有等级
38稀有级别阈值没有
39数字分箱
40删除异常值
41离群值阈值没有
42删除多重共线性
43多重共线性阈值没有
44聚类
45聚类迭代没有
46多项式特征
47多项式次数没有
48三角学特点
49多项式阈值没有
50集团特点
51特征选择
52特征选择阈值没有
53特征交互
54特征比率
55交互阈值没有
56修复不平衡
57修复不平衡方法击打

当您运行 PyCaret 的推理算法时,它将根据某些属性自动推断所有特征的数据类型。必须正确推断数据类型,但情况并非总是如此。考虑到这一点,PyCaret 在执行后显示一个包含特征及其推断数据类型的表。如果正确识别了所有数据类型,您可以按 Enter 键继续或退出以结束实验。我们按 Enter,应该会得到与上面相同的输出。setup()setup()

确保数据类型正确在 PyCaret 中至关重要,因为它会自动执行一些对任何 ML 实验都至关重要的预处理任务。对于每种类型的数据,这些任务的执行方式不同,这意味着正确配置这些任务非常重要。

我们可以使用 中的 和 参数覆盖从 PyCaret 推断的数据类型。成功执行设置后,将打印包含几条重要信息的信息网格。大多数信息与运行numeric_featurescategorical_featuressetup()setup()

这些功能中的大多数都超出了本教程的范围,但是,在此阶段需要记住的一些重要事项包括

  • session_id:在所有函数中作为种子分布的伪随机数,以便以后重现。

  • 目标类型 :Binary 或 Multiclass。系统会自动检测并显示目标类型。

  • 标签编码:当 Target 变量的类型为 string(即“Yes”或“No”)而不是 1 或 0 时,它会自动将标签编码为 1 和 0,并将映射显示为参考(0 : No, 1 : Yes)

  • Original data :显示数据集的原始格式。在这个实验中 ==> 记住:“看到数据”(22800, 24)

  • 缺失值 :当原始数据中存在缺失值时,将显示为True

  • Numerical features :推断为数值的特征数。

  • Categorical features :推断为分类的特征数

  • 变换的火车集:请注意,对于变换后的火车集,原始形式 被转换为 ,并且由于分类编码,特征数量已从  24 个增加到 91 个(22800, 24)(15959, 91)

  • 转换后的测试集:测试集中有样本。此拆分基于默认值,可以使用配置中的参数更改其默认值。6,84170/30train_size

请注意一些必须执行建模的任务是如何自动处理的,例如缺失值的插补(在这种情况下,训练数据中没有缺失值,但我们仍然需要看不见的数据的插补)、分类编码等。

大多数参数都是可选的,用于自定义预处理管道。setup()

3- 比较模型

为了理解 PyCaret 如何比较模型和管道中的后续步骤,有必要理解 N-Fold Coss-Validation 的概念。

N-fold Coss-验证

计算应该将多少数据划分到测试集中是一个微妙的问题。如果您的训练集太小,您的算法可能没有足够的数据来有效学习。另一方面,如果您的测试集太小,那么您的准确度、精确率、召回率和 F1 分数可能会有很大的变化。

你可能非常幸运或非常不走运!一般来说,将 70% 的数据放在训练集中,将 30% 的数据放在测试集中是一个很好的起点。有时,您的数据集非常小,以至于将其除以 70/30 将导致大量方差。

一种解决方案是执行 N-Fold 交叉验证。这里的中心思想是,我们将完成整个过程时间,然后平均精度。例如,在 10 次交叉验证中,我们将测试集设为前 10% 的数据,并计算准确率、精度、召回率和 F1 分数。N

然后,我们将进行交叉验证,建立第二个 10% 的数据,并再次计算这些统计数据。这个过程我们可以做 10 次,每次测试集都会是不同的数据。然后,我们平均所有精度,我们将更好地了解我们的模型的平均工作原理。

注意:在我们的例子中,Validation Set(此处为黄色)是 Test Set

了解模型的准确性非常宝贵,因为您可以开始调整模型的参数以提高其性能。例如,在 K 最近邻算法中,您可以看到随着 精度的增加或减少而发生的变化。对模型的性能感到满意后,就可以输入验证集了。这是您在 Experiment 开始时拆分的数据部分(在我们的例子中)。Kunseen_data

它应该是您真正感兴趣的真实世界数据的替代品。它的工作原理与测试集非常相似,不同之处在于您在构建或优化模型时从未接触过此数据。通过找到精确率指标,您可以很好地了解您的算法在现实世界中的表现。

比较所有模型

PyCaret 完成后,推荐的建模起点是比较所有模型以评估性能(除非您确切知道需要什么类型的模型,但通常情况并非如此),此函数训练模型库中的所有模型,并使用分层交叉验证对它们进行评分以评估指标。setup()

输出打印一个分数网格,该网格显示折叠中 Accuracy、AUC、Recall、Precision、F1、Kappa 和 MCC 的平均值(默认情况下)以及训练时间。让我们开始吧!10

在 [14] 中:

best_model = compare_models()

准确性AUC召回Prec.F1 系列卡帕MCC 公司TT (秒)
Ridge 分类器0.82540.00000.36370.69130.47640.38360.41220.0360
LDA线性判别分析0.82470.76340.37550.67940.48350.38840.41320.2240
GBC梯度提升分类器0.82260.77890.35510.68060.46640.37250.40101.8550
ADAAda Boost 分类器0.82210.76970.35050.68110.46260.36900.39830.4490
猫助推器CatBoost 分类器0.82150.77600.36570.66780.47240.37590.40075.0580
lightgbm Light Gradient Boost 机器0.82100.77500.36090.66790.46830.37210.39770.1440
射频随机森林分类器0.81990.75980.36630.66010.47070.37270.39651.0680
XGBoost极端梯度提升0.81600.75610.36290.63910.46260.36170.38291.6420
et 额外树分类器0.80920.73770.36770.60470.45710.34970.36570.9820
LRLogistic 回归0.78140.64100.00030.10000.00060.00030.00340.7750
KNNK 邻域分类器0.75470.59390.17630.37190.23880.11450.12590.4270
DT决策树分类器 0.72930.61470.41040.38780.39860.22420.22450.1430
SVMSVM - 线性内核0.72770.00000.10170.16710.09840.00670.00750.2180
QDA二次判别分析0.48860.53500.61760.24350.34530.04850.06010.1760
朴素贝叶斯0.3760 0.64420.88450.24410.38260.06080.12070.0380

该功能允许您一次比较多个模型。这是使用 PyCaret 的一大优势。在一行中,您有一个多个模型之间的比较表。两个简单的代码单词(甚至没有一行)已经使用 N-Fold 交叉验证训练和评估了超过 15 个模型。compare_models()

上面打印的表格突出显示了最高性能指标,仅用于比较目的。默认表格使用 “Accuracy” (从最高到最低) 进行排序,可以通过传递参数来更改。例如,将按 Recall 而不是 Accuracy 对网格进行排序。compare_models(sort = 'Recall')

如果要将参数从默认值更改为其他值,可以使用该参数。例如,将在 5 折交叉验证中比较所有模型。减少折叠次数将缩短训练时间。Fold10foldcompare_models(fold = 5)

默认情况下,根据默认排序顺序返回性能最佳的模型,但可用于使用参数返回前 N 个模型的列表。此外,它还返回一些指标,例如准确性、AUC 和 F1。另一个很酷的事情是库如何自动突出显示最佳结果。选择模型后,您可以创建模型,然后对其进行优化。让我们使用其他方法。compare_modelsn_select

在 [15] 中:

print(best_model)
RidgeClassifier(alpha=1.0, class_weight=None, copy_X=True, fit_intercept=True,
max_iter=None, normalize=False, random_state=123, solver='auto',
tol=0.001)

4- 创建模型

create_model是 PyCaret 中最精细的函数,通常是 PyCaret 大多数功能的基础。顾名思义,此函数使用交叉验证来训练和评估模型,该交叉验证可通过参数 进行设置。输出将打印一个评分表,按 Fold the Precision、AUC、Recall、F1、Kappa 和 MCC 显示。fold

在本教程的其余部分,我们将使用以下模型作为候选模型。这些选择仅用于说明目的,并不一定意味着它们是此类数据的最佳执行者或理想之选

  • 决策树分类器 ('dt')

  • K 邻域分类器 ('knn')

  • 随机森林分类器 ('rf')

PyCaret 模型库中有 18 个分类器可用。要查看所有分类器的列表,请查看文档或使用函数查看库。models()

在 [16] 中:

models()

出[16]:


名字参考
身份证


LRLogistic 回归sklearn.linear_model._logistic.LogisticRegression (逻辑回归)
KNNK 邻域分类器sklearn.neighbors._classification。KeighborsCl...
朴素贝叶斯sklearn.naive_bayes。GaussianNB (高斯NB)
DT决策树分类器sklearn.tree._classes。决策树分类器
SVMSVM - 线性内核sklearn.linear_model._stochastic_gradient 的SGDC ...
RBFSVMSVM - 径向内核sklearn.svm._classes。SVC
全球电脑高斯过程分类器sklearn.gaussian_process._gpc 的 gpc 中。GaussianProcessC...
MLPMLP 分类器pycaret.internal.tunable.TunableMLPClassifier
Ridge 分类器sklearn.linear_model._ridge.Ridge分类器
射频随机森林分类器sklearn.ensemble._forest。RandomForestClassifier (随机森林分类器)
QDA二次判别分析sklearn.discriminant_analysis。QuadraticDiscrim...
ADA Ada Boost 分类器sklearn.ensemble._weight_boosting。AdaBoostClas...
GBC梯度提升分类器sklearn.ensemble._gb。GradientBoostingClassifier
LDA线性判别分析sklearn.discriminant_analysis。LinearDiscrimina...
et额外树分类器sklearn.ensemble._forest。ExtraTrees分类器
XGBoost极端梯度提升xgboost.sklearn.XGBClassifier
lightgbmLight Gradient Boost 机器lightgbm.sklearn.LGBMClassifier
猫助推器CatBoost 分类器catboost.core.CatBoost分类器

在 [17] 中:

dt


    
 = create_model('dt')

准确性AUC召回Prec.F1 系列卡帕MCC 公司
00.73430.62570.43270.40050.41600.24440.2447
10.73250.62770.43840.39840.41750.24430.2448
20.74310.62820.4241 0.41460.41930.25440.2544
30.72740.61510.41550.38560.40000.22400.2242
40.71870.60540.40400.36910.38580.20380.2042
50.71870.60140.38970.36560.37730.19580.1960
60.7206 0.61280.42120.37600.39730.21620.2168
70.73310.59860.36100.38300.37170.20240.2026
80.72060.60450.39830.37070.38400.20360.2038
90.74420.62720.41950.41480.41710.25330.2533
意味 着 0.72930.61470.41040.38780.39860.22420.2245
标清0.00920.01120.02180.01740.01730.02180.0218

在 [18] 中:

#trained model object is stored in the variable 'dt'. 
print(dt)
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',
max_depth=None, max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort='deprecated',
random_state=123, splitter='best')

在 [19] 中:

knn = create_model('knn')

准确性AUC召回Prec.F1 系列卡帕MCC 公司
00.74690.60200.19200.35450.24910.11280.1204
10.75500.58940.20920.38830.27190.14020.1500
20.75060.58830.15760.34590.21650.09230.1024
30.74190.58180.15190.31360.20460.0723 0.0790
40.75630.59080.14900.36110.21100.09540.1085
50.75500.59970.17480.37200.23780.11390.1255
60.76380.58900.18910.41250.25930.14130.1565
70.76130.62400.16330.3904 0.23030.11630.1318
80.76190.59880.18620.40370.25490.13560.1500
90.75490.57560.18970.37710.25240.12460.1351
意味 着0.75470.59390.17630.37190.23880.11450.1259
标清0.00650.0126 0.01910.02790.02140.02140.0230

在 [20] 中:

print(knn)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=-1, n_neighbors=5, p=2,
weights='uniform')

在 [21] 中:

rf = create_model('rf')

准确性AUC召回Prec.F1 系列卡帕MCC 公司
00.81330.76730.36100.62690.45820.35510.3749
10.82390.76150.3782 0.67350.48440.38820.4117
20.82580.77080.34670.70760.46540.37560.4098
30.81770.76050.37250.64360.47190.37100.3913
40.82080.76420.37250.65990.47620.37800.4006
50.8283 0.76380.39540.68660.50180.40700.4297
60.81270.76470.35820.62500.45540.35220.3721
70.82830.73900.35530.71680.47510.38610.4202
80.81080.74960.36100.61460.45490.34960.3678
90.81760.75650.36210.64620.46410.36450.3867
意味 着0.81990.75980.36630.66010.47070.37270.3965
标清0.00620.00890.01310.03350.01390.01720.0202

在 [22] 中:

print(rf)
RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
criterion='gini', max_depth=None, max_features='auto',
max_leaf_nodes=None, max_samples=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100,
n_jobs=-1, oob_score=False, random_state=123, verbose=0,
warm_start=False)

请注意,所有模型的平均分数与 上打印的分数一致。这是因为分数网格中打印的指标是所有折叠的平均分数。compare_models()compare_models()

您还可以在每个模型中查看构建它们时使用的超参数。这非常重要,因为它是改进它们的基础。您可以查看 print()RandomForestClassifier

max_depth=None
max_features='auto'
min_samples_leaf=1
min_samples_split=2
min_weight_fraction_leaf=0.0
n_estimators=100
n_jobs=-1

5- 调整模型

使用该函数创建模型时,默认超参数用于训练模型。要优化超参数,请使用该函数。此函数在预定义的搜索空间中使用 Random Grid Search 自动调整模型的超参数。create_model()tune_model()

输出打印一个分数网格,其中显示最佳模型的准确率、AUC、召回率、精度、F1、Kappa 和 MCC(按 Fold)。要使用自定义搜索网格,您可以在函数中传递参数custom_gridtune_model

在 [23] 中:

tuned_rf = tune_model(rf)

准确性AUC召回Prec.F1 系列卡帕MCC 公司
00.81580.75080.31810.66470.43020.3363 0.3689
10.82830.76750.32950.74190.45630.37190.4152
20.81390.73370.31810.65290.42770.33210.3628
30.82460.75880.30950.73470.43550.35140.3976
40.81700.75670.34380.6557 0.45110.35390.3805
50.82580.75060.33240.72050.45490.36760.4067
60.81700.75300.33240.66290.44270.34740.3771
70.82210.75070.33810.69010.45380.36210.3951
80.81770.7201 0.29800.69330.41680.32860.3699
90.82070.74840.31320.69870.43250.34390.3831
意味 着0.82030.74900.32330.69150.44020.34950.3857
标清0.00450.01260.01350.03100.01290.01400.0165

如果我们将这个优化的 RandomForestClassifier 模型的 Accuracy 指标与之前的 RandomForestClassifier 进行比较,我们会看到差异,因为它从 Accuracy 变为 Accuracy 。0.8199 0.8203

在 [24] 中:

#tuned model object is stored in the variable 'tuned_dt'. 
print(tuned_rf)
RandomForestClassifier(bootstrap=False, ccp_alpha=0.0, class_weight={},
criterion='entropy', max_depth=5, max_features=1.0,
max_leaf_nodes=None, max_samples=None,
min_impurity_decrease=0.0002, min_impurity_split=None,
min_samples_leaf=5, min_samples_split=10,
min_weight_fraction_leaf=0.0, n_estimators=150,
n_jobs=-1, oob_score=False, random_state=123, verbose=0,
warm_start=False)

现在让我们比较一下超参数。我们以前有过这些。

max_depth=None
max_features='auto'
min_samples_leaf=1
min_samples_split=2
min_weight_fraction_leaf=0.0
n_estimators=100
n_jobs=-1

现在这些:

max_depth=5
max_features=1.0
min_samples_leaf=5
min_samples_split=10
min_weight_fraction_leaf=0.0
n_estimators=150
n_jobs=-1

您可以自己进行相同的比较,并探索超参数中的差异。knndt

默认情况下,优化 Accuracy (精度),但这可以使用参数进行更改。例如:将查找导致最高 AUC 而不是准确性的决策树分类器的超参数。在此示例中,我们仅使用 Accuracy 的默认指标来简化操作。tune_modeloptimizetune_model(dt, optimize = 'AUC')

通常,当数据集不平衡时(就像我们正在处理的信用数据集一样),准确性不是一个值得考虑的好指标。选择正确量度来评估评级的方法不在本教程的讨论范围之内。

在选择最佳生产模型时,指标本身并不是您应该考虑的唯一标准。其他需要考虑的因素包括训练时间、k 折的标准差等。现在,让我们继续考虑 Random Forest Classifier ,作为本教程其余部分的最佳模型tuned_rf

6- 绘制模型

在最终确定模型之前(步骤 # 8),该函数可用于通过 AUC、confusion_matrix、决策边界等不同方面分析性能。此函数采用经过训练的模型对象,并返回基于训练/测试集的图形。plot_model()

有 15 种不同的绘图可用,请参阅文档以获取可用绘图的列表。plot_model()

在 [25] 中:

## AUC Plot

plot_model(tuned_rf, plot = 'auc')

在 [26] 中:

## Precision-recall curve

plot_model(tuned_rf, plot = 'pr')

在 [27] 中:

## feature importance

plot_model(tuned_rf, plot='feature')

在 [28] 中:

## Consufion matrix

plot_model(tuned_rf, plot = 'confusion_matrix')

7- 评估模型

分析模型性能的另一种方法是使用函数,该函数显示给定模型的所有可用图形的用户界面。它在内部使用该功能。evaluate_model()plot_model()

在 [29] 中:

evaluate_model(tuned_rf)

8- 最终确定模型

模型的完成是实验的最后一步。PyCaret 中的正常机器学习工作流程从 开始,然后比较所有模型,使用和预选一些候选模型(基于感兴趣的指标)来执行各种建模技术,例如超参数拟合、组装、堆叠等。setup()compare_models()

此工作流最终将引导您找到用于对新数据和未见过的数据进行预测的最佳模型。该函数将模型拟合到完整的数据集,包括测试样本(在本例中为 30%)。此函数的目的是在将模型部署到生产环境之前,在完整的数据集上训练模型。我们可以在 .我们将在它之后执行它。finalize_model()predict_model()

最后要提醒你。使用 完成模型后,整个数据集(包括测试集)将用于训练。因此,如果使用模型对测试集进行预测,则打印的信息网格将具有误导性,因为它试图对用于建模的相同数据进行预测。finalize_model()finalize_model()

为了证明这一点,我们将使用 in 将信息网格与前一个进行比较。final_rf predict_model()

在 [30] 中:

final_rf = finalize_model(tuned_rf)

在 [31] 中:

#Final Random Forest model parameters for deployment
print(final_rf)
RandomForestClassifier(bootstrap=False, ccp_alpha=0.0, class_weight={},
criterion='entropy', max_depth=5, max_features=1.0,
max_leaf_nodes=None, max_samples=None,
min_impurity_decrease=0.0002, min_impurity_split=None,
min_samples_leaf=5, min_samples_split=10,
min_weight_fraction_leaf=0.0, n_estimators=150,
n_jobs=-1, oob_score=False, random_state=123, verbose=0,
warm_start=False)

9- 使用模型进行预测

在最终确定模型之前,建议通过预测测试/保持集(在本例中为 data_unseen并查看评估指标来执行最终检查。如果您查看信息表,您将看到 30%(6841 个样本)的数据已被分离为训练/集样本。

我们上面看到的所有评估指标都是仅基于训练集 (70%) 的交叉验证结果。现在,使用存储在变量中的最终训练模型,我们针对测试样本进行预测并评估指标,以查看它们是否与 CV 结果存在重大差异tuned_rf

在 [32] 中:

predict_model(final_rf)

准确性AUC召回Prec.F1 系列卡帕MCC 公司
0随机森林分类器0.81840.75260.3533 0.69850.46920.37360.4053

出[32]:


LIMIT_BAL年龄BILL_AMT1BILL_AMT2BILL_AMT3BILL_AMT4BILL_AMT5BILL_AMT6PAY_AMT1PAY_AMT2...PAY_6_2PAY_6_3PAY_6_4PAY_6_5PAY_6_6PAY_6_7PAY_6_8违约标签得分
080000.029.06228.0 589.0390.0390.0390.0383.0589.0390.0...0.00.00.00.00.00.00.0000.8051
1180000.030.0149069.0152317.0156282.0161163.0172190.0148963.07500.08000.0...1.00.00.00.0 0.00.00.0100.9121
2100000.026.018999.023699.09390.05781.08065.017277.05129.01227.0...0.00.00.00.00.00.00.0000.8051
3500000.036.0396.0 1043.019230.0116696.0194483.0195454.01043.019230.0...0.00.00.00.00.00.00.0000.9121
4190000.047.0192493.0193297.0193400.0193278.0192956.0193039.07200.07222.0...0.00.00.0 0.00.00.00.0000.9121
..................................................................
6836120000.044.075294.0 76465.074675.079629.077748.082497.03000.00.0...1.00.00.00.00.00.00.0110.5013
683750000.026.047095.048085.049039.049662.00.00.02073.02027.0...0.00.00.0 0.00.00.00.0000.8603
683880000.039.046401.039456.030712.029629.028241.028030.01560.01421.0...0.00.00.00.00.00.00.0000.8051
6839200000.033.0 50612.010537.05552.02506.09443.011818.010023.027.0...0.00.00.00.00.00.00.0000.8051
6840210000.035.025806.05861.01666.01010.0300.0300.01035.01666.0...0.00.0 0.00.00.00.00.0000.9121

6841 行 × 91 列

将测试集的准确性与 的结果中实现的准确性进行比较。这并不是一个显著的差异。如果测试集和训练集的结果之间存在很大差异,这通常表明过度拟合,但也可能是由于其他几个因素造成的,需要进一步调查。0.81990.8203tuned_rf

在这种情况下,我们将继续完成模型和对看不见的数据(我们一开始分开的 5% 并且从未暴露给 PyCaret)进行预测。

(TIP:在使用 时,查看训练集结果的标准差总是好的。create_model()

该函数还用于预测看不见的数据集。唯一的区别是这次我们将传递 参数 . 是在本教程开始时创建的变量,其中包含从未向 PyCaret 公开的原始数据集的 5%(1200 个样本)。predict_model()data_unseendata_unseen

在 [33] 中:

unseen_predictions = predict_model(final_rf, data=data_unseen)
unseen_predictions.head()

出[33]:


LIMIT_BAL教育年龄PAY_1PAY_2 PAY_3PAY_4PAY_5...BILL_AMT6PAY_AMT1PAY_AMT2PAY_AMT3PAY_AMT4PAY_AMT5PAY_AMT6违约标签得分
0100000222230-1-100...567.0380.0601.00.0581.01687.01542.0 000.8051
138000012232-1-1-1-1-1...11873.021540.015138.024677.011851.011875.08251.0000.9121
220000022132-1 -1-1-12...3151.05818.015.09102.017.03165.01395.0000.8051
32000001115322222...149531.06300.05500.05500.05500.05000.0 5000.0110.7911
4240000112411-1-100...1737.02622.03301.00.0360.01737.0924.0000.9121

5 行 × 26 列

请转到上一个结果的最后一列,您将看到一个名为 Score

Label 是预测,score 是预测的概率。请注意,预测结果与原始数据集连接,而所有转换都在后台自动执行。

我们已经完成了实验,最终确定了现在存储在变量中的模型。我们还使用存储的模型来预测 。实验到此结束,但仍然存在一个问题:当您有更多新数据需要预测时会发生什么?你得再做一遍整个实验吗?答案是否定的,PyCaret 的内置功能允许您保存模型以及所有转换管道以备后用,并存储在本地环境中的 Pickle 中tuned_rf final_rffinal_rfdata_unseensave_model()

(提示:保存模型时,最好在文件名中使用日期,这对版本控制有好处)

让我们在下一步中看看

10- 保存/加载模型以进行生产

保存模型

在 [1] 中:

save_model(final_rf, 'datasets/Final RF Model 19Nov2020')
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in
----> 1save_model(final_rf, 'datasets/Final RF Model 19Nov2020')

NameError: name 'save_model' is not defined

负载模型

要加载在相同或替代环境中保存的模型,我们将使用 PyCaret 的函数,然后轻松地将保存的模型应用于新的看不见的数据以进行预测load_model()

在 [37] 中:

saved_final_rf = load_model('datasets/Final RF Model 19Nov2020')
Transformation Pipeline and Model Successfully Loaded

一旦模型加载到环境中,它就可以简单地用于使用同一函数预测任何新数据。接下来,我们应用加载的模型来预测我们之前使用的相同模型。predict_model()data_unseen

在 [38] 中:

new_prediction = predict_model(saved_final_rf, data=data_unseen)

在 [39] 中:

new_prediction.head()

出[39]:


LIMIT_BAL 教育年龄PAY_1PAY_2PAY_3PAY_4PAY_5...BILL_AMT6PAY_AMT1PAY_AMT2PAY_AMT3PAY_AMT4PAY_AMT5PAY_AMT6违约标签得分
0100000222230-1-100...567.0 380.0601.00.0581.01687.01542.0000.8051
138000012232-1-1-1-1-1...11873.021540.015138.024677.011851.011875.08251.0000.9121
2 20000022132-1-1-1-12...3151.05818.015.09102.017.03165.01395.0000.8051
32000001115322222... 149531.06300.05500.05500.05500.05000.05000.0110.7911
4240000112411-1-100...1737.02622.03301.00.0360.01737.0924.0000.9121

5 行 × 26 列

在 [41] 中:

from pycaret.utils import check_metric
check_metric(new_prediction.default, new_prediction.Label, 'Accuracy')

出[41]:

0.8167

优点和缺点

与任何新库一样,仍有改进的余地。我们将列出我们在使用该库时发现的一些优缺点。

优点:

  • 它使项目的建模部分变得更加容易。

  • 您只需一行代码即可创建许多不同的分析。

  • 在拟合模型时忘记传递参数列表。PyCaret 会自动为您执行此操作。

  • 您有许多不同的选项来评估模型,同样,只需一行代码

  • 由于它建立在著名的 ML 库之上,因此您可以轻松地将其与传统方法进行比较

缺点:

  • 该库处于早期版本,因此不够成熟并且容易受到 bug 的影响。老实说没什么大不了的

  • 与所有 Auto ML 库一样,它是一个黑匣子,因此您无法真正看到其中发生了什么。因此,我不会向初学者推荐它。

  • 这可能会使学习过程变得有点肤浅。

结论

本教程涵盖了整个 ML 流程,从数据摄取、预处理、模型训练、超参数拟合、预测和存储模型以备后用。我们在不到 10 个命令中完成了所有这些步骤,这些命令是自然构建的并且非常直观易记,例如 .在没有 PyCaret 的情况下重新创建整个实验在大多数库中需要 100 多行代码。create_model(), tune_model(), compare_models()

该库还允许您执行更高级的操作,例如高级预处理、汇编、广义堆叠和其他技术,这些技术允许您完全自定义 ML 管道,并且是任何数据科学家的必备工具。



本文链接:https://www.datasource.ai/uploads/624e8836466a40923b64b901b5050c0f.html


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/176471
 
428 次点击