集成学习(五)——Catboost

1.介绍

CatBoost(categorical boosting)是一种能够很好地处理类别型特征的梯度提升算法库。该库中的学习算法基于GPU实现,打分算法基于CPU实现。

2. 类别型特征处理

首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成新的数值型特征(numerical features)。

类别型特征
这类特征不是数值型特征,而是离散的集合,比如省份名(山东,山西,河北等)。在梯度提升算法中,最常用的是将这些类别型特征转为数值型来处理,一般类别型特征会转化为一个或多个数值型特征。如果某个类别型特征基数比较低,即该特征的所有值去重后构成的集合元素个数比较少,一般利用one-hot编码方法将特征转为数值型。
类别特征》》数值型特征

  1. 序列编码:一般处理类别间具有大小关系的数据,例如期末成绩的 [A, B, C, D] 四挡可以直接转化为 [0, 1, 2, 3]。在转化后,依然保持类别之间的顺序关系。
  2. 独热编码:使用独热编码,对每种血型赋予不同的权重:
    A - [1, 0, 0, 0]
    B - [0, 1, 0, 0]
    AB - [0, 0, 1, 0]
    O - [0, 0, 0, 1]
  3. 二进制编码:先使用序列编码转化为数值形式,再将数值转义成二进制的方式,使得编码更加紧凑,节省存储空间。
  4. 统计编码:统计各类别在训练集中出现的频率,并将频率作为新的特征。在某些情况下,具有统计意义的统计编码也是一种值得尝试的技巧。

CatBoot的解决办法
将离散特征的处理过程与标签关联起来。
首先对所有样本进行随机排序,然后针对类别型特征中的某个取值,每个样本的该特征转为数值型时都是基于排在该样本之前的类别标签取均值,同时加入了优先级和优先级的权重系数。公式示例如下:
∑ j = 1 p − 1 [ x σ j , k = x σ p , k ] Y σ j + a ⋅ P ∑ j = 1 p − 1 [ x σ j , k = x σ p , k ] + a \frac{\sum_{j=1}^{p-1}[x_{\sigma_j,k}=x_{\sigma_p,k}]Y_{\sigma_j}+a\cdot P}{\sum_{j=1}^{p-1}[x_{\sigma_j,k}=x_{\sigma_p,k}]+a} j=1p1[xσj,k=xσp,k]+aj=1p1[xσj,k=xσp,k]Yσj+aP

上面的 σ j \sigma_j σj表示第j条数据,k表示第k个特征。括号就是指示函数,符合里面的条件就为1,否则就为0
.这种做法可以降低类别特征中低频次特征带来的噪声。

3.组合类别特征

考虑使用categorical features的不同组合。例如颜色和种类组合起来,可以构成类似于blue dog这样的feature。
方法
当需要组合的categorical features变多时,catboost只考虑一部分combinations。
在选择第一个节点时,只考虑选择一个feature,例如A。
在生成第二个节点时,考虑A和任意一个categorical feature的组合,选择其中最好的。
就这样使用贪心算法生成combinations。

4.Leaf_values

传统的boosting使用平均数:

∑ i = 1 n g ( a p p r o x ( i ) , t a r g e t ( i ) ) n \sum_{i=1}^n \frac{g(approx(i),target(i))}{n} i=1nng(approx(i),target(i))

catboost采用另外的计算方法:

∑ i = 1 d o c g ( a p p r o x ( i ) , t a r g e t ( i ) ) d o c s i n t h e p a s t \sum_{i=1}^{doc} \frac{g(approx(i),target(i))}{docs in the past} i=1docdocsinthepastg(approx(i),target(i))

### 如何在 PyTorch 中集成 CatBoost 尽管 CatBoost 是一个独立的库,主要用于处理结构化数据和类别特征,而 PyTorch 更适合用于神经网络和其他深度学习任务,但在某些情况下可能希望将两者结合起来使用。一种常见的做法是在 PyTorch 模型之前或之后应用 CatBoost 模型。 #### 方法一:CatBoost 作为预处理器 可以在 PyTorch 模型之前使用 CatBoost 来提取特征或将原始输入转换为更有意义的形式。这有助于捕捉复杂的非线性关系,并减少对大量手工设计特征的需求。 ```python from catboost import CatBoostClassifier import torch.nn as nn import numpy as np class Preprocessor(nn.Module): def __init__(self, cb_model_path=None): super(Preprocessor, self).__init__() if cb_model_path is not None: self.catboost = CatBoostClassifier() self.catboost.load_model(cb_model_path) def forward(self, x): # 假设 x 是 pandas DataFrame 或类似的表格数据 transformed_features = self.catboost.predict_proba(x) return torch.tensor(transformed_features).float() preprocessor = Preprocessor('path_to_catboost_model') input_data = ... # 输入数据应为 Pandas DataFrame 或其他兼容格式 output_tensor = preprocessor(input_data)[^1] ``` #### 方法二:CatBoost 结果作为附加特征 另一种方式是先用 CatBoost 训练好模型,再将其预测结果作为额外特征加入到 PyTorch 的输入层中。这种方法允许两个模型各自发挥优势——CatBoost 对于结构化数据的强大表现力加上 PyTorch 在图像、序列等领域的能力。 ```python catboost_predictions = catboost_model.predict(X_train) combined_input = np.hstack([X_train.values, catboost_predictions.reshape(-1, 1)]) pytorch_dataset = TensorDataset(torch.from_numpy(combined_input), ...) dataloader = DataLoader(pytorch_dataset, batch_size=32, shuffle=True) for inputs, labels in dataloader: outputs = pytorch_model(inputs.float()) loss = criterion(outputs, labels.long()) optimizer.zero_grad() loss.backward() optimizer.step()[^2] ``` 需要注意的是,虽然上述两种方法展示了如何结合这两个框架,但实际上它们属于不同的领域和技术栈。因此,在实际项目中选择合适的工具非常重要。如果主要工作集中在结构化数据分析上,则建议优先考虑像 Scikit-Learn 这样的传统机器学习库;而对于涉及复杂模式识别的任务(如计算机视觉),则更适合采用基于 TensorFlow 或 PyTorch 构建的解决方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值