CatBoost算法梳理

CatBoost算法梳理

原文格式粘贴过来就不对了,还是到原文看吧:http://datacruiser.io/2019/08/19/DataWhale-Workout-No-8-CatBoost-Summary/


补充

  1. What is Target Leakage?

    Target leakage, sometimes called data leakage, is one of the most difficult problems when developing a machine learning model. It happens when you train your algorithm on a dataset that includes information that would not be available at the time of prediction when you apply that model to data you collect in the future. Since it already knows the actual outcomes, the model’s results will be unrealistically accurate for the training data, like bringing an answer sheet into an exam.

  2. 作为GBDT框架内的算法,GBDT、XGBoost、LightGBM能够应用的场景CatBoost也都适用,并且在处理类别型特征具备独有的优势,比如广告推荐领域。


https://www.jianshu.com/p/49ab87122562

今天笔者来介绍一个超级简单并且又极其实用的 boosting 算法包 Catboost,据开发者所说这一 boosting 算法是超越 Lightgbm 和 XGBoost 的又一个神器。

catboost 简介

在笔者看来 catboost 有一下三个的优点:

  • 它自动采用特殊的方式处理类别型特征(categorical features)。首先对 categorical features 做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成新的数值型特征(numerical features)。这也是我在这里介绍这个算法最大的 motivtion,有了 catboost,再也不用手动处理类别型特征了。
  • catboost 还使用了组合类别特征,可以利用到特征之间的联系,这极大的丰富了特征维度
  • catboost 的基模型采用的是对称树,同时计算 leaf-value 方式和传统的 boosting 算法也不一样,传统的 boosting 算法计算的是平均数,而 catboost 在这方面做了优化采用了其他的算法,这些改进都能防止模型过拟合

这里笔者只是简单介绍了一下 catboost 的优点,至于内部原理的细节部分,感兴趣的同学可以去看看论文原文,原文链接在这里。由俄罗斯大兄弟于 2017 年发表。

catboost 实战

这里笔者采用的是之前参加一个 CTR 点击率预估的数据集,首先通过 pandas 读入数据。

from catboost import CatBoostClassifier
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
data  = pd.read_csv("ctr_train.txt", delimiter="\t")
del data["user_tags"]
data = data.fillna(0)
X_train, X_validation, y_train, y_validation = train_test_split(data.iloc[:,:-1],data.iloc[:,-1],test_size=0.3 , random_state=1234)

这里我们可以观察一下数据的特征列,这里有很多列特征比如广告的宽高是否可以下载是否会跳转等一些特征,而且特征的数据类型各不一样,有数值型(creative_height),布尔型(creative_is_js) 等不同类型的特征。

img

data

下图我们对所有特征做了一个统计,发现整个训练数据集一共有 34 列,除去标签列,整个数据集一共有 33 个特征,其中 6 个为布尔型特征,2 个为浮点型特征,18 个整型特征,还有 8 个对象型特征。

img

data_information

如果按照正常的算法,此时应该将非数值型特征通过各种数据预处理手段,各种编码方式转化为数值型特征。而在 catboost 中你根本不用费心干这些,你只需要告诉算法,哪些特征属于类别特征,它会自动帮你处理。代码如下所示:

categorical_features_indices = np.where(X_train.dtypes != np.float)[0]
model = CatBoostClassifier(iterations=100, depth=5,cat_features=categorical_features_indices,learning_rate=0.5, loss_function='Logloss',
                            logging_level='Verbose')

最后就是将数据喂给算法,训练走起来。

model.fit(X_train,y_train,eval_set=(X_validation, y_validation),plot=True)

将 plot = ture 打开后,catboot 包还提供了非常炫酷的训练可视化功能,从下图可以看到我的 Logloss 正在不停的下降。

img

training

训练结束后,通过 model.feature_importances_属性,我们可以拿到这些特征的重要程度数据,特征的重要性程度可以帮助我们分析出一些有用的信息。

import matplotlib.pyplot as plt 
fea_ = model.feature_importances_
fea_name = model.feature_names_
plt.figure(figsize=(10, 10))
plt.barh(fea_name,fea_,height =0.5)

执行上方代码,我们可以拿到特征重要程度的可视化结构,从下图我们发现 campaign_id 是用户是否点击这个广告的最关键的影响因子。

img

feature_importance

结语

至此整个 catboot 的优点和使用方法都介绍完了,是不是觉得十分简单易用,而且功能强大。深度学习,神经网络减弱了我们对特征工程的依赖,catboost 也在朝着这方面努力。所以有时候碰到需要特别多的前期数据处理和特征数值化的任务时,可以尝试用一下 catboost,python pip install catboost 即可安装哦。

posted @ 2020-05-16 22:46  别再闹了  阅读(1744)  评论(1)    收藏  举报