精华内容
下载资源
问答
  • Catboost调参
    千次阅读
    2019-09-27 07:28:23

    一、参数速查

    1.通用参数

     

    2.性能参数

    3.处理单元设置

    二、分类

    三、回归

    转载于:https://www.cnblogs.com/nxf-rabbit75/p/10923566.html

    更多相关内容
  • 本文主要讲解:Optuna和Hyperopt性能对比(catboost示例)

    1、摘要

    本文主要讲解:Optuna和Hyperopt性能对比

    2、数据介绍

    如需数据请私聊

    3、相关技术

    optuna主要的调参原理如下:
    1 采样算法(随机搜索)
    利用 suggested 参数值和评估的目标值的记录,采样器基本上不断缩小搜索空间,直到找到一个最佳的搜索空间,其产生的参数会带来更好的目标函数值。
    2 剪枝算法
    自动在训练的早期(也就是自动化的 early-stopping)终止无望的 trial

    Hyperopt主要的调参原理如下:
    hyperopt是一个Python库,主要使用①随机搜索算法/②模拟退火算法/③TPE算法来对某个算法模型的最佳参数进行智能搜索,它的全称是Hyperparameter Optimization。

    4、完整代码和步骤

    最终测试结果如下:

    在这里插入图片描述

    optuna程序入口

    import os
    import time
    
    import optuna
    import pandas as pd
    from catboost import CatBoostRegressor
    from sklearn.metrics import r2_score, mean_squared_error
    from sklearn.model_selection import train_test_split
    
    os.chdir(r'D:\项目\PSO_CATBOOST\\')
    src = r'D:\项目\PSO_CATBOOST\\'
    file = 'shuju.xlsx'
    data = pd.read_excel(file)
    X_train = data.drop(['label', 'b1', 'b2'], axis=1).values
    y_train = data['label'].values
    X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
    
    
    def epoch_time(start_time, end_time):
        elapsed_secs = end_time - start_time
        elapsed_mins = elapsed_secs / 60
        return elapsed_mins, elapsed_secs
    
    
    def objective(trial):
        # 自定义的参数空间
        depth = trial.suggest_int('depth', 1, 16)
        border_count = trial.suggest_int('border_count', 1, 222)
        l2_leaf_reg = trial.suggest_int('l2_leaf_reg', 1, 222)
        learning_rate = trial.suggest_uniform('learning_rate', 0.001, 0.9)
        iterations = trial.suggest_int('iterations', 1, 100)
        estimator = CatBoostRegressor(loss_function='RMSE', random_seed=22, learning_rate=learning_rate,
                                      iterations=iterations, l2_leaf_reg=l2_leaf_reg,
                                      border_count=border_count,
                                      depth=depth, verbose=0)
        estimator.fit(X_train, y_train)
        val_pred = estimator.predict(X_test)
        mse = mean_squared_error(y_test, val_pred)
        return mse
    
    
    """ Run optimize. 
    Set n_trials and/or timeout (in sec) for optimization by Optuna
    """
    study = optuna.create_study(sampler=optuna.samplers.TPESampler(), direction='minimize')
    # study = optuna.create_study(sampler=optuna.samplers.RandomSampler(), direction='minimize')
    start_time = time.time()
    study.optimize(objective, n_trials=10)
    end_time = time.time()
    elapsed_mins, elapsed_secs = epoch_time(start_time, end_time)
    print('elapsed_secs:', elapsed_secs)
    print('Best value:', study.best_trial.value)
    
    

    Hyperopt代码如下

    import os
    import time
    
    import pandas as pd
    from catboost import CatBoostRegressor
    from hyperopt import fmin, hp, partial, Trials, tpe,rand
    from sklearn.metrics import r2_score, mean_squared_error
    from sklearn.model_selection import train_test_split
    
    # 自定义hyperopt的参数空间
    space = {"iterations": hp.choice("iterations", range(1, 100)),
             "depth": hp.randint("depth", 16),
             "l2_leaf_reg": hp.randint("l2_leaf_reg", 222),
             "border_count": hp.randint("border_count", 222),
             'learning_rate': hp.uniform('learning_rate', 0.001, 0.9),
             }
    
    os.chdir(r'D:\项目\PSO_CATBOOST\\')
    src = r'D:\项目\PSO_CATBOOST\\'
    file = 'shuju.xlsx'
    data = pd.read_excel(file)
    X_train = data.drop(['label', 'b1', 'b2'], axis=1).values
    y_train = data['label'].values
    X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
    
    
    def epoch_time(start_time, end_time):
        elapsed_secs = end_time - start_time
        elapsed_mins = elapsed_secs / 60
        return elapsed_mins, elapsed_secs
    
    
    # 自动化调参并训练
    def cat_factory(argsDict):
        estimator = CatBoostRegressor(loss_function='RMSE', random_seed=22, learning_rate=argsDict['learning_rate'],
                                      iterations=argsDict['iterations'], l2_leaf_reg=argsDict['l2_leaf_reg'],
                                      border_count=argsDict['border_count'],
                                      depth=argsDict['depth'], verbose=0)
        estimator.fit(X_train, y_train)
        val_pred = estimator.predict(X_test)
        mse = mean_squared_error(y_test, val_pred)
        return mse
    
    
    # 算法选择 tpe
    algo = partial(tpe.suggest)
    # 随机搜索
    # algo = partial(rand.suggest)
    # 初始化每次尝试
    trials = Trials()
    # 开始自动参数寻优
    start_time = time.time()
    best = fmin(cat_factory, space, algo=algo, max_evals=10, trials=trials)
    end_time = time.time()
    elapsed_mins, elapsed_secs = epoch_time(start_time, end_time)
    print('elapsed_secs:', elapsed_secs)
    all = []
    # 遍历每一次的寻参结果
    for one in trials:
        str_re = str(one)
        argsDict = one['misc']['vals']
        value = one['result']['loss']
        learning_rate = argsDict["learning_rate"][0]
        iterations = argsDict["iterations"][0]
        depth = argsDict["depth"][0]
        l2_leaf_reg = argsDict["l2_leaf_reg"][0]
        border_count = argsDict["border_count"][0]
        finish = [value, learning_rate, iterations, depth, l2_leaf_reg, border_count]
        all.append(finish)
    
    parameters = pd.DataFrame(all, columns=['value', 'learning_rate', 'iterations', 'depth', 'l2_leaf_reg', 'border_count'])
    # 从寻参结果中找到r2最大的
    best = parameters.loc[abs(parameters['value']).idxmin()]
    print("best: {}".format(best))
    
    

    如需帮忙请私聊

    5、学习链接

    optuna自动调参框架对lgb的超参进行优化
    NNI使用python文件直接启动参数调优

    展开全文
  • catboost】官方调参教程

    千次阅读 2020-05-20 13:13:37
    CatBoost官方教程:调参 本文翻译至官方原文:https://catboost.ai/docs/concepts/parameter-tuning.html CatBoost为参数调整提供了灵活的界面,可以对其进行配置以适合不同的任务。 本节包含有关可能的参数设置的...

    CatBoost官方教程:调参

    本文翻译至官方原文:https://catboost.ai/docs/concepts/parameter-tuning.html

    CatBoost为参数调整提供了灵活的界面,可以对其进行配置以适合不同的任务。

    本节包含有关可能的参数设置的一些提示。

    catBoost提供了为Python、R语言和命令行都提供了可使用的参数,其中Python和R的完全相同,命令行参数格式则有点不同。

    如L2正则化参数,python和R中为:l2_leaf_reg ,命令行中为–l2-leaf-reg

    One-hot编码

    注意:预处理期间请勿使用One-hot编码!这会影响训练速度和结果质量。

    当分类特征没有很多值时,One-hot编码效果很好。通常One-hot编码不会显着提高模型的质量。但是如果需要,请使用内置参数,而不要预处理数据集。

    Python参数描述默认值
    one_hot_max_size对类别数量小于或等于此参数值的类别特征进行One-hot编码。此类特征不能计算Ctrs。默认值取决于各种条件:
    - 在CPU上用Pairwise scoring模式进行训练时,默认N/A;
    - 在GPU上训练,同时所选的Ctr类型需要目标数据在训练期间不可用时,默认255
    - 在Ranking模式下训练,默认10
    -如果以上条件都不满足,默认2

    树的数量

    建议在调整任何其他参数之前检查是否没有明显的过拟合或欠拟合。为此,有必要分析验证数据集上的指标值并选择适当的迭代次数。

    可以通过将 i t e r a t i o n s iterations iterations 迭代次数设置为较大的值,**使用 $ overfitting detector$ 过拟合检测器参数并启用$ use best model $“ 使用最佳模型”选项来完成。**在这种情况下,结果模型仅包含前k个最佳迭代,其中k是验证数据集上具有最佳损失值的迭代。

    同样,用于选择最佳模型的度量可能不同于用于优化目标值的度量。例如,可以将优化功能设置为 Logloss,并将AUC功能用于过拟合检测器。为此,请使用$ evaluation metric$评估指标参数。

    Python参数描述
    iterations可以建立的最大树数。当使用其他限制迭代次数的参数时,树的最终数量可能少于此参数中指定的数量。
    use_best_model如果设置了此参数,则在结果模型中保存的树数定义如下:
    1.建立训练参数定义的树木数量。
    2.使用验证数据集以 − − e v a l − m e t r i c --eval-metric evalmetric(eval_metric)中指定的指标的最佳值来标识迭代 。
    在此迭代之后,不会保存任何树。此选项需要提供验证数据集。
    eval_metric如果启用,则用于过度拟合检测和最佳模型选择的度量。某些指标支持可选参数(有关每个指标的详细信息,请参见“ 目标和指标”部分)。
    格式:<Metric>[:<parameter 1>=<value>;..;<parameter N>=<value>]
    支持的指标
    例子:
    R2
    Quantile:alpha=0.3

    Overfitting detection settings

    Python参数描述
    od_type要使用的过拟合检测器的类型。可能的值:‘IncToDec’、‘Iter’
    od_pvalIncToDec o v e r f i t t i n g d e t e c t o r overfitting detector overfittingdetector类型的阈值 。达到指定值时,训练将停止。要求输入验证数据集
    为了获得最佳效果,建议在范围img内设置一个值。值越大,越早检测到过度拟合。
    请勿将此参数与Iter过拟合检测器类型一起使用! 也就是(od_type = Iter)
    od_wait在迭代之后以最佳度量值继续训练的迭代次数。此参数的用途因所选的过拟合检测器类型而异:
    1.IncToDec —达到阈值时忽略过拟合检测器,并在迭代后使用最佳度量值继续学习指定的迭代次数。
    2.Iter —考虑模型过度拟合,并且自从具有最佳度量值的迭代以来,在指定的迭代次数后停止训练。

    学习率

    此设置用于减小梯度步长。它影响训练的总时间:值越小,训练所需的迭代次数越多。根据性能期望选择值。

    默认情况下,学习率是根据数据集属性和迭代次数自动定义的。自动定义的值应接近最佳值。

    根据拟合结果来调整学习率的方法:

    • 在训练的最后迭代中没有过度拟合(训练没有收敛)——提高学习率。
    • 检测到过度拟合——降低学习率。
    Python参数描述
    learning_rate学习率。用于减少梯度步长。

    树的深度

    在大多数情况下,最佳深度范围是4到10。建议的值是6到10

    注意:

    当在GPU执行训练,且使用pairwise 模式 (YetiRank, PairLogitPairwise 和 QueryCrossEntropy) 时,树的最大深度限制为 8

    Python参数描述
    depth树的深度。支持值的范围取决于处理单元类型和所选损失函数的类型:
    - CPU —最大16 。
    - GPU — pairwise模式下最大为8,其他损失函数最大16

    L2正则化

    为正则化器尝试其他值以找到最佳可能。

    Python参数描述
    l2_leaf_reg代价函数的L2正则化项的系数。允许任何正值

    Random strength

    尝试为random_strength参数设置不同的值 。

    Python参数描述
    random_strength选择树结构时,用于对分裂打分的随机性强度。使用此参数可以避免模型过度拟合。选择拆分点时使用此参数的值。在每次迭代中,每个可能的拆分点都会得到一个分数(例如,该分数表示添加此拆分将改善训练数据集的损失函数的程度)。选择得分最高的拆分。分数没有随机性。将正态分布的随机变量添加到特征的分数。在训练过程中,它的平均值为零,并且方差不断减小。
    此参数的值就是方差的乘数。
    注意:以下损失函数不支持此参数
    - QueryCrossEntropy
    - YetiRankPairwise
    - PairLogitPairwiae

    Bagging temperature

    尝试为bagging_temperature参数设置不同的值

    Python参数描述
    bagging_temperature如果所选的bootstrap类型为Bayesian,则可以使用此参数。
    定义贝叶斯bootstrap的设置。默认情况下,它用于分类和回归模式。使用贝叶斯bootstrap为对象分配随机权重。
    如果此参数的值设置为“ 1”,则从指数分布中采样权重。
    如果此参数的值设置为“ 0”,则所有权重等于1 。
    可以在范围内[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTSrWtIA-1589951354751)(https://yastatic.net/doccenter/images/tech2.yandex.com/en/catboost/doc/freeze/aLAmutnrGJUj0pCid6PHtDlLvEY.svg)]取值。值越高,Bagging就越积极。

    Border count

    数值特征的分割数。默认值取决于处理单元类型和其他参数:

    • CPU:254
    • GPU在PairLogitPairwise和YetiRankPairwise模式:32
    • 其他模式下的GPU:128

    此参数的值会显着影响GPU上的训练速度,值越小,训练越快。

    128个分割对于许多数据集就足够了。但是,如果需要最佳质量,则在GPU上进行训练时,尝试将此参数的值设置为254。

    此参数的值不会显着影响CPU上的训练速度, 尝试将其设置为254,以获得最佳质量。

    Python参数描述
    border_count
    别名: max_bin
    数值特征的分割数。允许的值是1到65535(含)之间的整数。建议值最大为255。较大的值会减慢训练速度。

    内部数据集顺序

    如果数据集中的对象按要求的顺序给出,请使用此选项。在这种情况下,在将分类特征转换为数字特征选择树结构阶段的过程中,不会执行随机排列 。

    Python参数描述
    has_time使用输入数据中对象的顺序(在将分类特征转换为数字特征和选择树结构阶段期间,请勿执行随机排列)。如果在输入数据中指定了时间戳记列类型,则该列类型用于确定对象的顺序 。

    树生长策略

    默认情况下,CatBoost使用对称树,如果将增长策略设置为SymmetricTree,则将构建对称树。

    此类树将逐级构建,直到达到指定的深度。在每次迭代中,以相同条件分割最后一棵树级别的所有叶子。生成的树结构始终是对称的。

    对称树的预测速度非常好(大约比非对称树快10倍),并且在许多情况下可以提供更好的质量。

    但是,在某些情况下,其他树木生长策略比生长对称树木可获得更好的结果。

    尝试分析使用不同的树木生长策略获得的结果。

    细节:默认情况下使用的对称树可以更快地应用(快10倍)。

    Python参数描述
    grow_policy树生长策略。定义如何执行贪婪树的构建。可能的值:
    - SymmetricTree — 逐级构建树,直到达到指定的深度。在每次迭代中,以相同条件分割最后一棵树级别的所有叶子。生成的树结构始终是对称的。
    - Depthwise - 逐级构建一棵树,直到达到指定的深度。在每次迭代中,将拆分来自最后一棵树的所有非终端叶子。每片叶子均按条件分割,损失改善最佳。
    - Lossguide- 逐叶构建一棵树,直到达到指定的最大叶数。在每次迭代中,将损失损失最佳的非终端叶子进行拆分。
    注意:不能使用PredictionDiff特征重要性来分析使用Depthwise和Lossguide增长策略的生成模型,只能将其导出到json和cbm。
    min_data_in_leaf*
    别名:min_child_samples
    一片叶子中最少的训练样本数。CatBoost不会在样本计数小于指定值的叶子中搜索新的拆分。
    只能与Lossguide和Depthwise增长策略一起使用。
    max_leaves
    别名:num_leaves
    生成的树中的最大叶子数
    只能与 Lossguide增长政策一起使用。
    不建议使用大于64的值,因为它会大大减慢训练过程。

    Golden features

    如果数据集具有golden feature,该特征的预量化可能会减少模型从中获得的信息。建议在此特征中使用更多的borders(1024)。

    注意:不应为所有要素设置更多的borders。建议将其设置为具有一两个golden feature。

    参数描述
    per_float_feature_quantization指定特征或特征列表的量化描述。
    单一功能的描述格式:FeatureId[:border_count=BorderCount][:nan_mode=BorderType][:border_type=border_selection_method]

    Examples:

    per_float_feature_quantization='0:border_count=1024'
    

    In this example, the feature indexed 0 has 1024 borders.

    per_float_feature_quantization=['0:border_count=1024', '1:border_count=1024']
    

    In this example, features indexed 0 and 1 have 1024 borders.

    超参数搜索方法

    在给定数据集上训练模型,Python包提供网格和随机搜索方法与来寻找最优参数值。

    方法描述
    CatBoostgrid_search通过简单的网格搜索模型的指定参数值。
    randomized_search对超参数的简单随机搜索。
    CatBoostClassifiergrid_search通过简单的网格搜索模型的指定参数值。
    randomized_search对超参数的简单随机搜索。
    CatBoostRegressorgrid_search通过简单的网格搜索模型的指定参数值。
    randomized_search对超参数的简单随机搜索。
    展开全文
  • CatBoost is a machine learning method based on gradient boosting over decision trees. Main advantages of CatBoost: Superior quality when compared with other GBDT libraries. Best in class inference ...
  • 机器学习Author:louwillMachine Learning Lab 虽然现在深度学习大行其道,但以XGBoost、LightGBM和CatBoost为代表的Boostin...

    机器学习

    Author:louwill

    Machine Learning Lab

         

    虽然现在深度学习大行其道,但以XGBoost、LightGBM和CatBoost为代表的Boosting算法仍有其广阔的用武之地。抛开深度学习适用的图像、文本、语音和视频等非结构化的数据应用,Boosting算法对于训练样本较少的结构化数据领域仍然是第一选择。本文先对前述章节的三大Boosting的联系与区别进行简单阐述,并一个实际数据案例来对三大算法进行对比。然后对常用的Boosting算法超参数调优方法进行介绍,包括随机调参法、网格搜索法和贝叶斯调参法,并给出相应的代码示例。

    三大Boosting算法对比

    首先,XGBoost、LightGBM和CatBoost都是目前经典的SOTA(state of the art)Boosting算法,都可以归类到梯度提升决策树算法系列。三个模型都是以决策树为支撑的集成学习框架,其中XGBoost是对原始版本的GBDT算法的改进,而LightGBM和CatBoost则是在XGBoost基础上做了进一步的优化,在精度和速度上都有各自的优点。

    三大模型的原理细节我们本文不做叙述,可参考【原创首发】机器学习公式推导与代码实现30讲.pdf。那么这三大Boosting算法又有哪些大的方面的区别呢?主要有两个方面。第一个是三个模型树的构造方式有所不同,XGBoost使用按层生长(level-wise)的决策树构建策略,LightGBM则是使用按叶子生长(leaf-wise)的构建策略,而CatBoost使用了对称树结构,其决策树都是完全二叉树。第二个有较大区别的方面是对于类别特征的处理。XGBoost本身不具备自动处理类别特征的能力,对于数据中的类别特征,需要我们手动处理变换成数值后才能输入到模型中;LightGBM中则需要指定类别特征名称,算法即可对其自动进行处理;CatBoost以处理类别特征而闻名,通过目标变量统计等特征编码方式也能实现类别特征的高效处理。

    下面我们以kaggle 2015年航班延误数据集为示例,分别用XGBoost、LightGBM和CatBoost模型进行实验。图1是flights数据集简介。

    图2 flights数据集

    该数据集完整数据量有500多万条航班记录数据,特征有31个,仅作演示用的情况下,我们采用抽样的方式从原始数据集中抽样1%的数据,并筛选11个特征,经过预处理后重新构建训练数据集,目标是构建对航班是否延误的二分类模型。数据读取和简单预处理过程如代码1所示。

    代码1 数据处理

    # 导入pandas和sklearn数据划分模块
    import pandas as pd
    from sklearn.model_selection import train_test_split
    # 读取flights数据集
    flights = pd.read_csv('flights.csv')
    # 数据集抽样1%
    flights = flights.sample(frac=0.01, random_state=10)
    # 特征抽样,获取指定的11个特征
    flights = flights[["MONTH", "DAY", "DAY_OF_WEEK", "AIRLINE",
    "FLIGHT_NUMBER","DESTINATION_AIRPORT", "ORIGIN_AIRPORT","AIR_TIME",
    "DEPARTURE_TIME", "DISTANCE", "ARRIVAL_DELAY"]]
    # 对标签进行离散化,延误10分钟以上才算延误
    flights["ARRIVAL_DELAY"] = (flights["ARRIVAL_DELAY"]>10)*1
    # 类别特征
    cat_cols = ["AIRLINE", "FLIGHT_NUMBER", "DESTINATION_AIRPORT",
    "ORIGIN_AIRPORT"]
    # 类别特征编码
    for item in cat_cols:
          flights[item] = flights[item].astype("category").cat.codes +1
      # 数据集划分
    X_train, X_test, y_train, y_test = train_test_split(
          flights.drop(["ARRIVAL_DELAY"], axis=1),
          flights["ARRIVAL_DELAY"], 
          random_state=10, test_size=0.3)
    # 打印划分后的数据集大小
    print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)
    

    输出:

    (39956, 10) (39956,) (17125, 10) (17125,)
    

    在代码1中,我们先读取了flights原始数据集,因为原始数据集量太大,我们对其进行抽样1%,并筛选了11个特征,构建有57081条1、11个特征的航班记录数据集。然后对抽样数据集进行简单的预处理,先对训练标签进行二值离散化,延误大于10分钟的转化为1(延误),延误小于10分钟的转化为0(不延误),然后对“航线”、“航班号”、“目的地机场”、“出发地机场”等类别特征进行类别编码处理。最后划分数据集,得到有39956条训练样本,17125条测试样本。

    XGBoost

    下面我们开始来测试三个模型在该数据集上的效果。先来看XGBoost,如代码2所示。

    代码2 XGBoost

    # 导入xgboost模块
    import xgboost as xgb
    # 导入模型评估auc函数
    from sklearn.metrics import roc_auc_score
    # 设置模型超参数
    params = {
        'booster': 'gbtree',
        'objective': 'binary:logistic',   
        'gamma': 0.1,
        'max_depth': 8,
        'lambda': 2,
        'subsample': 0.7,
        'colsample_bytree': 0.7,
        'min_child_weight': 3,
        'eta': 0.001,
        'seed': 1000,
        'nthread': 4,
    }
    # 封装xgboost数据集
    dtrain = xgb.DMatrix(X_train, y_train)
    # 训练轮数,即树的棵数
    num_rounds = 500
    # 模型训练
    model_xgb = xgb.train(params, dtrain, num_rounds)
    # 对测试集进行预测
    dtest = xgb.DMatrix(X_test)
    y_pred = model_xgb.predict(dtest)
    print('AUC of testset based on XGBoost: ', roc_auc_score(y_test, y_pred))
    

    输出:

    AUC of testset based on XGBoost: 0.6845368959487046
    

    在代码15-2中,我们测试了XGBoost在flights数据集上的表现,导入相关模块并设置模型超参数,便可基于训练集进行XGBoost模型拟合,最后将训练好的模型用于测试集预测,可得到测试集AUC为0.6845。

    LightGBM

    LightGBM在flights数据集上的测试过程如代码3所示。

    代码3 LightGBM

    # 导入lightgbm模块
    import lightgbm as lgb
    dtrain = lgb.Dataset(X_train, label=y_train)
    params = {
    "max_depth": 5, 
    "learning_rate" : 0.05, 
    "num_leaves": 500,  
    "n_estimators": 300
    }
    
    
    # 指定类别特征
    cate_features_name = ["MONTH","DAY","DAY_OF_WEEK","AIRLINE",
    "DESTINATION_AIRPORT", "ORIGIN_AIRPORT"]
      # lightgbm模型拟合
    model_lgb = lgb.train(params, d_train, 
    categorical_feature = cate_features_name)
      # 对测试集进行预测
    y_pred = model_lgb.predict(X_test)
    print('AUC of testset based on XGBoost: 'roc_auc_score(y_test, y_pred))
    

    输出:

    AUC of testset based on XGBoost: 0.6873707383550387
    

    在代码3中,我们测试了LightGBM在flights数据集上的表现,导入相关模块并设置模型超参数,便可基于训练集进行LightGBM模型拟合,最后将训练好的模型用于测试集预测,可得到测试集AUC为0.6873,跟XGBoost效果差不多。

    CatBoost

    CatBoost在flights数据集上的测试过程如代码4所示。

    代码4 CatBoost

    # 导入lightgbm模块
    import catboost as cb
    # 类别特征索引
    cat_features_index = [0,1,2,3,4,5,6]
    # 创建catboost模型实例
    model_cb = cb.CatBoostClassifier(eval_metric="AUC",
      one_hot_max_size=50, depth=6, iterations=300, l2_leaf_reg=1,
      learning_rate=0.1)
    # catboost模型拟合
    model_cb.fit(X_train, y_train, cat_features=cat_features_index)
    # 对测试集进行预测
    y_pred = model_cb.predict(X_test)
    print('AUC of testset based on CatBoost: 'roc_auc_score(y_test, y_pred))
    

    输出:

    AUC of testset based on CatBoost: 0.5463773041667715
    

    在代码4中,我们测试了CatBoost在flights数据集上的表现,导入相关模块并设置模型超参数,便可基于训练集进行CatBoost模型拟合,最后将训练好的模型用于测试集预测,可得到测试集AUC为0.54,相较于XGBoost和LightGBM,CatBoost在该数据集上的效果要差不少。表1是针对flights数据集三大模型的综合对比结果。

    从表1的综合对比结果来看,LightGBM无论是在精度上还是速度上,都要优于XGBoost和CatBoost。当然了,我们只是在数据集上直接用三个模型做了比较,没有做进一步的数据特征工程和超参数调优,表1的结果均可做进一步的优化。

    常用的超参数调优方法

    机器学习模型中有大量需要事先进行人为设定的参数,比如说神经网络训练的batch-size,XGBoost等集成学习模型的树相关参数,我们将这类不是经过模型训练得到的参数叫做超参数(hyperparameter)。人为的对超参数调整的过程也就是我们熟知的调参。机器学习中常用的调参方法包括网格搜索法(grid search)、随机搜索法(random search)和贝叶斯优化(bayesian optimization)。

    网格搜索法

    网格搜索是一项常用的超参数调优方法,常用于优化三个或者更少数量的超参数,本质是一种穷举法。对于每个超参数,使用者选择一个较小的有限集去探索。然后,这些超参数笛卡尔乘积得到若干组超参数。网格搜索使用每组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。

    例如,我们有三个需要优化的超参数a,b,c,候选的取值分别是{1,2},{3,4},{5,6}。则所有可能的参数取值组合组成了一个8个点的3维空间网格如下:{(1,3,5),(1,3,6),(1,4,5),(1,4,6),(2,3,5),(2,3,6),(2,4,5),(2,4,6)},网格搜索就是通过遍历这8个可能的参数取值组合,进行训练和验证,最终得到最优超参数。

    Sklearn中通过model_selection模块下的GridSearchCV来实现网格搜索调参,并且这个调参过程是加了交叉验证的。我们同样以前述flights数据集为例,展示XGBoost的网格搜索代码示例。

    代码5 网格搜索

    ### 基于XGBoost的GridSearch搜索范例
    # 导入GridSearch模块
    from sklearn.model_selection import GridSearchCV
    # 创建xgb分类模型实例
    model = xgb.XGBClassifier()
    # 待搜索的参数列表空间
    param_lst = {"max_depth": [3,5,7],
                  "min_child_weight" : [1,3,6],
                  "n_estimators": [100,200,300],
                  "learning_rate": [0.01, 0.05, 0.1]
                 }
    # 创建网格搜索
    grid_search = GridSearchCV(model, param_grid=param_lst, cv=3, 
                                       verbose=10, n_jobs=-1)
    # 基于flights数据集执行搜索
    grid_search.fit(X_train, y_train)
    # 输出搜索结果
    print(grid_search.best_estimator_)
    

    输出:

    XGBClassifier(max_depth=5, min_child_weight=6, n_estimators=300)
    

    代码5给出了基于XGBoost的网格搜索范例。我们先创建XGBoost分类模型实例,然后给出需要搜索的参数和对应的参数范围列表,并基于GridSearch创建网格搜索对象,最后拟合训练数据,输出网格搜索的参数结果。可以看到,当树最大深度为5、最小子树权重取6以及树的棵数为300时,模型能达到相对最优的效果。

    随机搜索

    随机搜索,顾名思义,即在指定的超参数范围或者分布上随机搜索和寻找最优超参数。相较于网格搜索方法,给定超参数分布内并不是所有的超参数都会进行尝试,而是会从给定分布中抽样一个固定数量的参数,实际仅对这些抽样到的超参数进行实验。相较于网格搜索,随机搜索有时候会是一种更高效的调参方法。Sklearn中通过model_selection模块下RandomizedSearchCV方法进行随机搜索。基于XGBoost的随机搜索调参示例如代码6所示。

    代码6 随机搜索

    ### 基于XGBoost的GridSearch搜索范例
    # 导入GridSearch模块
    from sklearn.model_selection import GridSearchCV
    # 创建xgb分类模型实例
    model = xgb.XGBClassifier()
    # 待搜索的参数列表空间
    param_lst = {"max_depth": [3,5,7],
                  "min_child_weight" : [1,3,6],
                  "n_estimators": [100,200,300],
                  "learning_rate": [0.01, 0.05, 0.1]
                 }
    # 创建网格搜索
    grid_search = GridSearchCV(model, param_grid=param_lst, cv=3, 
                                       verbose=10, n_jobs=-1)
    # 基于flights数据集执行搜索
    grid_search.fit(X_train, y_train)
    # 输出搜索结果
    print(grid_search.best_estimator_)
    

    输出:

    XGBClassifier(max_depth=5, min_child_weight=6, n_estimators=300)
    

    代码6给出了随机搜索的使用示例,模式上跟网格搜索基本一致,可以看到,随机搜索的结果认为树的棵树取300,最小子树权重为6,最大深度为5,学习率取0.1的时候模型达到最优。

     

    贝叶斯调参

    除了上述两种调参方法外,本小节介绍第三种,也有可能是最好的一种调参方法,即贝叶斯优化。贝叶斯优化是一种基于高斯过程(gaussian process)和贝叶斯定理的参数优化方法,近年来被广泛用于机器学习模型的超参数调优。这里不详细探讨高斯过程和贝叶斯优化的数学原理,仅展示贝叶斯优化的基本用法和调参示例。

    贝叶斯优化其实跟其他优化方法一样,都是为了为了求目标函数取最大值时的参数值。作为一个序列优化问题,贝叶斯优化需要在每一次迭代时选取一个最佳观测值,这是贝叶斯优化的关键问题。而这个关键问题正好被上述的高斯过程完美解决。关于贝叶斯优化的大量数学原理,包括高斯过程、采集函数、Upper Confidence Bound(UCB)和Expectation Improvements(EI)等概念原理,本节限于篇幅不做展开描述。贝叶斯优化可直接借用现成的第三方库BayesianOptimization来实现。使用示例如代码7所示。

    代码7 贝叶斯优化

    ### 基于XGBoost的BayesianOptimization搜索范例
    # 导入xgb模块
    import xgboost as xgb
    # 导入贝叶斯优化模块
    from bayes_opt import BayesianOptimization
    # 定义目标优化函数
    def xgb_evaluate(min_child_weight,
                     colsample_bytree,
                     max_depth,
                     subsample,
                     gamma,
                     alpha):
        # 指定要优化的超参数
        params['min_child_weight'] = int(min_child_weight)
        params['cosample_bytree'] = max(min(colsample_bytree, 1), 0)
        params['max_depth'] = int(max_depth)
        params['subsample'] = max(min(subsample, 1), 0)
        params['gamma'] = max(gamma, 0)
        params['alpha'] = max(alpha, 0)
        # 定义xgb交叉验证结果
        cv_result = xgb.cv(params, dtrain, num_boost_round=num_rounds, nfold=5,
                       seed=random_state,
                       callbacks=[xgb.callback.early_stop(50)])
        return cv_result['test-auc-mean'].values[-1]
    
    
    # 定义相关参数
    num_rounds = 3000
    random_state = 2021
    num_iter = 25
    init_points = 5
    params = {
        'eta': 0.1,
        'silent': 1,
        'eval_metric': 'auc',
        'verbose_eval': True,
        'seed': random_state
    }
    # 创建贝叶斯优化实例
    # 并设定参数搜索范围
    xgbBO = BayesianOptimization(xgb_evaluate, 
                                 {'min_child_weight': (1, 20),
                                   'colsample_bytree': (0.1, 1),
                                   'max_depth': (5, 15),
                                   'subsample': (0.5, 1),
                                   'gamma': (0, 10),
                                   'alpha': (0, 10),
                                    })
    # 执行调优过程
    xgbBO.maximize(init_points=init_points, n_iter=num_iter)
    

    代码7给出了基于XGBoost的贝叶斯优化示例,在执行贝叶斯优化前,我们需要基于XGBoost的交叉验证xgb.cv定义一个待优化的目标函数,获取xgb.cv交叉验证结果,并以测试集AUC为优化时的精度衡量指标。最后将定义好的目标优化函数和超参数搜索范围传入贝叶斯优化函数BayesianOptimization中,给定初始化点和迭代次数,即可执行贝叶斯优化。

    图2 贝叶斯优化结果

    部分优化过程如图2所示,可以看到,贝叶斯优化在第23次迭代时达到最优,当alpha参数取4.099、列抽样比例为0.1、gamma参数为0、树最大深度为5、最小子树权重取5.377以及子抽样比例为1.0时,测试集AUC达到最优的0.72。

    总结

    本章是在前述几章集成学习内容基础上的一个简单综合对比,并给出了集成学习常用的超参数调优方法和示例。我们针对常用的三大Boosting集成学习模型:XGBoost、LightGBM和CatBoost,以具体的数据实例做了一个精度和速度上的性能对比,但限于具体的数据集和调优差异,对比结果仅作为演示说明使用,并不能真正代表LightGBM模型一定就要优于CatBoost模型。

    三大常用的超参数调优方法:网格搜索法、随机搜索法和贝叶斯优化法。本章也基于同样的数据集给出了三大超参数调优方法的使用示例,但限于篇幅,并没有太多深入每个方法的数学原理阐述。

     

    展开全文
  • Catboost参数

    2021-08-05 11:55:08
    CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,这一点从它的名字中可以看出来,CatBoost是由...
  • catboost参数详解及实战(强推)

    千次阅读 2022-07-02 11:21:13
    catboost参数详解(史上最细),以及实战贝叶斯调参
  • 最详细的Catboost参数详解与实例应用

    万次阅读 多人点赞 2020-12-16 12:39:22
    文章目录1.CatBoost简介1.1CatBoost介绍1.2CatBoost优缺点1.3CatBoost安装2.参数详解2.1通用参数:2.2默认参数2.3性能参数2.4参数调优3.CatBoost实战应用3.1回归案例3.2使用Pool加载数据集并进行预测3.3多分类案例..
  • catboost算法及参数说明

    千次阅读 2022-03-09 17:39:38
    catboost回归 catboost有一下三个的优点: 它自动采用特殊的方式处理类别型特征(categorical features)。首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成...
  •  在对 CatBoost 调参时,很难对分类特征赋予指标。因此,同时给出了不传递分类特征时的调参结果,并评估了两个模型:一个包含分类特征,另一个不包含。我单独调整了独热最大量,因为它并不会影响其他参数。  如果...
  • CatBoost算法和调参

    万次阅读 2018-07-01 13:28:00
     虽然目前有大量的库可以利用梯度提升或其他解决方案来训练机器学习系统,但Bilenko认为,CatBoost相较其他大型公司使用的框架(如Yandex)的最大优点是测试精准度高。    “有很多机器学习库的代码质量比较...
  • CatBoost的Python与R实现

    千次阅读 2019-07-23 11:45:00
    2.使用hyperopt调参: ```python import hyperopt from numpy.random import RandomState # 目的是最小化目标函数 def hyperopt_objective(params): model = CatBoostClassifier( l2_leaf_reg=int...
  • CatBoost参数解释

    万次阅读 2017-10-13 11:38:22
    CatBoost参数简单中文解释。
  • 机器学习Author:louwillMachine Learning Lab 虽然现在深度学习大行其道,但以XGBoost、LightGBM和CatBoost为代表的Boostin...
  • catboost介绍

    千次阅读 2021-09-05 15:50:30
    一、Catboost简介 全称:Gradient Boosting(梯度提升) + Categorical Features(类别型特征) 作者:俄罗斯的搜索巨头Yandex 官方地址 论文链接 | 项目地址  文档地址 视频 二、Catboost的特点  一般来说,...
  • CatBoost简介CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种。CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。XGBoost被广泛的...
  • 深入理解CatBoost

    千次阅读 多人点赞 2020-02-11 15:18:09
    CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,这一点从它的名字中可以看出来,CatBoost是由...
  • catboost机器学习

    2020-12-03 14:42:16
    1 CatBoost简介 参考论文 Anna Veronika Dorogush, Andrey Gulin, Gleb Gusev, Nikita Kazeev, Liudmila Ostroumova Prokhorenkova, Aleksandr Vorobev "Fighting biases with dynamic boosting". arXiv:1706.09516...
  • 一文理解CatBoost

    2020-04-05 11:24:43
    1. CatBoost简介CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种。CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。XGBoost被广泛...
  • ML之catboostcatboost的CatBoostRegressor函数源代码简介、解读之详细攻略 目录 catboost的CatBoostRegressor函数源代码简介、解读 catboost的CatBoostRegressor函数源代码简介、解读 class ...
  • CatBoost讲解

    2022-03-16 17:06:17
    CatBoost三个特点 (1)“减少过度拟合”:这可以帮助你在训练计划中取得更好的成果。它基于一种构建模型的专有算法,这种算法与标准的梯度提升方案不同。 (2)“类别特征支持”:这将改善你的训练结果,同时允许你...
  • 【python 机器学习】机器学习算法之CatBoost

    千次阅读 多人点赞 2020-01-08 14:19:49
    主要内容: ...六、CatBoost调参模块 七、CatBoost 参数详解 一、算法背景: 2017年俄罗斯的搜索巨头 Yandex 开源 Catboost 框架。Catboost(Categorical Features+Gradient Boosting)采用的策略...
  • 30分钟学会CatBoost

    千次阅读 2022-01-24 01:17:22
    一,CatBoost简介 CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。正如其名字所说那样,CatBoost主要是...
  • catboost原理

    千次阅读 多人点赞 2020-02-20 21:32:24
    文章目录概述原理类别型特征类别型特征的相关工作目标变量统计(Target Statistics)CatBoost处理Categorical features总结梯度偏差/预测偏移为什么会有梯度偏差?梯度偏差造成了什么问题?如何解决梯度偏差/预测...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 800
精华内容 320
关键字:

Catboost调参