精华内容
下载资源
问答
  • dlib 是一个开源的 C++ 机器学习算法工具包,被广泛...在最近一次更新(v19.8)中,其开发者引入了自动调优超参数的 LIPO 算法。据开发者称,这种方法超越了此前调整参数使用的各类方法。 Dlib:全局优化算法
        

    dlib 是一个开源的 C++ 机器学习算法工具包,被广泛用于工业界和学术界,覆盖机器人、嵌入式设备、手机和大型高性能计算设备等环境。在最近一次更新(v19.8)中,其开发者引入了自动调优超参数的 LIPO 算法。据开发者称,这种方法超越了此前调整参数使用的各类方法。


    Dlib:全局优化算法


    所有机器学习开发者都会遇到同样一个问题:你有一些想要使用的机器学习算法,但其中填满了超参数——这些数字包括权重衰减率、高斯核函数宽度等等。算法本身并不会设置它们,你必须自己决定它们的数值。如果你调的参数不够「好」,那么算法是不会工作的。那么该如何是好?下面的列表是所有人都会做的事,按使用频率从高到低排列:


    • 依靠经验:聆听自己的直觉,设置感觉上应该对的参数然后看看它是否工作,不断尝试直到累趴。
    • 网格搜索:让计算机尝试一些在一定范围内均匀分布的数值。
    • 随机搜索:让计算机尝试一些随机值,看看它们是否好用。
    • 贝叶斯优化:使用类似 MATLAB bayesopt 的工具自动选取最佳参数——结果发现贝叶斯优化的超参数比你自己的机器学习算法还要多,累觉不爱,回到依靠经验和网格搜索方法上去


    从一个好的初始猜测开始局部优化:这是 MITIE 的思路,它使用 BOBYQA 算法和一些较好的初始点开始工作。因为 BOBYQA 只能找到最近的局部最优解,所以该方法的效果严重依赖一个好的起始点。在 MITIE 方法上我们知道好的开始是成功的大部分,但问题在于我们经常难以找到一个好的起始点。另一方面,这种类型的方法非常适用于寻找局部最优解。稍后我们会再谈到这个问题。


    在调参时,绝大多数人只会凭经验进行猜测。这不是个好现象,我们需要更合理的方法。所有人都希望一些黑箱优化策略如贝叶斯优化变得实用化,但在我看来,如果你不把贝叶斯优化的超参数调对,它就无法展现专家级的调参能力。事实上,我认识的每个使用贝叶斯优化的人都有着相同的经验。最终,如果我认为手调参数更加方便,我就会转回到传统方法上去,这也是所有使用类似工具的人都会遇到的事。所以结果就是我们一般不会使用自动超参数选择工具——令人沮丧的结论。我们都希望出现一个无参数的全局优化器,其中的超参数选择是我们可以信任的。


    所以在我看到 Cédric Malherbe 和 Nicolas Vayatis 在今年 ICML 大会上的论文《Global optimization of Lipschitz functions》时,我感到非常兴奋。在这篇论文中,研究人员提出了一个非常简单的无参数且可证明正确的方法来寻找令函数 f(x) 最大化的 x∈R^d,即使 f(x) 存在很多局部极大值。论文的核心思想在于保持 f(x) 的分段线性上界,随后使用它在每一步优化中决定 x 的估计值。所以如果你已经估计出了 x_1,x_2,……,x_t,你可以轻松地这样定义 f(x) 的分段上界:


    其中 k 是 f(x) 的 Lipschitz 常数。因此,根据 Lipschitz 常数的定义,显然对于所有 x 有 U(x)≥f(x)。论文作者随后提出了一个名为 LIPO 的简单算法,它可以随机选点,检查新点的上界是否比已有的最优点更好,如果是的话将更新改点为新的最优值。例如,下图展示了一个简单的红色 f(x),其上界 U(x) 为绿色。在这个例子中 U(x) 有四个点,由黑色方块表示。


    0


    我们不需要想象上界是如何帮助我们评估最优点的。例如,如果你选择最大上界作为下一次迭代,你就已经非常接近全局极大值了。论文作者随后继续证明了这种方法的一些不错的属性。值得一提的是,他们是用数学方法证明的,同时也实践展示了这种方法在很多非常规情形下要比随机搜索要好——考虑到随机超参数搜索(Random Search for Hyper-Parameter Optimization,James Bergstra & Yoshua Bengio)的效果非常强大,这是一个强有力的声明。在论文中,研究人员也对贝叶斯优化等算法进行了比较,并展示了 LIPO 的竞争力。


    此时此刻你或许会说:「等一下,我们并不知道 Lipschitz 常数 k 的值!」这不是一个大问题,因为它非常容易估计,例如,可以将 k 设置为每次迭代前观察到的 f(x) 的最大斜率。这相当于解决如下问题:


    • Malherbe 等人测试了这种估算 k 的方法,并展示了它的优秀性能。
    • 他们提出的 LIPO 全局优化方法既没有参数,也被证明优于随机搜索,而且非常简单。阅读这篇论文会给你一种「Duang」的感觉,让你后悔为何自己没有早一点想到这种方法——这就是一篇好论文的标志。所以我显然希望在 dlib 中加入某种形式的 LIPO 算法,并实现到了最新的 dlib v19.8 版本中。


    不过,如果想要在实践中用到 LIPO,你还需要解决一些问题。本文的下半部分将讨论这些问题并解释 dlib 是如何实现并解决它们的。首先,如果 f(x) 是嘈杂或不连续的(甚至只有一点点),k 就会变成无限大,这种情况在现实世界中经常出现。例如,在评估二元分类器中的 0-1 损失函数时,任何样本在预测不同的类别都会有一点点不连续性。你或许会无视它继续运行 LIPO,但有很大风险会遇到两个 x 样本横跨不连续点,并导致 k 值爆炸。第二,并不是所有的超参数都同等重要,一些几乎没有意义,而另一些则对于 f(x) 的输出影响很大。所以每个超参数都有特定的 k 值就更好了。你可以通过这样定义上界 U(x) 来解决这些问题:


    0


    现在,每个 f(x) 都有自己的噪声项σ_i,它在大部分时间里应该是 0,除非 x_i 真的接近于不连续或存在一些随机性。在这里,K 是一个对角矩阵,包含「每个超参数的 Lipschitz k 项」。通过这个公式,可将每个σ设为 0,K = (k^2)I 会给出与 Malherbe 等人所提出的相同的 U(x),如果我们让它们采用更加一般的值,则我们可以解决上面提到的问题。


    和之前一样,我们可以通过求解一个最优化问题来寻找 U(x) 的参数:


    0


    σ^2 上的 10^6 罚项系数将导致大部分σ为零。整个算法对此处使用的特定罚项值并不敏感,只要罚项值足够大,σ 大部分情况下都会是 0,且 k 不会出现无穷大的情况,这正是我们希望看到的。我们还可以将其重写为大型二次规划问题,使用对偶坐标下降方法(dual coordinate descent method)解决。此处不详述过程,感兴趣的同学可以查看 dlib 代码。重点就是使用这个众所周知的方法可以很容易地解决问题,且解决了 k 的无穷大问题。


    最后需要解决的问题是 LIPO 在局部极大值点区域中糟糕的收敛情况。尽管 LIPO 确实能够轻松到达 f(x) 最高峰,但到达之后它无法快速移动至最优位置(即峰值)。这是很多无导数优化算法的通病,包括 MATLAB 的贝叶斯优化工具。所幸,不是所有的方法都有这种局限性。Michael J. D. Powell 写了大量论文论述如何将经典的置信域方法应用到无导数优化算法中。这些方法拟合当前最优解的二次曲面,然后下一次迭代至与当前最优解有一定距离的二次曲面极大值点。因此,我们「相信」该局部二次模型在最优点的邻域内是准确的,所以该区域也叫「置信域」。上文提到的 BOBYQA 方法是这些方法其中之一,它可以很好地收敛至最近邻的局部最优解,在几步内轻松找到达到全浮点精度的局部最优解。


    我们可以结合这两种方法来解决 LIPO 的收敛问题,LIPO 将探索 f(x),快速找到最高峰上的点。然后 Powell 的置信域方法可以有效找到该峰的最大值点。结合二者最简单的方式是交替使用,这就是 dlib 所做的。在偶数迭代时,我们根据上界选取下一个 x;在奇数迭代时,我们根据置信域模型选取下一个 x。我还使用了与 LIPO 稍微不同的版本,我称之为 MaxLIPO。Malherbe et al. 建议选取任意上界大于当前最优目标值的点。但是,我发现在每次迭代时选取最大上界点稍好一些。该交替版本 MaxLIPO 就是 dlib 使用的版本。下图展示了这种 MaxLIPO 和置信域方法的混合方法的运行:

    0


    上图中红线是待优化函数,我们试图寻找最大值点。我们注意到每一次算法从函数中采样一个点时都会出现一个小框。求解器的状态由全局上界 U(x) 和置信域方法使用的局部二次模型决定。因此,我们绘制出上界模型和当前的局部二次模型,这样你就可以看到它们随着优化过程所发生的进化。我们还用一条纵线表示目前见到的最佳点的位置。


    你可以看到优化器根据二次模型在选取最大上界点和最大值点之间交替运行。随着优化的进展,上界逐渐变得更加准确,帮助我们找到最佳点,而二次模型不论处于什么位置都可以快速找到高精度极大值点。如视频结尾所示,二者使得优化器找到真正的全局高精度最大值点(在本示例中精度在±10^−9 范围内)。


    0


    现在我们来做一个实验,看看在默认设置下,MaxLIPO 和置信域方法(TR)相结合的混合方法与 MATLAB 的贝叶斯优化工具的对比结果。我在 Holder table 测试函数上将两个算法运行 100 次,并使用标准偏差误差带绘制平均误差。因此下图展示了 f(x*)−f(x_i),即真正的全局最优值和当前最优解的差。你可以看到 MATLAB 的贝叶斯优化在准确率±10^−3 时出现停滞,而我们的混合方法(MaxLIPO+TR)快速到达全浮点精度±10^−17。


    0


    我还对 LIPO 论文图 5 中的一些测试进行了重新测试,结果显示在下表中。在这些实验中,我比较了有或没有置信域求解器(LIPO+TR 和 LIPO)的 LIPO 性能。此外,为了验证 LIPO 优于纯随机搜索方法,我测试了在纯随机搜索方法和置信域求解器(PRS+TR)之间交替选择,而不是在 LIPO 方法与置信域求解器(LIPO+TR and MaxLIPO+TR)之间交替选择。我们将纯随机搜索(PRS)也包括在内以供参考。我在每次测试中运行 1000 次算法,并记录达到特定求解准确度的 f(x),及其调用次数的均值与标准差。例如,ϵ=0.01 意味着 f(x*)−f(x_i)≤0.01,而「target 99%」使用 Malherbe 论文中的「target」,对于大多数测试来说这对应于 ϵ>0.1。若测试的执行花费了太多时间,那么我将使用符号「-」。


    这些结果的关键点是增加一个置信域以允许 LIPO 达到更高的求解准确率。因为 LIPO 通过使用 U(x) 的随机搜索,这会令算法运行得更快。因此,LIPO 对 U(x) 的调用数量至少与 PRS 在搜索 f(x) 时所需的一样多。此外,对于较小的 ϵ,执行 LIPO 将变得十分昂贵。例如,由于 LIPO 的执行时间太长,所以在任何测试问题上我们对 LIPO 的测试结果并不能达到 0.1 以上的准确度。但是,如果我们采用置信域的方法,那么组合的算法可以轻松实现高精度解。另一个重要的细节是,对于具有许多局部最优解的测试,结合 LIPO 与 TR 的所有方法都比 PRS+TR 的方法好。这在 ComplexHolder 上尤其突出,ComplexHolder 是 HolderTable 测试函数的一个版本,它具有额外的高频率正弦噪声,因此能显著增加局部最优解的数量。在 ComplexHolder 中,基于 LIPO 的方法要求 f(x) 的调用比 PRS + TR 少一个数量级,进一步证明了 Malherbe 等人的结论,即 LIPO 相对于纯随机搜索更有优势。


    0


    dlib 中的新方法 MaxLIPO+TR 在我所有的测试中是最好的,这种方法最引人注目的地方就是它的简单性。特别是 MaxLIPO+TR 不存在任何超参数,因此它非常易于使用。我已经使用 dlib 工具一段时间了,现在使用它进行超参数优化效果也非常好。这是第一个我非常有信心的黑箱超参数优化算法,它真的可用来解决实际问题。


    最后,下面是一个简单的案例,展示如何在 Python 中使用这个新的优化器。


            def holder_table(x0,x1):
        return -abs(sin(x0)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))
    
    x,y = dlib.find_min_global(holder_table, 
                               [-10,-10],  # Lower bound constraints on x0 and x1 respectively
                               [10,10],    # Upper bound constraints on x0 and x1 respectively
                               80)         # The number of times find_min_global() will call holder_table()
    
    Or in C++11:
    auto holder_table = [](double x0, double x1) {return -abs(sin(x0)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)));};
    
    // obtain result.x and result.y
    auto result = find_min_global(holder_table, 
                                 {-10,-10}, // lower bounds
                                 {10,10}, // upper bounds
                                 max_function_calls(80));
    
          


    这些方法都可以在约 0.1 秒内找到 holder_table 的全局最优解,且精度能达到 12 digits。C++ API 已经公开了多种调用求解器的方法,包括一次优化多个函数和添加整型约束。若读者希望了解更多的细节,请查看该工具的文档。



    展开全文
  • 机器学习算法之XGBoost及其自动调参(算法+数据+代码)本文将利用一个excel数据对常见机器学习算法(XGBoost、Random Forest随机森林、ET极度随机树、Naïve Bayes高斯朴素贝叶斯、KNN K近邻、Logistic Regression逻辑...

    机器学习算法之XGBoost及其自动调参

    (算法+数据+代码)

    本文将利用一个excel数据对常见机器学习算法(XGBoost、Random Forest随机森林、ET极度随机树、Naïve Bayes高斯朴素贝叶斯、KNN K近邻、Logistic Regression逻辑回归、Decision Tree 决策树)的使用过程进行简单的介绍,并对XGBoost算法的自动调参方法进行详解,机器学习算法的详细讲解在机器学习专辑里都有介绍。

    机器学习专辑

    代码链接:https://github.com/Minerva-J/MachineLearning

    一、 算法介绍
    在之前的文章中我们介绍过机器学习中的集成学习算法Bagging方法和Boosting方法,通过将多个弱学习器集成起来形成一个强学习器。XGBoost(eXtreme Gradient Boosting)是Boosting算法中的一种,是一种提升树模型,将很多树的模型集成起来。其以正则化提升(Regularized Boosting)技术而闻名,通过代价函数里加入正则项,控制模型的复杂度,防止过拟合。可以实现并行处理,相比GBM有了很大的速度提升。

    二、 模型详解
    XGBoost在Linux的Python环境下可以直接用pip install xgboost安装
    XGBoost可以接受多种数据格式的输入,包括libsvm格式的文本数据、Numpy的二维数组、二进制的缓存文件。
    XGBoost的参数是以键值对的形式存储的,如:

    params = {
        'booster':'gbtree',
        'objective':'multi:softmax',   # 多分类问题
        'num_class':10,  # 类别数,与multi softmax并用
        'gamma':0.1,    # 用于控制是否后剪枝的参数,越大越保守,一般0.1 0.2的样子
        'max_depth':12,  # 构建树的深度,越大越容易过拟合
        'lambda':2,  # 控制模型复杂度的权重值的L2 正则化项参数,参数越大,模型越不容易过拟合
        'subsample':0.7# 随机采样训练样本
        'colsample_bytree':3,# 这个参数默认为1,是每个叶子里面h的和至少是多少
        # 对于正负样本不均衡时的0-1分类而言,假设h在0.01附近,min_child_weight为1
        #意味着叶子节点中最少需要包含100个样本。这个参数非常影响结果,
        # 控制叶子节点中二阶导的和的最小值,该参数值越小,越容易过拟合
        'silent':0,  # 设置成1 则没有运行信息输入,最好是设置成0
        'eta':0.007,  # 如同学习率
        'seed':1000,
        'nthread':7,  #CPU线程数
        #'eval_metric':'auc'
    }

    模型参数分为三类:通用参数、Booster参数、目标函数参数。

    通用参数是模型的宏观参数,通常不用刻意去设置。
        1、booster参数是迭代的模型,包括gbtree(基于树的模型)和gblinear(基于线性模型),默认选择是gbtree。
        2、silent 参数决定是否输出信息,默认是0。
        3、nthread 参数是多线程控制,默认
    最大线程,就是使用CPU的全部核。    4、num_feature 参数是特征维数,不需要手动设置,模型会自动设置。Booster参数通常就是tree booster的参数,因为linear booster的表现通常不如tree booster,因此很少使用。    1、eta(默认0.3),模型在更新时计算新的权重,通过减少每一步的权重,使模型更加保守,来防止过拟合。    2、gama(默认0),给定了损失函数的最低值,大于该值时节点才会分裂,该值越大模型越保守。    3、max_depth(默认6), 代表树的最大深度,该值越大模型对数据的拟合程度越高,适当控制最大深度可以防止模型过拟合,可以通过交叉验证cv函数来调参学习,通常取值范围在3-10之间。    4、min_child_weight(默认1),代表树模型的最小叶子节点样本的权重和,如果叶子节点的样本权重和小于该值,则拆分过程结束,该参数值较大时可以避免模型学习到局部的特殊样本防止模型过拟合,但该参数值过大会导致模型欠拟合,可以通过交叉验证cv函数来调参学习。    5、subsample(默认1),代表每棵树随机采样的比例,该参数值较小可以避免过拟合,但过小会导致模型欠拟合。    6、colsample_bytree(默认1),代表每棵树随机采样的列数占比,每一列是一个特征。    7、scale_pos_weight(默认0),在样本类别不平衡时,该参数值取大于0的值可以帮助模型更快收敛。    8、lambda(默认1),模型权重的L2正则化惩罚系数,平时很少使用,但可以用来降低过拟合。    9、alpha(默认0),模型权重的L1正则化惩罚系数,适用于数据维度很高时,算法速度更快。目标参数用来控制理想的优化目标和每一步输出结果的度量方法。    1、objective(默认reg:linear),代表学习任务需要最小化的损失函数,可选的目标函数有:        “reg:linear” :线性回归。        “reg:logistic” :逻辑回归。        “binary:logistic” :二分类的逻辑回归问题,输出为概率。        “binary:logitraw” :二分类的逻辑回归问题,输出的结果为wTx。        “count:poisson” :数问题的poisson回归,输出结果为poisson分布。        在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard          optimization)        “multi:softmax” :让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)        “multi:softprob” :和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。每行数据表示样本所属于每个类别的概率。        “rank:pairwise”:–set XGBoost to do ranking task by minimizing the pairwise loss

        2、base_score(默认0.5),所有样本的初始预测值,一般不需要设置。

        3、eval_metric(默认值取决于前面objective参数的取值),代表模型校验数据所需要的评价指标,不同的目标函数对应不同的默认评价指标(rmse for regression, and error for classification, mean average precision for ranking),用户也可以自己添加多种评价指标。
    常用的评价指标:
            “rmse”: root mean square error均方误差
            “mae”:mean absolute error 平均绝对误差
            “logloss”: negative log-likelihood负对数似然
            “error”: Binary classification error rate 二分类错误率,阈值为0.5
            “merror”: Multiclass classification error rate多分类错误率
            “mlogloss”: Multiclass logloss多分类对数损失
            “auc”: Area under the curve for ranking evaluation ROC曲线下面积
        4、seed(默认0),随机数的种子,设置该参数可以复现随机数据的结果,固定该值可以得到相同的随机划分。

    三、 Python实战
    首先是我们的数据展示,第一列是我们样本的ID,中间的列是我们的特征feature,最后一列是每个样本对应的标签label,取值为0或1。

    4149b15524921a092f3e7959c99b37c0.png

    1、首先导入必要的包:

    import xgboost as xgb
    from xgboost import plot_importance
    from matplotlib import pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    import pandas as pd
    import numpy as np
    import warnings
    from xgboost.sklearn import XGBClassifier
    from sklearn import metrics

    2、导入我们的数据并划分训练集和测试集:

    feature_file = pd.read_excel("data.xlsx")

    x = []# 特征数据
    y = []# 标签
    for index in feature_file.index.values:
        # print('index', index)
        # print(feature_file.ix[index].values) 
        x.append(feature_file.ix[index].values[1-1]) # 每一行都是ID+特征+Label
        y.append(feature_file.ix[index].values[-1] - 1#
    x, y = np.array(x), np.array(y)
    print('x,y shape', np.array(x).shape, np.array(y).shape)
    print('样本数', len(feature_file.index.values))
    # 分训练集和测试集
    X_train,X_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=12343)
    print('训练集和测试集 shape', X_train.shape, y_train.shape, X_test.shape, y_test.shape)
    # 共有218个样本,每个样本106个特征和1个标签,训练集174个样本,验证集44个样本

    9cbc5e38133bd6d7278619e182a078d6.png

    3、 采用交叉验证方法对数据进行训练和验证:

    # xgboost
    from xgboost import XGBClassifier
    xgbc_model=XGBClassifier()

    # 随机森林
    from sklearn.ensemble import RandomForestClassifier
    rfc_model=RandomForestClassifier()

    # ET
    from sklearn.ensemble import ExtraTreesClassifier
    et_model=ExtraTreesClassifier()

    # 朴素贝叶斯
    from sklearn.naive_bayes import GaussianNB
    gnb_model=GaussianNB()

    #K最近邻
    from sklearn.neighbors import KNeighborsClassifier
    knn_model=KNeighborsClassifier()

    #逻辑回归
    from sklearn.linear_model import LogisticRegression
    lr_model=LogisticRegression()

    #决策树
    from sklearn.tree import DecisionTreeClassifier
    dt_model=DecisionTreeClassifier()

    #支持向量机
    from sklearn.svm import SVC
    svc_model=SVC()

    # xgboost
    xgbc_model.fit(x,y)

    # 随机森林
    rfc_model.fit(x,y)

    # ET
    et_model.fit(x,y)

    # 朴素贝叶斯
    gnb_model.fit(x,y)

    # K最近邻
    knn_model.fit(x,y)

    # 逻辑回归
    lr_model.fit(x,y)

    # 决策树
    dt_model.fit(x,y)

    # 支持向量机
    svc_model.fit(x,y)

    from sklearn.cross_validation import cross_val_score
    print("\n使用5折交叉验证方法得随机森林模型的准确率(每次迭代的准确率的均值):")
    print("\tXGBoost模型:",cross_val_score(xgbc_model,x,y,cv=5).mean())
    print("\t随机森林模型:",cross_val_score(rfc_model,x,y,cv=5).mean())
    print("\tET模型:",cross_val_score(et_model,x,y,cv=5).mean())
    print("\t高斯朴素贝叶斯模型:",cross_val_score(gnb_model,x,y,cv=5).mean())
    print("\tK最近邻模型:",cross_val_score(knn_model,x,y,cv=5).mean())
    print("\t逻辑回归:",cross_val_score(lr_model,x,y,cv=5).mean())
    print("\t决策树:",cross_val_score(dt_model,x,y,cv=5).mean())
    print("\t支持向量机:",cross_val_score(svc_model,x,y,cv=5).mean())

    可以得到XGBoost、Random Forest随机森林、ET极度随机树、Naïve Bayes高斯朴素贝叶斯、KNN K近邻、Logistic Regression逻辑回归、Decision Tree 决策树等模型的5折交叉验证方法准确率。可以说没有调参的XGBoost已经优于其他机器学习算法了。

    7447b72c0bfe9e797b549d45687b933d.png

    4、 对模型进行性能评估

    # 性能评估以XGboost为例
    xgb = xgb.XGBClassifier()
    # 对训练集训练模型
    xgb.fit(X_train,y_train)
    # 对测试集进行预测
    y_pred = xgb.predict(X_test)
    print("\n模型的平均准确率(mean accuracy = (TP+TN)/(P+N) )")
    print("\tXgboost:",xgb.score(X_test,y_test))
    # print('(y_test,y_pred)', y_test,y_pred)    print("\n性能评价:")
    print("\t预测结果评价报表:\n", metrics.classification_report(y_test,y_pred))
    print("\t混淆矩阵:\n", metrics.confusion_matrix(y_test,y_pred))

    我们用XGBoost算法对训练集进行训练后,对测试集测试后进行性能评估,得到测试准确率、Precision、Recall、F1-score和混淆矩阵。

    bcb3f9f4a1d9316524dcae0afa1df385.png

    四、 XGBoost模型参数调优
    Xgboost参数调优的一般步骤:
      1、学习速率(learning rate)。在0.05~0.3之间波动,通常首先设置为0.1。
         2、进行决策树特定参数调优(max_depth , min_child_weight , gamma , subsample,colsample_bytree)在确定一棵树的过程中,我们可以选择不同的参数。
      3、正则化参数的调优。(lambda , alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。
      4、降低学习速率,确定理想参数。1、max_depth和min_child_weight
    首先设置固定的学习速率 learning rate,对max_depth、min_child_weight两个参数进行调优。

    #max_depth和min_child_weight参数调优
    # max_depth和min_child_weight参数对最终结果有很大的影响。max_depth通常在3-10之间,min_child_weight。采用栅格搜索(grid search),我们先大范围地粗略参数,然后再小范围的微调。
    # 网格搜索scoring = 'roc_auc' 只支持二分类,多分类需要修改scoring(默认支持多分类)

    param_test1 = {
    'max_depth':[i for i in range(3,10,2)],
    'min_child_weight':[i for i in range(1,6,2)]
    }
    from sklearn import svm, grid_search, datasets
    from sklearn import grid_search
    gsearch = grid_search.GridSearchCV(
    estimator = XGBClassifier(
    learning_rate =0.1,
    n_estimators=140, max_depth=5,
    min_child_weight=1,
    gamma=0,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=4,
    scale_pos_weight=1,
    seed=27),
    param_grid = param_test1,
    scoring='roc_auc',
    n_jobs=4,
    iid=False,
    cv=5)
    gsearch.fit(X_train,y_train)
    print('max_depth_min_child_weight')
    print('gsearch1.grid_scores_', gsearch.grid_scores_)
    print('gsearch1.best_params_', gsearch.best_params_)
    print('gsearch1.best_score_', gsearch.best_score_)

    cdea3d19cacc6d23f57768321ee16eea.png

    gsearch1.grid_scores_ [mean: 0.89440, std: 0.03817, params: {'max_depth': 4, 'min_child_weight': 4}, mean: 0.89630, std: 0.03958, params: {'max_depth': 4, 'min_child_weight': 5}, mean: 0.88518, std: 0.05002, params: {'max_depth': 4, 'min_child_weight': 6}, mean: 0.89440, std: 0.03817, params: {'max_depth': 5, 'min_child_weight': 4}, mean: 0.89630, std: 0.03958, params: {'max_depth': 5, 'min_child_weight': 5}, mean: 0.88518, std: 0.05002, params: {'max_depth': 5, 'min_child_weight': 6}, mean: 0.89440, std: 0.03817, params: {'max_depth': 6, 'min_child_weight': 4}, mean: 0.89630, std: 0.03958, params: {'max_depth': 6, 'min_child_weight': 5}, mean: 0.88518, std: 0.05002, params: {'max_depth': 6, 'min_child_weight': 6}]
    gsearch1.best_params_ {'max_depth': 4, 'min_child_weight': 5}
    gsearch1.best_score_ 0.8962955796353629

    我们得到max_depth的理想取值为4,min_child_weight的理想取值为5。同时,我们的得分有了小小一点提高(0.8864到0.8963)。2、gamma

    # gamma参数调优
    #   在已经调整好其他参数的基础上,我们可以进行gamma参数的调优了。Gamma参数取值范围很大,这里我们设置为5,其实你也可以取更精确的gamma值。

    from sklearn import svm, grid_search, datasets
    from sklearn import grid_search
    param_test3 = {
     'gamma':[i/10.0 for i in range(0,5)]
    }
    gsearch = grid_search.GridSearchCV(
    estimator = XGBClassifier(
    learning_rate =0.1,
    n_estimators=140,
    max_depth=4,
    min_child_weight=5,
    gamma=0,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=4,
    scale_pos_weight=1,
    seed=27),
    param_grid = param_test3,
    scoring='roc_auc',
    n_jobs=4,
    iid=False,
    cv=5)
    gsearch.fit(X_train,y_train)
    print('gamma')
    print('gsearch1.grid_scores_', gsearch.grid_scores_)
    print('gsearch1.best_params_', gsearch.best_params_)
    print('gsearch1.best_score_', gsearch.best_score_)

    cbbc13e802198ad78754d038f2da6137.png

    gsearch1.grid_scores_ [mean: 0.89630, std: 0.03958, params: {'gamma': 0.0}, mean: 0.89630, std: 0.03958, params: {'gamma': 0.1}, mean: 0.89630, std: 0.03958, params: {'gamma': 0.2}, mean: 0.89885, std: 0.04064, params: {'gamma': 0.3}, mean: 0.89282, std: 0.04636, params: {'gamma': 0.4}]
    gsearch1.best_params_ {'gamma': 0.3}
    gsearch1.best_score_ 0.8988476092191263

    我们得到gamma的理想取值为0.4。同时,我们的得分又有了小小一点提高(0.8963到0.8988)。3、subsample_colsample_bytree

    #调整subsample 和 colsample_bytree参数
    #   尝试不同的subsample 和 colsample_bytree 参数。我们分两个阶段来进行这个步骤。这两个步骤都取0.6,0.7,0.8,0.9作为起始值。
    #取0.6,0.7,0.8,0.9作为起始值
    from sklearn import svm, grid_search, datasets
    from sklearn import grid_search
    param_test4 = {
     'subsample':[i/10.0 for i in range(6,10)],
     'colsample_bytree':[i/10.0 for i in range(6,10)]
    }

    gsearch = grid_search.GridSearchCV(
    estimator = XGBClassifier(
    learning_rate =0.1,
    n_estimators=177,
    max_depth=4,
    min_child_weight=5,
    gamma=0.4,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=4,
    scale_pos_weight=1,
    seed=27),
    param_grid = param_test4,
    scoring='roc_auc',
    n_jobs=4,
    iid=False,
    cv=5)
    gsearch.fit(X_train,y_train)
    print('subsample_colsample_bytree------------------')
    print('gsearch1.grid_scores_', gsearch.grid_scores_)
    print('gsearch1.best_params_', gsearch.best_params_)
    print('gsearch1.best_score_', gsearch.best_score_)

    ff54bf5cdc3f1a8864879ee65490edce.png

    subsample_colsample_bytree------------------
    gsearch1.grid_scores_ [mean: 0.88900, std: 0.03849, params: {'colsample_bytree': 0.6, 'subsample': 0.6}, mean: 0.88783, std: 0.03607, params: {'colsample_bytree': 0.6, 'subsample': 0.7}, mean: 0.89162, std: 0.03423, params: {'colsample_bytree': 0.6, 'subsample': 0.8}, mean: 0.89827, std: 0.03363, params: {'colsample_bytree': 0.6, 'subsample': 0.9}, mean: 0.88919, std: 0.03723, params: {'colsample_bytree': 0.7, 'subsample': 0.6}, mean: 0.89715, std: 0.03549, params: {'colsample_bytree': 0.7, 'subsample': 0.7}, mean: 0.88918, std: 0.03390, params: {'colsample_bytree': 0.7, 'subsample': 0.8}, mean: 0.89838, std: 0.03134, params: {'colsample_bytree': 0.7, 'subsample': 0.9}, mean: 0.89807, std: 0.03173, params: {'colsample_bytree': 0.8, 'subsample': 0.6}, mean: 0.89174, std: 0.03980, params: {'colsample_bytree': 0.8, 'subsample': 0.7}, mean: 0.89615, std: 0.04389, params: {'colsample_bytree': 0.8, 'subsample': 0.8}, mean: 0.90298, std: 0.03024, params: {'colsample_bytree': 0.8, 'subsample': 0.9}, mean: 0.88920, std: 0.04164, params: {'colsample_bytree': 0.9, 'subsample': 0.6}, mean: 0.89951, std: 0.04025, params: {'colsample_bytree': 0.9, 'subsample': 0.7}, mean: 0.89765, std: 0.03318, params: {'colsample_bytree': 0.9, 'subsample': 0.8}, mean: 0.89922, std: 0.02492, params: {'colsample_bytree': 0.9, 'subsample': 0.9}]
    gsearch1.best_params_ {'colsample_bytree': 0.8, 'subsample': 0.9}
    gsearch1.best_score_ 0.9029777261781906

    我们得到subsample的理想取值为0.9, colsample_bytree的理想值0.8。同时,我们的得分又有了小小一点提高(0. 8988到0.9030)。4、reg_alpha

    #正则化参数调优reg_alpha
    #   由于gamma函数提供了一种更加有效的降低过拟合的方法,大部分人很少会用到这个参数,但是我们可以尝试用一下这个参数。
    from sklearn import svm, grid_search, datasets
    from sklearn import grid_search
    param_test6 = {
     'reg_alpha':[1e-5, 1e-2, 0.1, 1, 100]
    }

    gsearch = grid_search.GridSearchCV(
    estimator = XGBClassifier(
    learning_rate =0.1,
    n_estimators=177,
    max_depth=4,
    min_child_weight=5,
    gamma=0.4,
    subsample=0.9,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=4,
    scale_pos_weight=1,
    seed=27),
    param_grid = param_test6,
    scoring='roc_auc',
    n_jobs=4,
    iid=False,
    cv=5)
    gsearch.fit(X_train,y_train)
    print('reg_alpha------------------')
    print('gsearch1.grid_scores_', gsearch.grid_scores_)
    print('gsearch1.best_params_', gsearch.best_params_)
    print('gsearch1.best_score_', gsearch.best_score_)

    b05fb4f2cda7854da953603278b47891.png

    reg_alpha------------------
    gsearch1.grid_scores_ [mean: 0.90298, std: 0.03024, params: {'reg_alpha': 1e-05}, mean: 0.89911, std: 0.03017, params: {'reg_alpha': 0.01}, mean: 0.89911, std: 0.03198, params: {'reg_alpha': 0.1}, mean: 0.89181, std: 0.03346, params: {'reg_alpha': 1}, mean: 0.50000, std: 0.00000, params: {'reg_alpha': 100}]
    gsearch1.best_params_ {'reg_alpha': 1e-05}
    gsearch1.best_score_ 0.9029777261781906

    我们得到reg_alpha的理想取值为1e-05。同时,我们的得分没变(0.9030)。6、 reg_lambda

    #正则化参数调优reg_lambda
    #   由于gamma函数提供了一种更加有效的降低过拟合的方法,大部分人很少会用到这个参数,但是我们可以尝试用一下这个参数。
    from sklearn import svm, grid_search, datasets
    from sklearn import grid_search
    param_test7 = {
     'reg_lambda':[1e-5, 1e-2, 0.1, 1, 100]
    }
    gsearch = grid_search.GridSearchCV(
    estimator = XGBClassifier(
    learning_rate =0.1,
    n_estimators=177,
    max_depth=4,
    min_child_weight=5,
    gamma=0.4,
    subsample=0.9,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=4,
    scale_pos_weight=1,
    seed=27),
    param_grid = param_test7,
    scoring='roc_auc',
    n_jobs=4,
    iid=False,
    cv=5)
    gsearch.fit(X_train,y_train)
    print('reg_lambda------------------')
    print('gsearch1.grid_scores_', gsearch.grid_scores_)
    print('gsearch1.best_params_', gsearch.best_params_)
    print('gsearch1.best_score_', gsearch.best_score_)

    31f870b26409d52f78705ddfa18347c6.png

    reg_lambda------------------
    gsearch1.grid_scores_ [mean: 0.90298, std: 0.02792, params: {'reg_lambda': 1e-05}, mean: 0.89980, std: 0.02628, params: {'reg_lambda': 0.01}, mean: 0.89896, std: 0.03491, params: {'reg_lambda': 0.1}, mean: 0.90298, std: 0.03024, params: {'reg_lambda': 1}, mean: 0.87028, std: 0.04746, params: {'reg_lambda': 100}]
    gsearch1.best_params_ {'reg_lambda': 1}
    gsearch1.best_score_ 0.9029777261781906
    我们得到reg_lambda'的理想取值为1。同时,我们的得分没变(0.9030)。

    至此,我们的XGBoost就调参结束了,要想让模型有更好的表现,可以依靠其他手段,如特征工程(feature egineering) ,模型组合(ensemble of model),以及堆叠(stacking)等,有机会之后再介绍。

    Reference:
    https://www.cnblogs.com/wj-1314/p/9402324.html

    机器学习系列(一)K-近邻算法(KNN,K-Nearest-Neighbor)

    机器学习系列(二)决策树(Decision Tree)

    机器学习系列(三)朴素贝叶斯(Naive Bayes)

    机器学习系列(四)Logistc 回归

    机器学习系列(五)支持向量机(SVM)

    机器学习系列(六)Adaboost

    机器学习系列(七)回归

    机器学习系列(八)K均值(kMeans)

    展开全文
  • 本篇文章主要记录了贝叶斯优化算法hyperopt的学习笔记,如果想看自动调参中的网格调参和遗传优化算法TPOT,请查看我另外两篇文章:网格搜索gridSearchCV和遗传优化算法TPOT。1、算法思想贝叶斯优化算法与网格搜索...

    注:转载请注明出处。

    本篇文章主要记录了贝叶斯优化算法hyperopt的学习笔记,如果想看自动化调参中的网格调参和遗传优化算法TPOT,请查看我另外两篇文章:网格搜索gridSearchCV和遗传优化算法TPOT。

    1、算法思想

    贝叶斯优化算法与网格搜索和随机搜索完全不同,会充分利用之前测试点的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数想全局最优提升的参数。

    2、具体步骤首先根据先验分布,假设一个搜索函数。

    然后每次使用新的测试点来测试目标函数时,利用这个信息来更新目标函数的先验分布。

    最后,算法测试由后验分布给出的全局最值可能出现的位置的点。

    3、缺陷与弥补缺陷:一旦找到一个局部最优,会在该区域不断地采样,很容易陷入局部最优值。

    弥补方式:在探索和利用之间找到一个平衡点。“探索”就是在还未取样的区域获取采样点;利用是在根据后验分布在最可能出现全局最值的区域进行采样。

    4、具体实现-python库 hyperopt

    1. 功能可以针对某个模型进行调优。

    可以同时调整多个模型的超参,并取得全局最优模型。–棒棒棒!!

    2. hyperopt 参数简介需导入模块:hyperopt

    调用方法和主要参数

    1

    2

    3

    4

    5

    6

    7from hyperopt import fmin, tpe, hp

    best = fmin(

    fn=lambda x: x,

    space=hp.uniform('x', 0, 1),

    algo=tpe.suggest,

    max_evals=100)

    print best

    fmin:作用就是在有限的迭代次数下,求使目标函数fn取得最小值的超参数(超参数的阈值在space中),在space中搜索超参数的方法使由algo进行指定。

    fn :目标函数当不是求最小值时,需要转化为求最小值。

    space:超参数的阈值空间。

    algo:超参数搜索算法

    max_evals: 最大迭代次数

    输出历史结果,甚至进行可视化:trails matplotlib.pyplot

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29from hyperopt import STATUS_OK,Trials

    fspace={

    'x': hp.uniform('x',-5,5)

    }

    def f(params):

    x=params['x']

    val=x**2

    return {'loss': val,'status': STATUS_OK}

    trials = Trials()

    best1=fmin(fn=f,space=fspace,algo=tpe.suggest,max_evals=500,trials=trials)

    print(best1)

    print('trials:')

    for trial in trials.trials[:10]:

    print(trial)

    ## 可视化

    # x随时间t的变化

    import matplotlib.pyplot as plt

    f, ax = plt.subplots(1)

    xs = [t['tid'] for t in trials.trials]

    ys = [t['misc']['vals']['x'] for t in trials.trials]

    ax.set_xlim(xs[0]-10, xs[-1]+10)

    ax.scatter(xs, ys, s=20, linewidth=0.01, alpha=0.75)

    ax.set_title('$x$ $vs$ $t$ ', fontsize=18)

    ax.set_xlabel('$t$', fontsize=16)

    ax.set_ylabel('$x$', fontsize=16)

    plt.show()

    输出图片结果:由图片可以看出最初算法从整个范围中均匀地选择值,但随着时间的推移以及参数对目标函数的影响了解越来越多,该算法越来越聚焦于它认为会取得最大收益的区域-一个接近0的范围。它仍然探索整个解空间,但频率有所下降。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11# 目标函数随时间t的变化

    import matplotlib.pyplot as plt

    f, ax = plt.subplots(1)

    xs = [t['tid'] for t in trials.trials]

    ys = [t['result']['loss'] for t in trials.trials]

    ax.set_xlim(xs[0]-10, xs[-1]+10)

    ax.scatter(xs, ys, s=20, linewidth=0.01, alpha=0.75)

    ax.set_title('$y$ $vs$ $t$ ', fontsize=18)

    ax.set_xlabel('$t$', fontsize=16)

    ax.set_ylabel('$y$', fontsize=16)

    plt.show()

    输出图片结果:可以看出目标函数逐渐趋向最小值0.

    目标函数与x的变化

    1

    2

    3

    4

    5

    6

    7

    8

    9import matplotlib.pyplot as plt

    f, ax = plt.subplots(1)

    xs = [t['misc']['vals']['x'] for t in trials.trials]

    ys = [t['result']['loss'] for t in trials.trials]

    ax.scatter(xs, ys, s=20, linewidth=0.01, alpha=0.75)

    ax.set_title('$y$ $vs$ $x$ ', fontsize=18)

    ax.set_xlabel('$x$', fontsize=16)

    ax.set_ylabel('$y$', fontsize=16)

    plt.show()

    输出图片结果:可以看出在y取最小值处,点比较密集。

    功能2:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63digits = datasets.load_digits()

    X = digits.data

    y = digits.target

    print X.shape, y.shape

    def hyperopt_train_test(params):

    t = params['type']

    del params['type']

    if t == 'naive_bayes':

    clf = BernoulliNB(**params)

    elif t == 'svm':

    clf = SVC(**params)

    elif t == 'dtree':

    clf = DecisionTreeClassifier(**params)

    elif t == 'knn':

    clf = KNeighborsClassifier(**params)

    else:

    return 0

    return cross_val_score(clf, X, y).mean()

    space = hp.choice('classifier_type', [

    {

    'type': 'naive_bayes',

    'alpha': hp.uniform('alpha', 0.0, 2.0)

    },

    {

    'type': 'svm',

    'C': hp.uniform('C', 0, 10.0),

    'kernel': hp.choice('kernel', ['linear', 'rbf']),

    'gamma': hp.uniform('gamma', 0, 20.0)

    },

    {

    'type': 'randomforest',

    'max_depth': hp.choice('max_depth', range(1,20)),

    'max_features': hp.choice('max_features', range(1,5)),

    'n_estimators': hp.choice('n_estimators', range(1,20)),

    'criterion': hp.choice('criterion', ["gini", "entropy"]),

    'scale': hp.choice('scale', [0, 1]),

    'normalize': hp.choice('normalize', [0, 1])

    },

    {

    'type': 'knn',

    'n_neighbors': hp.choice('knn_n_neighbors', range(1,50))

    }

    ])

    count = 0

    best = 0

    def f(params):

    global best, count

    count += 1

    acc = hyperopt_train_test(params.copy())

    if acc > best:

    print 'new best:', acc, 'using', params['type']

    best = acc

    if count % 50 == 0:

    print 'iters:', count, ', acc:', acc, 'using', params

    return {'loss': -acc, 'status': STATUS_OK}

    trials = Trials()

    best = fmin(f, space, algo=tpe.suggest, max_evals=1500, trials=trials)

    print 'best:'

    print best

    5、参考

    展开全文
  • 使用遗传算法(GA)来自动率定经典水文概念性模型———新安江模型的各个参数,供大家学习参考 VS2008 with SP1 平台下编写,打开即可编译运行!
  • Auto ML自动调参

    2021-02-18 06:20:50
    本文介绍Auto ML自动调参算法介绍及操作流程。 操作步骤 登录PAI控制台。 单击左侧导航栏的实验并选择某个实验。 本文以雾霾天气预测实验为例。 在实验画布区,单击左上角的Auto ML > 模型自动调参。 在自动调...

    Auto ML自动调参
    本文介绍Auto ML自动调参的算法介绍及操作流程。
    操作步骤

    1. 登录PAI控制台。
    2. 单击左侧导航栏的实验并选择某个实验。
      本文以雾霾天气预测实验为例。
    3. 在实验画布区,单击左上角的Auto ML > 模型自动调参。
    4. 在自动调参配置页面,选择需要调参的算法,单击下一步。
      在这里插入图片描述

    说明 一个实验中有多个算法时请单选一个算法。
    5. 在调参配置模块,选择调参方式,完成后单击下一步。
    阿里云机器学习提供如下调参方式供选择:
    o EVOLUTIONARY_OPTIMIZER
    a. 随机选定a个参数候选集(探索样本数a)。
    b. 取其中评估指标较高的n个参数候选集,作为下一轮迭代的参数候选集。
    c. 继续在这些参数周边的r倍(收敛系数r)标准差范围探索,以探索出新的参数集,来替代上一轮中评估指标靠后的a-n个参数集。
    d. 根据以上逻辑,迭代m轮(探索次数m),直到找到最优的参数集合。
    根据如上原理,最终产生的模型数目为a+(a-n)*m 。
    注意 n的第一个值为a/2-1,在迭代过程中默认为n/2-1(小数向上取整)。
    在这里插入图片描述

     数据拆分比例:将输入数据源分为训练集和评估集。0.7表示70%的数据用于训练模型,30%用于评估。
     探索样本数:每轮迭代的参数集个数,个数越多越准,计算量越大,取值范围为5~30。
     探索次数:迭代次数,次数越多探索越准、计算量越大,取值范围为1~10。
     收敛系数:调节探索范围,越小收敛越快,但是可能会错过适合的参数,取值范围为0.1~1。
     自定义范围:输入每个参数的调节范围,如果未改变当前参数范围,则此参数按照默认值代入,不参与自动调参。
    o RANDOM_SEARCH
    . 每个参数在所在范围内随机选取一个值。
    a. 将这些值组成一组参数进行模型训练。
    b. 如此进行m轮(迭代次数),训练产生m个模型并进行排序。
    在这里插入图片描述

     迭代次数:表示在所配置的区间的搜索次数,取值范围为2~50。
     数据拆分比例:将输入数据源分为训练集和评估集,0.7表示70%的数据用于训练模型,30%用于评估。
     自定义范围:输入每个参数的调节范围,如果未改变当前参数范围,则此参数按照默认值代入,不参与自动调参。
    o GRID_SEARCH
    . 将每个参数的取值区间拆成n段(网格拆分数)。
    a. 在n段里面各随机取出一个随机值。假设有m个参数,就可以组合出n^m组参数。
    b. 根据nm组参数训练生成nm个模型并进行排序。
    在这里插入图片描述

     网格拆分数:表示拆分出的grid个数,取值2~10。
     数据拆分比例:将输入数据源分为训练集和评估集,0.7表示70%的数据用于训练模型,30%用于评估。
     自定义范围:输入每个参数的调节范围,如果未改变当前参数范围,则此参数按照默认值代入,不参与自动调参。
    o UserDefine
    在这里插入图片描述

    自定义范围:系统对枚举的参数取值范围进行全部组合尝试并打分,如果未输入按照默认参数执行。
    说明 在2.0版本中调参算法种类从4个增加到7个,各算法详细说明如下:
    在这里插入图片描述

    1. 在调参模型输出选择模块,配置模型输出参数,完成后单击下一步。
      在这里插入图片描述

    o 评估标准:可选择 AUC、F1-score、Precision、Recall四个维度中的一个作为评估标准。
    o 保存模型数量:取值范围为1~5。根据所选择的评估标准,对模型进行排名,最终保存排名靠前的几个模型,数量对应所选择的保存模型数量。
    o 模型是否向下传导:默认打开。如果开关关闭,则将当前组件的默认参数生成的模型,向下传导至后续组件节点;如果开关打开,则将自动调参生成的最优模型,向下传导至后续组件节点。
    7. 配置完成后,单击画布左上角的运行。
    此时画布上的对应算法已打开Auto ML 开关,后续也可以选择打开或关闭此开关。
    8. 可选:鼠标右键单击画布模型组件,选择编辑AutoML参数,修改AutoML配置参数。
    执行结果
    输出模型:
    9. 在调参过程中,鼠标右键单击目标模型组件,选择调参运行详情。
    10. 在 AutoML-自动调参详情页面,单击指标数据,查看当前调参的进度、各模型的运行状态等信息。
    11.在这里插入图片描述

    1. 根据候选模型的指标列表(AUC、F1-score、准确率、召回率)进行排序。
    2. 在查看详情列单击日志或参数,查看每一个候选模型的日志及参数。
      在这里插入图片描述

    调参效果展示:
    可以通过超参迭代效果对比,查看每一轮参数更新后评估指标增长的趋势。
    在这里插入图片描述

    模型存储:
    14. 选择左侧导航栏的模型。
    15. 单击实验模型,打开实验模型文件夹。
    16. 单击打开对应实验文件夹,查看Auto ML保存的模型。

    展开全文
  • 自动调参库hyperopt可用tpe算法自动调参,实测强于随机调参。 hyperopt 需要自己写个输入参数,返回模型分数的函数(只能求最小化,如果分数是求最大化的,加个负号),设置参数空间。 本来最优参数fmin函数会自己...
  • hyperopt自动调参

    2018-10-22 20:05:00
    hyperopt自动调参 在传统机器学习和深度学习领域经常需要调参,调参有些是通过通过对数据和算法的理解进行的,这当然是上上策,但还有相当一部分属于"黑盒" hyperopt可以帮助我们做很多索然无味的调参工作 示例 直接...
  • 文章目录机器学习自动调参1. Hyperopt**Hyperopt搜索参数空间**参数空间的设置使用sample函数从参数空间内采样:在参数空间内使用函数:**指定搜索的算法**实例Hyperopt调参XGBoost2. 贝叶斯调参 机器学习自动调参 ...
  • 自动调参工具-nni

    2020-07-08 21:45:52
    使用贝叶斯优化方法中的TPE 2.nni使用方法 step1:定制搜索空间:给超参一个大概的范围 step2 : 修改训练代码,让nii产生动态的超参运用于训练中 step3 : 调参算法等策略配置 3、nni结合baseline ...
  • sklearn分类算法测试以及自动调参

    千次阅读 2017-05-24 09:48:09
    'D:\\分类算法\\classify_data.txt' if os.path.exists(fPath): #读取csv文件内的数据, dataMatrix = np.array(pd.read_csv(fPath,header= None ,sep= ' ' ,skiprows= 1 ,names=[ 'class0' , 'pixel0' , '...
  • Keras模型使用GridSearchCV自动调参

    千次阅读 2019-04-18 15:43:09
    最近使用keras调整参数,使用到自动调参,从网上找到一些资料,主要使用scikit-learn中GridSearchCV进行自动搜索最优参数,很实用分享到这里,帮助需要的朋友。 Grid search 是一种最优超参数的选择算法,实际就是...
  • 作为一名熟练的机器学习调包侠和调参侠,面临的一个很大的问题就是机器...这其实已经触碰到了时下最火热的AutoML(自动化机器学习)的领域了:自动调参,不需要人工。本文的案例将使用svm算法做iris鸢尾花分类,...
  • 利用Scikit-Learn为模型自动调参

    千次阅读 2018-10-31 16:37:30
    在Scikit-Learn中的GridSearchCV需要一个字典类型的字段作为需要调参的参数,默认采用3折交叉验证的方法来评估算法。 这里有四个参数需要调参,因此会产生4*3个模型。 代码如下: """ 通过Scikit...
  • 深度学习自动调参工具,NNI使用

    千次阅读 2019-11-07 10:38:00
    向AI转型的程序员都关注了这个号??????????...机器学习AI算法工程 公众号:datayx在机器学习建模时,除了准备数据,最耗时耗力的...自动机器学习这两年成为了热门领域,着力解决超调试过程的挑战,通过超选择算法和...
  • 1、前言现在人工智能发展很火热,各种开源框架越发完善,用户的学习门槛越来越低,用Python简单的几十行代码就能实现一个人工智能应用,这些便利性都...而且,在机器学习的训练过程中,调参似乎也是一个必不可少的过...
  • GridSearchCV 简介:GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据...
  • 机器学习之Grid Search网格搜索(自动调参

    万次阅读 多人点赞 2019-01-10 13:26:30
    我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~ 任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑...
  • 【导读】机器学习中,调参是一项繁琐但至关重要的任务,因为它很大程度上影响了算法的性能。手动调参十分耗时,网格和随机搜索不需要人力,但需要很长的运行时间。因此,诞生了许多自动调整超参数的方法。贝叶斯优化...
  • 调参

    2021-03-24 18:11:03
    如果非要说什么的话,可以调研不同算法的超参都有哪些,各自代表什么含义,大概区间范围是多少,然后使用相应调参工具自动调参就行。 要对参数有概念,一开始认为机器学习学的就是这些参数啊,后来才意识到,参数也...
  • Ray Tune 是一个标准的超参数调优工具,包含多种参数搜索算法,并且支持分布式计算,使用方式简单。同时支持pytorch、tensorflow等训练框架,和tensorboard可视化。 超参数 神经网络结构搜索(层数、节点数、类型、...
  • 机器学习之权重、偏置自动调参

    千次阅读 2018-10-31 08:47:36
    这段时间在学习神经网络相关的内容,神经网络的算法里面只要给定它特征值丢进去,算法就会自身跟新权重和误差(偏置)。其实学习机器学习内容的时候,我对这些算法过程是理解的,但是我对细节是模糊的。 所以,我需要...
  • 调参其实并不简单,背后往往是通宵达旦的参数调试与效果验证,并需要做大量的实验,不仅耗时也耗费大量算力。 这个时候,往往想尝试自动超参搜索,但又开始担心算力要求所带来的额外训练成本。 莫慌!百度全功能...
  • 1、前言现在人工智能发展很火热,各种开源框架越发完善,用户的学习门槛越来越低,用Python简单的几十行代码就能实现一个人工智能应用,这些便利性都...而且,在机器学习的训练过程中,调参似乎也是一个必不可少的过...
  • 作为一名熟练的机器学习调包侠和调参侠,面临的一个很大的问题就是机器...这其实已经触碰到了时下最火热的AutoML(自动化机器学习)的领域了:自动调参,不需要人工。本文的案例将使用svm算法做iris鸢尾花分类,...
  • 在人工智能领域,算法工程师在训练神经网络模型的过程中,在完成网络构建和训练数据准备好后,往往需要对模型进行各种参数优化,以获得更好的模型效果。但调参其实并不简单,背后往往是通宵达旦的参数...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 174
精华内容 69
关键字:

自动调参算法