CatBoost - 处理类别特征



类别特征是表示类别或标签而不是数值的变量,因此有时也被称为名义或离散特征。这些特征在各种现实世界的数据集中很常见,并且难以包含到机器学习模型中。

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

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

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

CatBoost 参数

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

  • 学习率 (learning_rate):随着损失函数接近其最小值,步长在每次迭代中都会进行调整。但是它需要更多迭代,较慢的学习率可以增强训练。最常见的值范围在 0.01 到 0.3 之间。

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

  • L2 叶子正则化 (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. 加载和准备数据

你必须确保你的数据集具有类别特征。正如我们前面讨论的,你不需要手动编码它们。

# Sample Data
data = [
   ['red', 1, 5.1],
   ['blue', 0, 3.5],
   ['green', 1, 4.7],
   ['blue', 0, 2.9],
   ['red', 1, 5.0]
]

3. 目标值和数据分割

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

# Target values
labels = [1, 0, 1, 0, 1]

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

# Split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(df, labels, test_size=0.2, random_state=42)

4. 识别类别特征

正如我们本章前面所看到的,在 CatBoost 中,你必须告诉模型哪些特征是类别的。这可以通过传递类别特征的索引或名称来实现,如下所示:

# Declare categorical features (column index or name)
categorical_features = ['color']

5. 训练模型

现在,使用 CatBoost 的 CatBoostClassifier 或 CatBoostRegressor 进行分类或回归任务。在执行此操作之前,你必须创建一个池对象来指定数据、标签和类别特征。请参见下面的代码:

# Pool object
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)

# Initialize and train the model
model = CatBoostClassifier(iterations=100, learning_rate=0.1, depth=6)
model.fit(train_pool)

# Predict on the test set
preds = model.predict(test_pool)

# Model accuracy
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
广告