CatBoost算法
-
CatBoost = Catgorical + Boost
-
高效的处理分类特征(categorical features),首先对分类特征做统计,计算某个分类特征
(category)出现的频率,然后加上超参数,生成新的数值型特征(numerical features)
-
同时使用组合类别特征,丰富了特征维度
-
采用的基模型是对称决策树,算法的参数少、支持分类变量,通过可以防止过拟合
模型 | XGBoost | LightGBM | CatBoost | ||
---|---|---|---|---|---|
使用参数 | max_depth:50learning_rate:0.16min_child_weight:1n_estimators:200 | max_depth:50learning_rate:0.1num_leaves:900n_estimators:300 | max_depth:10learning_rate:0.15l2_leaf_reg=9iteration:500one_hot_max_size=50 | ||
训练集AUC | 0.999 | 没有使用分类特征索引 | 使用分类特征索引 | 没有使用分类特征索引 | 使用分类特征索引 |
0.992 | 0.999 | 0.842 | 0.887 | ||
测试集AUC | 0.789 | 0.785 | 0.772 | 0.752 | 0.816 |
训练用时 | 970秒 | 153秒 | 326秒 | 180秒 | 390秒 |
预测用时 | 184秒 | 40秒 | 156秒 | 2秒 | 14秒 |
CatBoost,LightGBM,XGBoost对比
- CatBoost 过拟合程度最小,在测试集上准确度最高0.816,同时预测用时最短,但这个表现仅仅在有分类特征,而且调节了one-hot最大量时才会出现
- 如果不利用 CatBoost 算法在这些特征上的优势,表现效果就会变成最差,AUC 0.752
- 使用CatBoost需要数据中包含分类变量,同时适当地调节这些变量时,才会表现不错
处理特征为分类的神器 - 支持即用的分类特征,因此我们不需要对分类特征进行预处理(比如使用LabelEncoding 或 OneHotEncoding)
- CatBoost 设计了一种算法验证改进,避免了过拟合。因此处理分类数据比LightGBM 和XGBoost 强
准确性比 XGBoost 更高,同时训练时间更短 - 支持 GPU 训练
- 可以处理缺失的值
CatBoost工具
- 构造参数:
learning_rate,学习率 - depth, 树的深度
- l2_leaf_reg,L2正则化系数
- n_estimators,树的最大数量,即迭代次数
- one_hot_max_size,one-hot编码最大规模,默认值根据数据和训练环境的不同而不同
- loss_function ,损失函数,包括Logloss,RMSE,MAE,CrossEntropy,回归任务默认RMSE,分类任务默认Logloss
- eval_metric,优化目标,包括RMSE,Logloss,MAE,CrossEntropy,Recall,Precision,F1,Accuracy,AUC,R2
fit函数参数
- X,输入数据数据类型可以是:list; pandas.DataFrame; pandas.Series
y=None - cat_features=None,用于处理分类特征
- sample_weight=None,输入数据的样本权重
- logging_level=None,控制是否输出日志信息,或者其他信息
- plot=False,训练过程中,绘制,度量值,所用时间等
- eval_set=None,验证集合,数据类型list(X, y)tuples
- baseline=None
- use_best_model=None
- verbose=None
model = CatBoostClassifier(iterations=1000, # 最大树数,即迭代次数
depth = 6, # 树的深度
learning_rate = 0.03, # 学习率
custom_loss='AUC', # 训练过程中,用户自定义的损失函数
eval_metric='AUC', # 过拟合检验(设置True)的评估指标,用于优化
bagging_temperature=0.83, # 贝叶斯bootstrap强度设置
rsm = 0.78, # 随机子空间
od_type='Iter', # 过拟合检查类型
od_wait=150, # 使用Iter时,表示达到指定次数后,停止训练
metric_period = 400, #计算优化评估值的频率
l2_leaf_reg = 5, #l2正则参数
thread_count = 20, # 并行线程数量
random_seed = 967 # 随机数种子
)
模型参数配置
model = cb.CatBoostClassifier(iterations=1000,
depth=7,
learning_rate=0.01,
loss_function='Logloss',
eval_metric='AUC',
logging_level='Verbose',
metric_period=50)
# 得到分类特征的列号
categorical_features_indices = []
for i in range(len(X_train.columns)):
if X_train.columns.values[i] in attr:
categorical_features_indices.append(i)
print(categorical_features_indices)
attr=['Age','BusinessTravel','Department','Education','EducationField','Gender','JobRole','MaritalStatus','Over18','OverTime']
模型训练,得出预测结果
model.fit(X_train, y_train, eval_set=(X_valid, y_valid), cat_features=categorical_features_indices)
predict = model.predict(test)
test['Attrition']=predict
test[['Attrition']].to_csv('submit_cb.csv')
总结
-
LighGBM效率高,在Kaggle比赛中应用多
-
CatBoost对于分类特征多的数据,可以高效的处理,过拟合程度小,效果好
-
XGBoost, LightGBM, CatBoost参数较多,调参需要花大量时间
-
Boosting集成学习包括AdaBoosting和Gradient Boosting
-
Boosting只是集成学习中的一种(Bagging, Stacking)
网友评论