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