CatBoost - 处理分类特征

分类特征是代表类别或标签而非数值的变量,因此有时被称为名义特征或离散特征。这些特征在各种现实世界数据集中很常见,很难纳入机器学习模型。

我们可以将类别分为两种主要类型 −

  • 名义分类特征:这些特征表示没有基本顺序或排名的类别,如颜色、性别和国家。这些特征通常需要特殊编码,如标签编码才能用于机器学习模型。

  • 有序分类特征:这些特征表示具有有意义顺序或排名的类别,如教育水平,包括高中、学士学位、硕士学位等类别。这些特征可以写成整数来显示它们的顺序。

CatBoost 参数

CatBoost 是一个高级梯度提升库,其中包含大量用于更改和优化模型的参数。让我们来看看一些最常用的 CatBoost 参数 −

  • learning_rate:当损失函数接近其最小值时,每次迭代都会调整步长。但它需要更多的迭代,较慢的学习率可以增强训练。最常见的值介于 0.01 和 0.3 之间。

  • 迭代:它显示集成树或提升迭代的总次数。更多的迭代可以提高模型性能,但它们增加了过度拟合的可能性。几百到几千是一个平均范围。

  • l2_leaf_reg:它是加权的 L2 正则化。对特征施加较大的权重有助于减少过度拟合。调整此值可改善正则化。

  • depth:它指的是集合中的树的总数。它定义了每棵树的复杂程度。虽然更深的树可以描述复杂的关系,但它们更容易过度拟合。值通常在 4 到 10 之间变化。

  • verbose:设置为 True 时,它​​会在迭代过程中显示训练进度。如果为 False,它会静默运行并且不会打印进度。

  • random_seed:它是随机数生成器使用的种子。设置此值可确保结果的可重复性。

  • one_hot_max_size:分类特征的单热编码可以支持的最大不同类别数。如果唯一类别的数量超过此限制,CatBoost 将使用有效的方法以不同的方式处理该特征。

  • cat_features:一组表示类别特征的索引。CatBoost 会出于训练目的对这些特征进行编码,并以不同的方式处理它们。

具有分类特征的 CatBoost

与许多其他机器学习模型不同,在这些模型中,分类变量或特征需要手动编码,但 CatBoost 可以直接处理分类特征。您只需告诉哪些特征是分类的,CatBoost 就会处理它们。那么让我们看看如何实现具有分类特征的 CatBoost −

1.安装 CatBoost 库

首先,您必须确保已安装 CatBoost 库。如果未安装,则可以使用以下命令进行安装 −

pip install catboost

导入库

安装后,您就可以在模型中使用它了。因此,请在代码中导入必要的库,如下所示 −

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

2. 加载和准备数据

您必须确保您的数据集具有分类特征。正如我们之前讨论过的,您不需要手动对它们进行编码。

# 示例数据
data = [
   ['red', 1, 5.1],
   ['blue', 0, 3.5],
   ['green', 1, 4.7],
   ['blue', 0, 2.9],
   ['red', 1, 5.0]
]

3. 目标值和拆分数据

现在您必须确定目标值,然后将其转换为数据框。转换为数据框后,您必须将数据拆分为测试和训练数据集,以测试和训练模型。

# 目标值
labels = [1, 0, 1, 0, 1]

# 转换为 DataFrame
import pandas as pd
df = pd.DataFrame(data, columns=['color', 'feature1', 'feature2'])

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

4.识别分类特征

正如我们在本章前面所看到的,在 CatBoost 中,您必须告诉模型哪些特征是分类的。 并且可以通过传递分类特征的索引或名称来完成此操作,就像下面的 −

# 声明分类特征(列索引或名称)
categorical_features = ['color']

5. 训练模型

现在使用 CatBoost 的 CatBoostClassifier 或 CatBoostRegressor 进行分类或回归任务。 在执行此操作之前,您必须池化对象以指定数据、标签和分类特征。参见下面的代码 −

# Pool 对象
train_pool = Pool(data=X_train, label=y_train, cat_features=categorical_features)
test_pool = Pool(data=X_test, label=y_test, cat_features=categorical_features)

# 初始化并训练模型
model = CatBoostClassifier(iterations=100, learning_rate=0.1,depth=6)
model.fit(train_pool)

# 在测试集上进行预测
preds = model.predict(test_pool)

# 模型准确率
accuracy = (preds == y_test).mean()
print(f"Accuracy: {accuracy}")

输出

这是我们为上述模型创建的结果CatBoost 中的分类特征 −

0:	learn: 0.6869753	total: 59.5ms	remaining: 5.89s
1:	learn: 0.6794071	total: 61.6ms	remaining: 3.02s
2:	learn: 0.6632128	total: 61.8ms	remaining: 2s
. 
. 
. 
96:	learn: 0.2241489	total: 83.4ms	remaining: 2.58ms
97:	learn: 0.2228507	total: 83.5ms	remaining: 1.7ms
98:	learn: 0.2215656	total: 83.7ms	remaining: 845us
99:	learn: 0.2202937	total: 83.9ms	remaining: 0us
Accuracy: 1.0