CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,这一点从它的名字中可以看出来,CatBoost是由Categorical和Boosting组成。此外,CatBoost还解决了梯度偏差(Gradient Bias)以及预测偏移(Prediction shift)的问题,从而减少过拟合的发生,进而提高算法的准确性和泛化能力。
与XGBoost、LightGBM相比,CatBoost的创新点有:
loss_function 损失函数,支持的有RMSE, Logloss, MAE, CrossEntropy, Quantile, LogLinQuantile, Multiclass, MultiClassOneVsAll, MAPE,Poisson。默认RMSE。
custom_metric 训练过程中输出的度量值。这些功能未经优化,仅出于信息目的显示。默认None。
eval_metric 用于过拟合检验(设置True)和最佳模型选择(设置True)的loss function,用于优化。 RMSE、Logloss、MAE、CrossEntropy、Recall、Precision、F1、Accuracy、AUC、R2
iterations 最大树数。默认1000。
learning_rate 学习率。默认0.03。
random_seed 训练时候的随机种子
l2_leaf_reg L2正则参数。默认3
bootstrap_type 定义权重计算逻辑,可选参数:Poisson (supported for GPU only)/Bayesian/Bernoulli/No,默认为Bayesian
bagging_temperature 贝叶斯套袋控制强度,区间[0, 1]。默认1。
subsample 设置样本率,当bootstrap_type为Poisson或Bernoulli时使用,默认66
sampling_frequency设置创建树时的采样频率,可选值PerTree/PerTreeLevel,默认为PerTreeLevel
random_strength 分数标准差乘数。默认1。
use_best_model 设置此参数时,需要提供测试数据,树的个数通过训练参数和优化loss function获得。默认False。
best_model_min_trees 最佳模型应该具有的树的最小数目。
depth 树深,最大16,建议在1到10之间。默认6。
ignored_features 忽略数据集中的某些特征。默认None。
one_hot_max_size 如果feature包含的不同值的数目超过了指定值,将feature转化为float。默认False
has_time 在将categorical features转化为numerical features和选择树结构时,顺序选择输入数据。默认False(随机)
rsm 随机子空间(Random subspace method)。默认1。
nan_mode处理输入数据中缺失值的方法,包括Forbidden(禁止存在缺失),Min(用最小值补),Max(用最大值补)。默认Min。
fold_permutation_block_size数据集中的对象在随机排列之前按块分组。此参数定义块的大小。值越小,训练越慢。较大的值可能导致质量下降。
leaf_estimation_method 计算叶子值的方法,Newton/ Gradient。默认Gradient。
leaf_estimation_iterations 计算叶子值时梯度步数。
leaf_estimation_backtracking 在梯度下降期间要使用的回溯类型。
fold_len_multiplier folds长度系数。设置大于1的参数,在参数较小时获得最佳结果。默认2。
approx_on_full_history 计算近似值,False:使用1/fold_len_multiplier计算;True:使用fold中前面所有行计算。默认False。
class_weights 类别的权重。默认None。
scale_pos_weight 二进制分类中class 1的权重。该值用作class 1中对象权重的乘数。
boosting_type 增压方案
allow_const_label 使用它为所有对象训练具有相同标签值的数据集的模型。默认为False
od_type 要使用的过拟合检测器的类型。可能的值:‘IncToDec’、‘Iter’
od_wait 在迭代之后以最佳度量值继续训练的迭代次数。此参数的用途因所选的过拟合检测器类型而异:1.IncToDec —达到阈值时忽略过拟合检测器,并在迭代后使用最佳度量值继续学习指定的迭代次数。2.Iter —考虑模型过度拟合,并且自从具有最佳度量值的迭代以来,在指定的迭代次数后停止训练。
grow_policy 树生长策略。定义如何执行贪婪树的构建。可能的值:
class Pool(data,
label=None, cat_features=None, column_description=None,
pairs=None, delimiter='\t', has_header=False,
weight=None, group_id=None, group_weight=None,
subgroup_id=None, pairs_weight=None, baseline=None,
feature_names=None, thread_count=-1)
from catboost import CatBoostClassifier, Pool
train_data = Pool(data=[[1, 4, 5, 6],
[4, 5, 6, 7],
[30, 40, 50, 60]],
label=[1, 1, -1],
weight=[0.1, 0.2, 0.3])
train_data
# <catboost.core.Pool at 0x1a22af06d0>
model = CatBoostClassifier(iterations=10)
model.fit(train_data)
preds_class = model.predict(train_data)
# Get predicted classes
preds_class = model.predict(test_data)
# Get predicted probabilities for each class
preds_proba = model.predict_proba(test_data)
# Get predicted RawFormulaVal
preds_raw = model.predict(test_data, prediction_type='RawFormulaVal')
# 数据准备的部分见库和数据集准备部分
params = {
'iterations': 500,
'learning_rate': 0.1,
'eval_metric': 'Accuracy',
'random_seed': 666,
'logging_level': 'Silent',
'use_best_model': False
}
# train
train_pool = Pool(X_train, y_train, cat_features=categorical_features_indices)
# validation
validate_pool = Pool(X_validation, y_validation, cat_features=categorical_features_indices)
# train with 'use_best_model': False
model = CatBoostClassifier(**params)
model.fit(train_pool, eval_set=validate_pool)
# train with 'use_best_model': True
best_model_params = params.copy()
best_model_params.update({'use_best_model': True})
best_model = CatBoostClassifier(**best_model_params)
best_model.fit(train_pool, eval_set=validate_pool);
# show result
print('Simple model validation accuracy: {:.4}, and the number of trees: {}'.format(
accuracy_score(y_validation, model.predict(X_validation)), model.tree_count_))
print('')
print('Best model validation accuracy: {:.4}, and the number of trees: {}'.format(
accuracy_score(y_validation, best_model.predict(X_validation)),best_model.tree_count_))
earlystop_model_1.fit(train_pool, eval_set=validate_pool, early_stopping_rounds=200, verbose=20)
feature_importances = model.get_feature_importance(train_pool)
feature_names = X_train.columns
for score, name in sorted(zip(feature_importances, feature_names), reverse=True):
print('{}: {}'.format(name, score))
model = CatBoostClassifier(**current_params).fit(X_train, y_train, categorical_features_indices)
# Get baseline (only with prediction_type='RawFormulaVal')
baseline = model.predict(X_train, prediction_type='RawFormulaVal')
# Fit new model
model.fit(X_train, y_train, categorical_features_indices, baseline=baseline);
categorical_features_indices = np.where(X.dtypes != np.float)[0]
# categorical_features_indices 可以加载fit里,也可以放在Pool里
# 如果fit 输入数据是Pool格式的,categorical_features_indices必须为None