CatBoost - 分类指标

CatBoost 主要用于分类任务。对某事物进行分类就是将其归入某一类别。我们使用多个标准分析 CatBoost 在数据分类方面的性能。

将数据点分类到不同的类别中是分类问题的主要目标。CatBoost 提供了多个指标来评估模型性能。

可以使用以下必需指标评估 CatBoost 分类的性能 −

准确度

这显示了模型预测的准确百分比。这是准确预测的总数除以预测总数。然而,这种测量在这种情况下最有意义,但对于不平衡的数据集(一个类的数量明显超过另一个类),它可能不是最好的选择。

为了找到准确度,我们必须导入 numpy、catboost、sklearn.datasets 和 sklearn.model_selection 等库。

import numpy as np
from catboost import CatBoostClassifier, Pool
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载 Iris 数据集
iris = load_iris()
X, y = iris.data, iris.target

# 将数据拆分为训练和测试数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 CatBoostClassifier
model = CatBoostClassifier(iterations=100, learning_rate=0.1,depth=6,loss_function='MultiClass',verbose=0)

# 创建 Pool 对象
train_pool = Pool(X_train,label=y_train)
test_pool = Pool(X_test,label=y_test)

# 训练模型
model.fit(train_pool)

# 评估模型
metrics = model.eval_metrics(test_pool,metrics=['Accuracy'],plot=True)

# 打印评估指标
accuracy = metrics['Accuracy'][-1]

print(f'Accuracy is: {accuracy:.2f}')

输出

结果表明,该模型非常适合数据集,并且已成功预测数据集中的每个事件。

MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))
准确率:1.00

多类对数损失

多类对数损失,也称为多类分类的交叉熵,是对数损失的一种变体,专为多类分类问题而设计。这通过预测多个类别的概率分布来评估预期概率与实际类别标签匹配的点。

import numpy as np
from catboost import CatBoostClassifier, Pool
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载 Iris 数据集
iris = load_iris()
X, y = iris.data, iris.target

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 CatBoostClassifier
model = CatBoostClassifier(iterations=100, learning_rate=0.1,depth=6,loss_function='MultiClass', verbose=0)

# 创建一个 Pool 对象
train_pool = Pool(X_train, label=y_train)
test_pool = Pool(X_test, label=y_test)

# 训练模型
model.fit(train_pool)

# 评估多类分类模型
metrics = model.eval_metrics(test_pool, metrics=['MultiClass'], plot = True)

# 打印评估指标
multi_class_loss = metrics['MultiClass'][-1]

print(f'Multi-Class Loss: {multi_class_loss:.2f}')

输出

在下面的结果中,多类损失值为 0.03 表示该模型在测试数据集的多类分类方面表现良好。

MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))
Multi-Class Loss:0.03

二元对数损失

二元对数损失衡量真实标签与预测概率之间的差异。对数损失值越低,性能越好。此指标对于做出准确预测很有用。它可以用于需要更精确测量概率的情况,例如欺诈检测或医疗诊断。在谈论二元分类时经常会提到它,即数据集只有两个类时。

由于 Iris 数据集有三个类,因此不适合此指标。借助乳腺癌数据集,我们可以看到它只有两个类:代表乳腺癌的存在和不存在。

import numpy as np
from catboost import CatBoostClassifier, Pool
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# 加载乳腺癌数据集
data = load_breast_cancer()
X, y = data.data, data.target

# 将数据拆分为训练和测试数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 CatBoostClassifier
model = CatBoostClassifier(iterations=100, learning_rate=0.1,depth=6, verbose=0)

# 创建一个 Pool 对象
train_pool = Pool(X_train, label=y_train)
test_pool = Pool(X_test, label=y_test)

# 训练模型
model.fit(train_pool)

# 评估模型
metrics = model.eval_metrics(test_pool, metrics=['Logloss'], plot =False)

# 打印评估指标
logloss = metrics['Logloss'][-1]

print(f'Log Loss (Cross-Entropy): {logloss:.2f}')

输出

以下是上述代码的输出 −

Log Loss (Cross-Entropy):0.08

AUC-ROC 和 AUC-PRC

受试者工作特征曲线下面积 (AUR-ROC) 和准确率-召回率曲线下面积 (AUC-PRC) 是二元分类算法的关键指标。 AUC-ROC 评估模型区分正分类和负分类的能力,而 AUC-PRC 则更关注准确率和召回率之间的权衡。

import catboost
from catboost import CatBoostClassifier, Pool
from sklearn import datasets
from sklearn.model_selection import train_test_split

# 加载 Iris 数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 通过映射转换为二分类
y_binary = (y == 2).astype(int)

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_binary, test_size=0.2, random_state=42)

# 使用创建 CatBoost 分类器AUC-ROC 指标
model = CatBoostClassifier(iterations=500, random_seed=42, eval_metric='AUC')

# 将训练数据转换为 CatBoost Pool
train_pool = Pool(X_train, label=y_train)

# 训练模型
model.fit(train_pool, verbose=100)

validation_pool = Pool(X_test, label=y_test)
eval_result = model.eval_metrics(validation_pool, ['AUC'])['AUC']
metrics = model.eval_metrics(validation_pool, metrics=['PRAUC'],plot = True)
auc_pr = metrics['PRAUC'][-1]

# 打印评估指标

print(f'AUC-PR: {auc_pr:.2f}')

print(f"AUC-ROC: {eval_result[-1]:.4f}")

输出

这将产生以下结果 −

Learning rate set to 0.007867
0:	total: 2.09ms	remaining: 1.04s
100:	total: 42.3ms	remaining: 167ms
200:	total: 67.9ms	remaining: 101ms
300:	total: 89.8ms	remaining: 59.4ms
400:	total: 110ms	remaining: 27ms
499:	total: 129ms	remaining: 0us
MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))
AUC-PR: 1.00
AUC-ROC: 1.0000

F1 分数

F1 分数是模型的准确率,即它预测某个类别的准确度,以及召回率,即它能够识别该类别的频率。为了平衡假阳性和假阴性之间的权衡,这个统计数据是完美的。我们还需要记住,更好的模型往往具有更高的 F1 分数。

import numpy as np
from catboost import CatBoostClassifier, Pool
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# 加载乳腺癌数据集
data = load_breast_cancer()
X, y = data.data, data.target

# 将数据拆分为训练和测试数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 CatBoostClassifier
model = CatBoostClassifier(iterations=100, learning_rate=0.1,depth=6,verbose=0)

# 创建 Pool 对象
train_pool = Pool(X_train, label=y_train)
test_pool = Pool(X_test, label=y_test)

# 训练模型
model.fit(train_pool)

# 评估模型
metrics = model.eval_metrics(test_pool, metrics=['F1'], plot=True)

# 打印评估指标
f1 = metrics['F1'][-1]

print(f'F1 Score: {f1:.2f}')

输出

这将导致以下结果 −

MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))
F1 得分:0.98

总结

总之,CatBoost 提供了广泛的指标和评估工具大大简化了模型选择和评估过程。它从内置的分类任务评估指标开始,例如均方误差和对数损失,但也允许使用用户定义的指标进行自定义。通过在整个训练过程中使用早期停止、交叉验证和监控许多指标的能力,可以确保完整的评估。它为需要分类的任务提供了广泛的指标。