精华内容
下载资源
问答
  • 总结一下sklearn和tensorflow两个框架中主流模型调参经验,不定期补充。 LR penalty,选择正则化方式: 主要为解决过拟合问题,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差...

    会调包其实是基础,过程中还能加深对模型的理解,发散优化的思路。总结一下sklearn和tensorflow两个框架中主流模型的调参经验,不定期补充。

    LR

    penalty,选择正则化方式:
    主要为解决过拟合问题,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
    penalty参数的选择会影响我们损失函数优化算法的选择。newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。

    solver,选择loss函数的优化算法:
    1、liblinear:开源liblinear库实现,内部使用坐标轴下降法。
    2、lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化。
    3、 newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
    4、sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,SAG是一种线性收敛算法,这个速度远比SGD快。

    sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择,其次两个牛顿法。但是sag不能用于L1正则化,所以当样本量大,又需要L1正则化的话就要做取舍。

    liblinear也有自己的弱点,对于多元逻辑回归常见的one-vs-rest(OvR)和many-vs-many(MvM),liblinear只支持OvR。而MvM一般比OvR分类相对准确一些,所以如果我们需要相对精确的多元逻辑回归时,就不能选择liblinear,也意味着不能使用L1正则化。

    综上,liblinear支持L1和L2,只支持OvR做多分类,“lbfgs”, “sag” “newton-cg”只支持L2,支持OvR和MvM做多分类。

    multi_class,分类方式选择:
    有 ovr和multinomial两个值可以选择,默认是 ovr。multinomial即前面提到的many-vs-many(MvM)。

    OvR的思想是多元逻辑回归,都可以看成二元。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。

    举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。

    综上,OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。

    class_weight,类型权重参数:
    用于标示分类模型中各种类型的权重,不输入则所有类型的权重一样。
    选择balanced让类库自己计算类型权重,计算方法为:总样本数/(总类别数*每个类的样本数向量)。即某种类型样本量越多,则权重越低,样本量越少,则权重越高。
    或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。

    可以解决的问题为,1.误分类的代价很高,我们可以适当提升代价高那一类的权重。2.样本不均衡,提升样本量少的类别的权重。

    sample_weight,样本权重参数:
    在调用fit函数时,通过sample_weight来自己调节每个样本的权重。

    样本不平衡,造成样本不是总体样本的无偏估计,从而可能导致模型预测能力下降。
    遇到这种情况,我们可以通过调节类别和样本的权重来尝试解决。如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight。

    关于LR,工程界的共识是: 特征离散化可以得到更好的效果。
    总结下原因:
    1.离散特征在工程上容易设计,计算的时候计算逻辑简单。比如工程实现可以直接对离散特征的特征编号+取值做hash,来当作他最终的特征id,逻辑简单粗暴。
    2.离散化后,做分段,对异常数据有比较好的鲁棒性,比如年龄,>30岁为1,那么有异常数据哪怕是300岁,取值也不会有多大的问题。当然有人可能质疑,我用连续特征也会归一化,那么请看第三点
    3.特征分段离散化后,每一个取值都有一个单独的权重,能提升表达能力。比如一个连续值特征0-1, 可能0-0.2部分的差异度要小于0.8-1的差异度,而如果用连续特征,两者公用一个权重,那这里就体现不出来
    4.离散化后,可以对特征进行交叉组合,引入非线性因素。这个非常重要!
    引入一些离散的id属性,比如广告id,可以直接学习到这个广告的“好坏”,然后一般往往会拿id和一些其他的属性做组合。
    离散化的弱点:
    分段后,可能原本很接近的两个连续值被离散到两个不同的阈值,会带来不好的影响。第二,分段的确会屏蔽掉一些差异化因素。

    SVM

    SVM模型有两个非常重要的参数C与gamma。
    其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差。
    gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。

    如果gamma设的太大, δ   \delta\, δ 会很小, δ   \delta\, δ 很小的高斯分布长得又高又瘦, 会造成只会作用于支持向量样本附近,对于未知样本分类效果很差,存在训练准确率可以很高,(如果让无穷小,则理论上,高斯核的SVM可以拟合任何非线性数据,但容易过拟合)而测试准确率不高的可能,就是通常说的过训练;而如果设的过小,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率。

    rbf实际是记忆了若干样例,在sv中各维权重重要性等同。线性核学出的权重是feature weighting作用或特征选择 。

    SVM.svc参数
    C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本,default C = 1.0; 相当于惩罚松弛变量,C越大,松弛变量接近0,即对误分类的惩罚增大,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
    kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";
    degree:if you choose ‘Poly’ in param 2, this is effective, degree决定了多项式的最高次幂;
    gamma:核函数的系数(‘Poly’, ‘RBF’ and ‘Sigmoid’), 默认是gamma = 1 / n_features;
    coef0:核函数中的常数项,‘RBF’ and 'Poly’有效;
    probablity: 是否采用概率估计?(默认false);
    shrinking:是否进行启发式;
    tol:停止训练的误差值大小,默认为1e-3;
    cache_size: 制定训练所需要的内存(以MB为单位);
    class_weight: 每个类所占据的权重,不同的类设置不同的惩罚参数C, 缺省的话自适应;
    verbose: 是否启用详细输出。跟多线程有关;
    max_iter: 最大迭代次数,default = 1, -1为无限制;
    decision_function_shape : ‘ovo’ 一对一, ‘ovr’ 多对多, default=None;
    random_state :用于概率估计的数据重排时的伪随机数生成器的种子。

    属性:
    svc.n_support_:各类各有多少个支持向量
    svc.support_:各类的支持向量在训练样本中的索引
    svc.support_vectors_:各类所有的支持向量

    RF

    其实,对于基于决策树的模型,调参的方法都是大同小异。一般都需要如下步骤:

    • 首先选择较高的学习率,大概0.1附近,这样是为了加快收敛的速度。这对于调参是很有必要的。
    • 对决策树基本参数调参;
    • 正则化参数调参;
    • 最后降低学习率,这里是为了最后提高准确率。

    在 sklearn中,随机森林的函数模型是:

    RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
                max_depth=None, max_features='auto', max_leaf_nodes=None,
                min_samples_leaf=1, min_samples_split=2,
                min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
                oob_score=False, random_state=None, verbose=0,
                warm_start=False)
    

    参数分析
    max_features: 随机森林允许单个决策树使用特征的最大数量。
    Python为最大特征数提供了多个可选项。 下面是其中的几个:
    Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。
    sqrt :此选项是每颗子树可以利用总特征数的平方根个。 例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个。“log2”是另一种相似类型的选项。
    0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。
    max_features如何影响性能和速度?
    增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。 然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。
    n_estimators: 在利用最大投票数或平均值来预测之前,你想要建立子树的数量。
    较多的子树可以让模型有更好的性能,但同时让你的代码变慢。 你应该选择尽可能高的值,只要你的处理器能够承受的住,因为这使你的预测更好更稳定。
    min_sample_leaf: 最小样本叶片大小,很重要。
    叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声。 一般来说,我更偏向于将最小叶子节点数目设置为大于50。在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。

    调参对随机森林来说,不会发生很大的波动,相比神经网络来说,随机森林即使使用默认的参数,也可以达到良好的结果。

    使得模型训练更容易的特征
    n_jobs:告诉引擎有多少处理器是它可以使用。
    “-1”意味着没有限制,而“1”值意味着它只能使用一个处理器。
    random_state:让结果容易复现。 一个确定的随机值将会产生相同的结果,在参数和训练数据不变的情况下。 我曾亲自尝试过将不同的随机状态的最优参数模型集成,有时候这种方法比单独的随机状态更好。
    oob_score:随机森林交叉验证方法。 它和留一验证方法非常相似,但这快很多。 这种方法只是简单的标记在每颗子树中用的观察数据。 然后对每一个观察样本找出一个最大投票得分,是由那些没有使用该观察样本进行训练的子树投票得到。(每一列的*数据是没有被选中用于训练决策树的数据,我们称之为决策树的out-of-bag(OOB)样本。)

    GBDT

    把重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。

    boosting框架参数

    n_estimators: 最大的弱学习器的个数。默认100,常与learning_rate一起考虑。
    learning_rate: 即每个弱学习器的权重缩减系数ν,也称作步长,默认1。一般来说,可以从一个小一点的ν开始调参。对于同样的训练集拟合效果,较小的ν需要更多的弱学习器的迭代次数。
    subsample: 不放回子采样。如果取值小于1,则只有一部分样本会去做拟合,可减少方差,即防止过拟合,但是会增加偏差,因此取值不能太低。
    loss: 分类模型和回归模型的损失函数不同。
    对于分类模型,可选对数似然损失函数"deviance"和指数损失函数"exponential"。一般来说,推荐使用默认的对数似然损失"deviance"。它对二元分离和多元分类都有比较好的优化。而指数损失函数等价于Adaboost算法。
     对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。一般来说,如果数据的噪声不大,用默认的均方差"ls"比较好。否则,推荐用抗噪的损失函数"huber"。另外,需要对训练集进行分段预测时,采用“quantile”。

    alpha:这个参数只存在于回归模型,当使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪声大,可适当降低。

    弱学习器参数

    max_depth:默认值3。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

    max_features:构建决策树最优模型时考虑的最大特征数。一般来说,如果样本特征数不多,比如小于50,用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用’sqrt’等来控制划分时考虑的最大特征数,以控制决策树的生成时间。

    min_samples_leaf:叶子节点含有的最少样本,小于则剪枝,默认是1。 如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

    min_samples_split:叶子节点可分的最小样本数,默认是2。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

    max_leaf_nodes :最大叶子节点数,可防止过拟合,默认是"None”,即不限制。如果特征不多,可以不考虑这个值,否则,可以加以限制,具体的值可通过交叉验证得到。

    min_impurity_decrease :节点划分的最小不纯度。限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

    criterion :表示节点的划分标准,'gini’等。

    min_weight_fraction_leaf:叶子节点最小的样本权重和,小于则剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重。

    调整顺序

    1. 首先从步长(learning rate)和迭代次数(n_estimators)入手。一般来说,开始选择一个较小的步长来网格搜索最好的迭代次数。
    2. 找到了一个合适的迭代次数,再开始对决策树进行调参。首先对决策树最大深度max_depth和内部节点再划分所需最小样本数min_samples_split进行网格搜索。定下来最大树深。
    3. 再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参。
    4. 再对最大特征数max_features、子采样的比例subsample进行网格搜索。
    5. 基本得到所有调优的参数后,可以减半步长,最大迭代次数加倍来增加模型的泛化能力,防止过拟合。

    Xgboost

    XGBoost在基于梯度提升的框架下,其对目标函数进行二阶泰勒展开,使用了二阶导数加快了模型收敛速度,并使用正则化的目标函数,控制模型的复杂度。不仅如此,XGBoost算法借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,同时在进行完一次迭代后,会将叶子节点的权重乘上缩减系数,削弱每棵树的影响,让后续迭代有更大的学习空间。

    特征权重和缺失值补充设置:

    dtrain = xgb.Dmatrix(data,label=label,missing = 0,weight=w)
    

    eta:learning_rate, 相当于学习率。
    gamma:xgboost的优化loss的gamma,T(叶结点个数)的正则化系数,起到预剪枝的作用。

    max_depth:树的深度,越深越容易过拟合。
    min_child_weight:新分裂出来的一个叶子节点,只有当叶子节点上hession矩阵的和大于这个值时才会分裂,也起到了预剪枝的作用。

    subsample:训练时,对训练数据进行采样,来自随机森林的做法。
    colsample_bytree, colsample_bylevel, colsample_bynode:每颗树/每层/每个节点分裂时,是否对特征进行采样,同样来自随机森林的做法。
    lambda:L2正则。
    alpha:L1正则。
    eval_metric:校验数据所用评价指标。

    LightGBM

    提高精确度的两个最重要参数
    max_depth :设置树深度,深度越大可能过拟合。
    num_leaves:因为 LightGBM 使用的是 leaf-wise 的算法,因此在调节树的复杂程度时,使用的是 num_leaves 而不是 max_depth。大致换算关系:num_leaves = 2^(max_depth),但是它的值的设置应该小于 2^(max_depth),否则可能会导致过拟合。

    调节这两个参数降低过拟合
    min_data_in_leaf:是一个很重要的参数, 也叫min_child_samples,它的值取决于训练数据的样本个数和num_leaves。将其设置的较大可以避免生成一个过深的树, 但有可能导致欠拟合。
    min_sum_hessian_in_leaf:也叫min_child_weight,使一个结点分裂的最小海森值之和(Minimum sum of hessians in one leaf to allow a split. Higher values potentially decrease overfitting)。

    这两个参数都也可降低过拟合
    feature_fraction参数来进行特征的子抽样。这个参数可以用来防止过拟合及提高训练速度。
    bagging_fraction+bagging_freq参数必须同时设置,bagging_fraction相当于subsample样本采样,可以使bagging更快的运行,同时也可以降拟合。bagging_freq默认0,表示bagging的频率,0意味着没有使用bagging,k意味着每k轮迭代进行一次bagging。

    正则化参数
    lambda_l1(reg_alpha), lambda_l2(reg_lambda),用于降低过拟合,两者分别对应l1正则化和l2正则化。

    learning_rate与n_estimators
    使用较高的学习速率可以让收敛更快,但是准确度肯定没有细水长流来的好。使用较低的学习速率,以及更多的决策树n_estimators来训练数据,尝试进一步的优化分数。

    展开全文
  • 模型调参:超参调节tips总结

    千次阅读 2017-12-01 21:40:18
    模型调参:tips总结

    1. CS231n课程

    CS231n是斯坦福大学李飞飞团队的一门关于卷积神经网络CNN的课程,这个课程从KNN和线性分类器讲到普通的神经网络,再将到卷积神经网络的实现,以及一些实用的技术如Dropout、Batch Normalization等,整个课程下来后会对CNN有个比较全面的了解。这个课程通俗易懂,是入门深度学习的良心课程,不仅图文结合阐述了网络正向和反向传播的过程,还会介绍一些在实用中的应用的trick如训练过程的梯度检查、如何判断学习率大小、如何判断过拟合等等,以及相应的解决方法

    官方网站:http://cs231n.github.io/ 
    知乎中文翻译:https://zhuanlan.zhihu.com/p/21930884

    1.2 Assignment 2 使用

    配套CS231n课程的有两次作业,作业2主要有四部分内容:全连接层的实现、Batch Normalization、Dropout和卷积层的实现,CS231n有作业的初始模板,可以在此下载,模板里已经填好了实现这些网络的部分代码,学习者只需要在特定的方法中填写自己的代码即可,例如下面全连接层的forward方法,只需理解了课程笔记后按照提示在TODO中填写代码,填写完后,模板中还提供了方法来检查你代码的正确性:运行IPython notebook,这个notebook会引导你如何填写代码并测试代码,最后会在CIFAR-10数据集上测试你的CNN的准确性。

    def affine_forward(x, w, b):
      """
      Computes the forward pass for an affine (fully-connected) layer.
    
      The input x has shape (N, d_1, ..., d_k) and contains a minibatch of N
      examples, where each example x[i] has shape (d_1, ..., d_k). We will
      reshape each input into a vector of dimension D = d_1 * ... * d_k, and
      then transform it to an output vector of dimension M.
    
      Inputs:
      - x: A numpy array containing input data, of shape (N, d_1, ..., d_k)
      - w: A numpy array of weights, of shape (D, M)
      - b: A numpy array of biases, of shape (M,)
    
      Returns a tuple of:
      - out: output, of shape (N, M)
      - cache: (x, w, b)
      """
      out = None
      #############################################################################
      # TODO: Implement the affine forward pass. Store the result in out. You     #
      # will need to reshape the input into rows.                                 #
      #############################################################################
      pass
      #############################################################################
      #                             END OF YOUR CODE                              #
      #############################################################################
      cache = (x, w, b)
      return out, cache
     
    • 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

    本文对作业中填写的代码参照了CS231n (winter 2016) : Assignment2 - 简书,完整的代码位于Github,运行前请参考CS231n的Readme,Readme中详细介绍了环境的搭建、数据集的下载,如何使用IPython,以及相应的编译过程(如果要用Cpython加速训练过程的话)

    请先下载初始模板,搭建Python环境,下载数据集,运行IPython,然后参考notebook中的提示,填写相应代码。由于各个部分的代码在简书和Github中已有,不再累述。下面主要说一些在CIFAR-10数据库上通过改变CNN网络结构参数提高准确率的心得

    2. 在CIFAR-10上的表现

    2.1 简单两层神经网络

    当完成Part 1:全连接神经网络后,notebook会提示在CIFAR-10上跑一下,此时若代码实现正常,在测试集上基本上可以达到50%-55%的准确率,网络结构为简单两层,具体请见Github中的classifiers/fc_net.py,下面总结实战中的一些小的trick:

    Trick 1: 如何测试我们实现的模型有效性:小数据集过拟合: 如何判断我们的方法到能不能work,根据notebook里的提示,可以在一个很小的数据集上跑几个epoch,观察我们的模型是否能够对训练集很好的过拟合,而测试集准确率很低,具体是:在训练集这个100张图片里,是否能够实现99%-100%准确率的判断,而在测试集中另外的100张图片有比较低的准确率(10%左右),这里的模型指我们手动实现的算法

    Trick 2: 如何判断对层的实现是否正确:梯度检查: 在将我们的算法应用到正式的数据集上之前,需要对实现的层进行解析梯度和数值梯度的比较,具体方法在notebook里,数值梯度是微调1e-6参数获得的差值除以改变量1e-6得到的,而解析梯度是我们实现代码反向传播的输出(因为我们对层的更新都是根据求导法则来的,所以是梯度的解析值),将这两个梯度值比较,观察相对误差,能判断对这个层的实现有没有问题,相对误差在1e-7或者更小是很好的结果,若相对误差达到了1e-2,通常你的实现就有问题。但是,网络越深,相对误差会累计,在10层的网络里若有1e-2的相对误差,那也是可以的。除了梯度检查,notebook中提供了参考值用来检查你实现的权值更新准则如SGD+Momentum、RMSProp、Adam

    Trick 3: 如何判断权值和偏移量参数的初始化是否正确: 初始化对训练过程也是非常重要的,所以我们需要对训练过程进行检查,当正则强度为0时,对于CIFAR-10的softmax输出的分类器(初始权值w为0.01量级的随机数,初始偏移b为0),一般初始的loss function的值为2.302,这是因为初始时分类器对每一类的概率期望为0.1(共有10类),因此softmax损失函数值为对于正确分类概率的负对数:-ln(0.1)=2.302

    Trick 4: 如何判断学习率是否合适: 在训练过程中,需要对loss值进行实时地打印,可以判断当前训练的状态:高的学习率高会使损失值下降很快,然后停止在一个比较高的位置(相对最优),这是因为参数每次更新过大,导致在最优点附近震荡,但始终无法达到最优点,而过高的学习率会直接使损失值递增。过于低的学习率会导致损失值下降很慢,训练过程太长,引用笔记中的一张图来理解:

    这里写图片描述

    Trick 5: 如何判断模型的过拟合程度: 在训练过程中,我们还需要对每个epoch中的训练集和测试集的准确率进行打印,能够确定模型是否过拟合或者欠拟合,若训练集准确率一直大幅度高于验证集,说明此时模型过拟合,对训练集有过好的分类能力导致无法在验证集上进行比较好的分类,解决的方法可以增大正则化强度,如增大L2正则惩罚,增加dropout的随机失活率等。如果训练集一直小幅度低于验证集,说明此时稍微过拟合,而如果训练集和验证集的准确率不相上下,说明此时模型有点欠拟合,没有很好地学习到特征,此时可以调整模型参数如层的深度等,引用笔记中的一张图说明:

    这里写图片描述

    Trick 6: 如何判断训练中出现的梯度消散问题: 我们知道,当网络的层数过于深以后,会出现梯度消散的情况,也就是回传到前几层的梯度值很小,导致前面几层的参数无法更新。对此,我们可以打印前几层网络权值参数w的更新比例,经验结论是这个更新比例在1e-3比较比较好,若这个值太大,说明学习率太高;若这个值很小到1e-7,说明参数w基本上不会变,发生了梯度消散,解决方法为:1)使用Batch Normalization归一化每层之间的输出,2)激活函数改用线性ReLU,3)还有可能是学习率太低,4)减少网络层数

    Trick 7: 如何判断训练过程是否稳定和有效: 若数据为图像数据,那么可以把第一层的权重进行可视化,观察模型是否学习到了比较的好的特征,notebook里内置了相关可视化的方法,若特征图中颜色杂乱无规律且充满噪音,说明训练过程未收敛(学习率太高)或者正则化惩罚不够,引用笔记中的图来解释,下图中的右图为比较好的特征,平滑而且种类繁多,说明训练过程有效且稳定

    这里写图片描述

    Trick 8: 如何进行有效的数据预处理: 在实际应用中CNN比较多的是减均值法和归一化,其他的处理方法为PCA和白化(Whitening):PCA能消除数据的相关性,使数据的分布在基准值上;白化则可看成是把数据在各个特征方向上进行拉伸压缩变化,使之服从均值为零的高斯分布,具体参考[知乎](https://zhuanlan.zhihu.com/p/21560667?refer=intelligentunit

    2.2 卷积神经网络

    2.2.1 三层简单CNN

    在写Part 2:卷积神经网络之前,会先完成Dropout和Batch Normalization这两部分。在完成了Part 2后,notebook会用classifiers/cnn.py 中一个三层的简单的卷积神经网络来跑CIFAR-10,最终的表现在测试集上达到55-59%这样一个结果,比普通的神经网络高了几个百分点,这个网络结构如下:

    这里写图片描述

    2.2.2 稍微复杂点的CNN

    基于这个naive的CNN,我再加入一个卷积层和一个全连接层,去掉了Pool层,因为size为2的Pool层会使图像压缩至四分之一,而FICAR的图像大小为32*32,经过一个Pool后变成了16*16,信息损失太大,所以去掉Pool,考虑使用卷积层的stride=2或者3来压缩图像:

     INPUT --> [CONV --> RELU]*2 --> [FC --> RELU]*2 --> FC/OUT
     
    • 1

    此时在测试集上的精度大概能达到60-65%的程度,然后各种修改卷积层的padding,stride,filter_num参数,大概能提高到67%左右,而训练集精度基本上可以达到90%,说明模型有点过拟合,下一步考虑使用Dropout。

    2.2.3 多层小卷积层CNN+Dropout

    2.上述网络卷积层的过滤器尺寸始终未6或者7,相对于32*32的图像来说确实是一个比较大的尺寸,然而多层的小size的卷积层效果要比大的size的卷积层好:

    现在,我们以3个3x3的卷积层和1个7x7的卷积层为例,加以对比说明。从下图可以看出,这两种方法最终得到的activation map大小是一致的,但3个3x3的卷积层明显更好: 
    1)、3层的非线性组合要比1层线性组合提取出的特征具备更高的表达能力; 
    2)、3层小size的卷积层的参数数量要少,3x3x3<7x7; 
    3)、同样的,为了便于反向传播时的梯度计算,我们需要保留很多中间梯度,3层小size的卷积层需要保留的中间梯度更少。 
    这里写图片描述
    来自简书

    因此,我使用小的卷积层,两个卷积层的过滤器都为filter_size=(3,3),使用stride=2来压缩图像;同时在输出层前一层加入了Dropout防止过拟合,随机失活率p=0.8,网络结构如下:

     INPUT --> [CONV --> RELU]*2 --> FC --> RELU --> FC --> RELU --> DropOut --> FC/OUT
     
    • 1

    此时在测试集上的精度大概能达到65-70%左右的程度,训练集精度在很多次epoch后还是维持在80%以上,这时的调整包括再次增加一个全连接层,但是精度还是不能很好提高,遇到了瓶颈,这时可以考虑加入Batch Normalization了。

    2.2.4 分析大杀器ResNets

    然后我去CIFAR数据集查好解决方案,看到了2015年最好的网络结构ResNets,能达到93%+的精度,这个网络最深能达到110层,而且在20层的时候就能达到91%了。我们考虑20层简单的情况:

    INPUT --> [CONV --> BatchNorm --> RELU]*19 --> POOL --> FC/OUT
     
    • 1

    这个网络的特点为:每一卷积层都使用小的过滤器filter_size=(3,3),分阶段调整stride步长值:分别在第8层和第13层调整stride=2来压缩图像,其他卷积层的步长stride都1,而且每层卷积层后都会跟一个BatchNormal防止梯度弥散。通过分析这个网络,可以看出:

    1. 其实在stride>1的时候,stride跟pool一样,只保留了上个网络部分的信息,能起到压缩图像内容。

    2. zero-padding的作用不只是起到一个折中的方案:填补空白区域使卷积过程能够顺利进行,方便从过滤器能从初始位置以步长为单位可以刚好滑倒末尾位置,它的另外一个作用是为了保持图像的尺寸不变,根据公式output_size=(input_size+2*padding-filter_size)/stride+1,我们以input_size=32, padding=1, filter_size=3, stride=1 来计算卷积后的图像大小output_size=(32-2*1-3)/1+1=32,可以看出输入图像和卷积后的图像大小并没有改变,这也就是ResNets为什么能在32*32这么小的图像上卷积100多次的原因了,而且只靠stride=2来压缩图像两次

    对于ImageNet这样256*256图像的数据来说,怎么设置stride、padding、filter_size可能没有这么讲究,但是对于CIFAR小图像来说,如何巧妙地设计这些参数就有很大用处了,是深层网络必须的考虑的事

    2.2.5 最后的挣扎

    根据上面的分析,我最后挣扎了一下,因为机器不可能跑这么多层网络,还是采用了经典的CNN网络模型:

    INPUT --> [CONV --> RELU --> CONV --> RELU --> POOL]*2 --> [FC --> RELU] --> DROPOUT --> [FC --> RELU] --> FC/OUT
     
    • 1

    四个卷积层三个全连接,每个卷积层fliter_size=(3,3), stride=1,padding=1,重新使用pool压缩图像,以下是我的最终参数,可以在classfiers/cnn_custom 里查看:

    weight_scale=0.01, L2 regularization=0.0005, dropout=0.8, batch_size=100, optimizer=adam, learning_rate=0.001
    
    INPUT: input_dim=(3,32,32)
    CONV1: filters=64, filter_size=(3,3),stride=1, pad=1
    CONV2: filters=64, filter_size=(3,3), stride=1, pad=1
    POOL2: pool_height= 2, pool_width= 2, stride= 2
    CONV3: filters=64, filter_size=(3,3),stride=1, pad=1
    CONV4: filters=64, filter_size=(3,3), stride=1, pad=1
    POOL4: pool_height= 2, pool_width= 2, stride= 2
    FC5: 512 neurons
    FC6: 64 neurons
    FC7: 10 outputs
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    最终结果能拿到77%左右的测试集精度,90%+的训练集精度,未来的提高点在于每层加入Batch Normalization,因为BN需要额外的计算量还挺大的(自己实现的话),所以没有加上。最好的方案是跟ResNets一样,用小卷积层并扩展深度至20层以上。

    这里写图片描述

    下面给出我第一层卷积层权值w的可视化,因为是3*3,好像并看不出来什么,但是相比刚开始训练的时候要好的很多,不信你可以在训练完1个epoch时就可视化看看

    展开全文
  • DeepFM模型调参

    千次阅读 2020-03-31 21:40:48
    影响神经网络的超参数非常多,...网格搜索/Grid Search:这是在机器学习模型调参时最常用到的方法,对每个超参数都敲定几个要尝试的候选值,形成一个网格,把所有超参数网格中的组合遍历一下尝试效果。简单暴力,如...

    Ref: https://tech.meituan.com/2018/06/07/searchads-dnn.html

    影响神经网络的超参数非常多,神经网络调参也是一件非常重要的事情。工业界比较实用的调参方法包括:

    • 网格搜索/Grid Search:这是在机器学习模型调参时最常用到的方法,对每个超参数都敲定几个要尝试的候选值,形成一个网格,把所有超参数网格中的组合遍历一下尝试效果。简单暴力,如果能全部遍历的话,结果比较可靠。但是时间开销比较大,神经网络的场景下一般尝试不了太多的参数组合。
    • 随机搜索/Random Search:Bengio在“Random Search for Hyper-Parameter Optimization”10中指出,Random Search比Grid Search更有效。实际操作的时候,可以先用Grid Search的方法,得到所有候选参数,然后每次从中随机选择进行训练。这种方式的优点是因为采样,时间开销变小,但另一方面,也有可能会错过较优的超参数组合。
    • 分阶段调参:先进行初步范围搜索,然后根据好结果出现的地方,再缩小范围进行更精细的搜索。或者根据经验值固定住其他的超参数,有针对地实验其中一个超参数,逐次迭代直至完成所有超参数的选择。这个方式的优点是可以在优先尝试次数中,拿到效果较好的结果。

    我们在实际调参过程中,使用的是第3种方式,在根据经验参数初始化超参数之后,按照隐层大小->学习率->Batch Size->Drop out/L1/L2的顺序进行参数调优

    1. 隐层的层数和大小: 两层 512  256  我们也尝试了3层,4层的隐层,提升效果不是很大,而且训练时间较长,可能导致梯度消失、梯度爆炸、以及过拟合。 隐层大小(512,256) 对比了 128-128,512-256,512-256-128,521-256-256-128  四种中选择

    增加隐层数可以降低网络误差,提高精度,但也使网络复杂化,从而增加了网络的训练时间和出现“过拟合”的倾向。

    Ref:   https://segmentfault.com/q/1010000014818306    http://sofasofa.io/forum_main_post.php?postid=1000320

    如何形象的理解隐层大小越大,效果越好 https://www.zhihu.com/question/65403482

    2.学习率:最后选择0.001

    3. BatchSize :最后选择1000

    4.Dropout:神经元保留比例为0.8

    5.L1 取值10-4; L2=10-4

    DeepFM模型最后采用 sigmoid  final_activation='sigmoid'

    隐层激活函数采用: activation='relu'

    损失函数呐 采用二元交叉熵损失

    优化器采用adam,

    优化指标AUC

    2. 

    MultiTextCNN  中有关 调参的。

     

     

     

     

     

     

    网络常见的一些问题也可以通过超参的设置来解决:

    • 过拟合
      • 网络宽度深度适当调小,正则化参数适当调大,Dropout Ratio适当调大等。
    • 欠拟合
      • 网络宽度深度适当调大,正则化参数调小,学习率减小等。
    • 梯度消失/爆炸问题
      • 合适的激活函数,添加Batch Normalization,网络宽度深度变小等。
    • 局部最优解
      • 调大Learning Rate,合适的优化器,减小Batch Size等。
    • Covariate Shift :
      • 这个指的是训练集的数据分布和预测集的数据分布不一致,这样的情况下如果我们在训练集上训练出一个分类器,肯定在预测集上不会取得比较好的效果。
      • 深度学习网络在训练时容易受到输入层分布变化和前面层参数变化的影响,所以训练时需要用较低的学习率,且对参数初始化非常敏感。这一现象即为internal covariate shift。
      • 增加Batch Normalization,网络宽度深度变小等。BN负责调整特征分布回到原始的数据分布

     

     

     

     

     

     

    展开全文
  • 深度模型调参

    千次阅读 2018-04-16 21:17:28
    注意 调参看验证集。trainset loss通常能够一直降低,但validation set loss在经过一段降低期后会开始逐渐上升,此时模型开始在训练集上过拟合。 着重关注val loss变化,val ...优先调参学习率。 通过对模型预...

    注意

    1. 调参看验证集。trainset loss通常能够一直降低,但validation set loss在经过一段降低期后会开始逐渐上升,此时模型开始在训练集上过拟合。
    2. 着重关注val loss变化,val acc可能会突变,但loss衡量的整体目标。
    3. 优先调参学习率。
    4. 通过对模型预测结果,可以判断模型的学习程度,如果softmax输出在0或1边缘说明还不错,如果在0.5边缘说明模型有待提高。
    5. 调参只是为了寻找合适的参数。一般在小数据集上合适的参数,在大数据集上效果也不会太差。因此可以尝试采样部分数据集,以提高速度,在有限的时间内可以尝试更多参数。

    学习率(重要)

    这里写图片描述

      画图分析是种不错调参学习率的方式:学习率过大,loss曲线可能会上升,或者不能一直下降,出现震荡情况,由于学习率较大,导致参数在最优点附近徘徊,loss大小一下大一下小,就是却无法到达最优点,容易拟合在局部最小值。学习率太小loss曲线可能下降速度过于缓慢。好的学习率loss呈平滑的下降曲线。
      学习率代表了参数的更新步长,你走的距离越短当然不会错过每个最低点,但是耗时间。而且步长越小,越容易得到局部最优化(到了比较大的山谷,就出不去了),而太大了可能会直接越过全局最优点。

    1. lr:学习率太大,容易梯度爆炸,loss变nan。取1 0.1 0.01 .0001 … 10e-6(取对数变化)。常取0.1。通过对验证集的预测,可以选择一个较好的lr。如果当前的学习率不能在验证集上继续提高,可以将学习率除以2或者5试试。
    2. decay:训练集的损失下降到一定的程度后就不再下降了,而且train loss在某个范围内来回震荡,不能进一步下降(也就是loss一下跳到最低点左侧,一下跳到最低点右侧,由于学习率过高就是不能继续下降)。可采用衰减学习率,学习率随着训练的进行逐渐衰减。取0.5。比如当val loss满足 no-improvement规则时,本来应该采取early stopping,但是可以不stop,而是让learning rate减半继续跑。如此反复。衰减方法有:衰减到固定最低学习率的线性衰减,指数衰减,或每次val loss停滞时衰减2-10倍。
    3. fine-tuning的时候,可以把新加层的学习率调高,重用层的学习率可以设置的相对较低。
      这里写图片描述

    CLR- 中文

    参数初始化

    1. 破坏不同单元间对称性,如果两个单元相同,接受相同的输入,必须使其具有不同的初始化参数,否则模型将一直以相同方式更新这两个单元。更大的初始化权重会更容易破坏对称性,且避免在梯度前向和反向传播过程中丢失信号,但如果权重初始化太大,很容易产生爆炸值(梯度爆炸可以使用梯度截断缓解);而在CNN中会导致模型对输入高度敏感,导致确定性的前向传播过程表现的随机;而且容易导致激活函数产生饱和的梯度,导致梯度丢失。
    2. 不可取:
      初始化为0,模型无法更新,而且模型权重的相同,导致模型的高度对称性。
      初始化为 very small random numbers(接近0,但不是0),模型效果不好,会导致梯度信息在传播中消失。
    3. 推荐:
      一般bias全初始化为0,但在RNN中有可能取1(LSTM)。
      random_uniform
      random_normal
      glorot_normal
      glorot_uniform(无脑xavier,为了使得网络中信息更好的流动,每一层输出的方差尽量相等。)

    这里写图片描述

    激活函数

    1. ReLu:通用激活函数,防止梯度弥散问题。最后一层慎用ReLu做激活。
    2. Sigmoid的可微分的性质是传统神经网络的最佳选择,但在深层网络中会引入梯度消失和非零点中心问题。除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,。sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。输入0均值,sigmoid函数的输出不是0均值的。
    3. tanh范围在-1到1之间,且zero-center,但比sigmoid要好,但仍有饱和时梯度消失问题。
    4. relu比sigmoid和tanh好,导数易计算收敛速度快,不会饱和。唯一问题就是x小于0时梯度为0,可能会导致许多神经元死亡。使用时尤其注意lr的设置
    5. Leaky_ReLu及ReLu变种,maxout可以试试。
    6. 通常使用ReLu,及其变种,PReLU and RReLU 效果挺好。tanh可以试试,但不要使用sigmoid。

    模型

    1. 如果输入向量固定大小,可考虑使用全连接前馈网络,如果输入为图像等二维结构,可考虑卷积网络,如果输入为序列,可考虑循环神经网络。
    2. BN:提高性能,加速训练,有时可省去dropout。注意BN在batch size过小时性能不是很好。
    3. 尽量选择更多的隐层单元,小filter,利用非线性,而过拟合通过正则化的方法避免。
    4. 一开始需要验证模型是否有问题,可采取小量数据集、很深模型快速看模型是否能够对训练集很好的过拟合,而测试集准确率很低。
    5. batch_size:常取2的n次方。通常影响不大。 取 32 64 128。batch越大,一般模型加速效果明显。不考虑时间成本的情况下,batch size=1可作为一个regularizer。
    6. 不同尺寸的feature maps的concat,利用不同尺度的信息。
    7. resnet的shortcut有作用,shortcut的支路一定要是identity。
    8. 可以利用Inception方法来提取不同抽象程度的高阶特征。
    9. 梯度归一化:计算出来梯度之后,除以Minibatch的数量。
    10. 利用pre-trained model和fine-tune可以实现很好的性能。

    这里写图片描述

    优化函数

    1. Adam:收敛速度快。可以无脑用。
    2. SGD+Momentum:效果比Adam可能好,但速度稍慢。m取值0.5 0.95 0.9 0.99
    3. 梯度截断: 限制最大梯度 或者设置阀值,让梯度强制等于5,10,20等。

    卷积步幅,池化

    1. strides:取小值,常取1,2,
    2. filter数量翻倍(数量2^n,第一层不宜太少,n为层数)。反卷积相反。
    3. kernel size:流行使用小size(3*3),注意对于大目标,感受野太小可能影响性能。尤其对于FCN,FC全连接毕竟具有全局视野。
    4. pooling:常取2*2

    数据集、输入预处理和输出

    如何判断是否应该收集更多数据:
      首先判断当前模型是否在该训练集上性能良好,如果在当前训练集上性能就很差,此时应该注重提高模型,增加网络层或隐藏单元等。如果使用更大模型后还是效果不佳,此时应考虑是否是数据集质量不佳(包含太多噪声等),或模型存在根本错误。
      然后如果模型在训练集上性能可以接受,但在测试集上很差,此时可以考虑收集更多数据。但此时需要考虑收集数据的可行性和代价。如果代价太高,一个可行办法是降低模型大小,改进正则化,调参等。通常在对数尺度上收集数据。
      
    1. 尽可能获得更多的数据(百万级以上),移除不良数据(噪音、假数据或空值等,数据中出现nan值时会导致模型loss变成nan)。
    2. 数据不足时做好Data Augment。对于图像可以水平翻转,随机裁剪crop,旋转,扭曲,缩放,拉伸,改变色调,饱和度(HSV)等,还可以同时随机组合。需注意改变后的图片(垂直翻转)是否符合实际,是否丢失重要特征等问题。AlexNet对256的图片进行224的随机crop采样,对每一张图片,产生2048种不同的样本,使用镜像后,数据集翻了2048*2=4096倍。虽然大量的重采样会导致数据的相关性,但避免了过拟合。至少比多个epoch输入相同图像要好。AlexNet中还有一种Fancy PCA采样方法。
    2. 输入训练集一定要shuffle。注意keras中自带的shuflle针对的是batch内部的打乱。
    3. 输入特征归一化,zero-center和normalize。PCA whitening一般不需要。还有处理到-1~1之间或0~1之间。
    4. 预测目标(label)都做好归一化。比如回归问题中,label相差过大(0.1和1000),做好normalization能统一量纲
    5. 数据集类别不平衡问题:上采样、下采样。或者使用data augment方式对较少类别数据进行采样。对类别不平衡进行loss,权重调整。或者将数据集按类别拆分,优先训练数量多的类别数据,再训练数量少的类别数据。
    6. 不仅训练集做好增强,测试集也最好做增强。保持二者分布的一致性。

    # zero-center normalize
    X -= np.mean(X, axis = 0)
    X /= np.std(X, axis = 0)
       
    • 1
    • 2
    • 3

    目标函数

    1. 多任务情况下, 各loss尽量限制在一个量级上, 初期可以着重一个任务的loss。
    2. focal loss可能有点作用

    正则化

    这里写图片描述
      如何判断是否过拟合或者欠拟合:若训练集准确率一直大幅度高于验证集,说明模型过拟合,可以增大正则化强度,如增大L2正则惩罚,增加dropout的随机失活率等。如果训练集一直小幅度低于验证集,说明稍微过拟合,而如果训练集和验证集的准确率不相上下,说明此时模型有点欠拟合,没有很好地学习到特征,可以调整模型宽度、深度等。
      在训练过程中L2范数使得权重分量尽可能均衡,即非0分量个数尽量稠密,而L1范数和L0范数尽可能使权重分量稀疏,即非0分量个数尽量少。
      稀疏性能实现特征的自动选择。在我们事先假定的特征中,有很多特征对输出的影响较小,可以看作是不重要的特征。而正则化项会自动对特征的系数参数进行惩罚,令某些特征的权重系数为0或接近于0,自动选择主要自变量或特征。
      如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。
      建议开始将正则项惩罚系数λ设置为0,待确定比较好的learning rate后,固定该learning rate。给λ一个值(比如1.0),然后根据validation accuracy,将λ增大或者减小10倍进行粗调,然后进行细调。
      
    1. 注意除非数据集比较多(千万级),否则一开始最好采用温和一点的正则化。
    2. Dropout:相当简单有效的一种方式,防止过拟合,取0.3 0.5(推荐,0.5时生成的组合网络最多) 0.7
    2. L2正则:较为常用的正则方式。在目标函数中添加关于权重的部分这里写图片描述
    3. L1正则:较为常用的正则方式。在目标函数中添加关于权重的部分这里写图片描述。可以与L2连用这里写图片描述
    4. Max norm Constraints:由于它限制了权重大小,使用这个约束后,网络一般不会出现“爆炸”问题。

    Esemble

    1. 同样的参数,不同的初始化方式。使用cross-validation找出最佳超参,然后使用不同参数初始化方式训练多个模型。
    2. 不同的参数,通过cross-validation,选取最好的几组或性能较好的top-K组。
    3. 同样的参数,模型训练的不同阶段,即不同迭代次数的模型。
    4. 不同的模型,进行线性融合. 例如RNN和传统模型。
    5. 不同训练集训练的模型提取不同特征进行融合。

    简单点:投票法、平均法、加权平均法
    stacking法:
    这里写图片描述
    这里写图片描述
    第一层你有模型M1和M3,首先对M1使用5-fold训练,得到5个模型,然后分别预测训练集(5折中某1折)合并后生成第二层的训练集F1,然后使用M1的5个子模型对测试集预测取均值T1,得到第二层的测试集。第一层模型M3同样采用此方法生成F3和T3。这样你的第二层模型M2就有训练集(F1,F2),测试集(T1,T2),使用第二层模型进行训练预测。
    Blending法:
    将数据划分成train,test,然后将train划分成不相交的两部分train_1,train_2。
    使用不同的模型对train_1训练,对train_2和test预测,生成两个1维向量,有多少模型就生成多少维向量。
    第二层使用前面模型对train_2生成的向量和label作为新的训练集,使用LR或者其他模型训练一个新的模型来预测test生成的向量。

    图像可视化调参

    1. 可视化激活层、参数层
    2. 可视化输出错误:通过判断模型输出错误的样本,分析原因。
    3. 可视化激活函数值和梯度的直方图:隐藏单元的激活值可以告诉我们单元饱和程度;梯度的快速增长和消失不利于模型优化;在一次小批量参数更新过程中梯度参数的更新最好在原参数的1%左右,而不是50%或0.001%。注意如果数据是稀疏的(如自然语言),那么有些参数可能很少更新。
    4. tensorboard

    其他

    1. 早停

    自动调参

    1. Random Search
    2. Gird Search
    3. Bayesian Optimization

    减小内存

    1. 使用更大步态
    2. 使用1*1线性卷积核降维
    3. 使用池化降维
    4. 减小mini-batch大小
    5. 将数据类型由32为改成为16位
    6. 使用小的卷积核

    Must Know Tips/Tricks in Deep Neural Networks
    模型调参:超参调节tips总结

    展开全文
  • 在进行机器学习建模时,比如说针对一个分类问题,我们会选择几个分类的模型比如逻辑回归,SVM,决策树等,这个过程是模型选择,还是说选定某一个模型,对其...那模型选择、模型调参以及模型调优之间有什么区别和联系?
  • 为实现模型建立过程与调参过程的分离,将模型的超参数写如配置文件中,以实现自动化调参以随机森林为例:超参数写入variables.ini配置文件中,每一个section可以作为一个调参的方案,并且在进行调参时,不需要对程序...
  • 模型调参利器--hyperopt

    千次阅读 2018-04-18 14:16:03
    Hyperopt提供了一个优化接口,这个接口接收一个评估函数和参数空间,能计算出空间内的一个点的损失函数值,简化了调参过程。 二、实战 通过使用感知机判别鸢尾花数据的例子,熟悉一下hyper库的用法。 ...
  • 模型调参:分步骤的提升模型的精度

    万次阅读 多人点赞 2017-12-01 22:14:11
    模型调参:分步骤的提升模型的精度
  • 模型调参:绘制loss曲线图

    万次阅读 2017-12-01 21:29:06
    模型调参:绘制loss曲线图
  • 深度模型调参知识总结

    千次阅读 2018-07-02 12:50:28
    深度模型调参知识总结 先保证数据质量再去调参 什么是高质量的数据? 高质量数据集应该包括以下特征: 类别均衡 数据充足 数据和标记中有高质量信息 数据和标记错误非常小 与你的问题...
  • 1.机器学习常用三种调参方法:网格搜索、随机搜索和贝叶斯调参2.网格搜索是遍历式搜索方法,效率较低,资源消耗多3.网格搜索和随机搜索都没有考虑前面搜索的先验知识4.贝叶斯调参的原理是贝叶...
  • 随机森林模型调参方法

    千次阅读 2018-05-16 15:06:45
    这里将调参方法简单归纳为三条:1、分块调参(不同框架参数分开调参);2、一次调参不超过三个参数;3、逐步缩小参数范围。这里以n_estimators参数为例(省略数据和模型的导入): #导入网格搜索模块 from sklearn....
  • keras 深度模型调参

    千次阅读 2018-01-17 11:29:48
    最重要的是,个别模型的训练非常缓慢。 在这篇文章中,你会了解到如何使用scikit-learn python机器学习库中的网格搜索功能调整Keras深度学习模型中的超参数。 阅读本文后,你就会了解: 如何包装Keras模型以便在...
  • 模型调参是一门玄学。为了获得模型最优参数,我们需要不断地尝试不同的参数,这一过程相当繁琐。好在python的sklearn包中为我们提供了GridSearchCV,大大方便了调参过程。本文使用实际例程简单介绍一GridSearchCV的...
  • 机器学习之GridSearchCV模型调参

    千次阅读 2018-06-11 14:46:39
    注意:在实际应用中,可能会遇到很大数据量,模型运行特别费计算资源和时间,这个时候用GridSearchCV可能会成本太高,需要对模型了解深入一点或者积累更多的实战经验,最后进行手动调参。 代码...
  • 模型调参的三种常用方法

    千次阅读 2020-04-01 21:45:46
    模型调参的三种常用方法: 1.贪心算法 (1)概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。 贪心...
  • scikit learn各个常用模型调参总结

    千次阅读 2019-01-16 11:29:54
    ,在调参时如果我们主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。如果模型的特征非常多,希望一些不重要的特征...
  • 15、总结 通过以上的总结,你可以看到调参需要考虑的因素有很多,这是一个很偏向于经验的能力,所以多动脑思考多去尝试才是正途。 新的一年,祝你,祝我,祝我们都能有一个更大的进步!!! 如果想要更多的资源,...
  • xgboost、random forest等模型调参小结

    千次阅读 2018-01-18 12:31:19
    调参模型适应不同数据集的一个优化过程,如果只是建立了模型,而不对参数进行调整,是很不合理的。 2、xgboost调参 3、网络调参 from sklearn.metrics import fbeta_score, make_scorer,r2_score from ...
  • ML之XGBoost:利用XGBoost算法对波士顿数据集回归预测(模型调参【2种方法,ShuffleSplit+GridSearchCV、TimeSeriesSplitGSCV】、模型评估) 目录 利用XGBoost算法对波士顿数据集回归预测 T1、ShuffleSplit+GSCV...
  • LSTM调参经验

    千次阅读 2020-06-29 09:52:35
    在开始调参之前,需要确定方向,所谓方向就是确定了之后,在调参过程中不再更改 1、根据任务需求,结合数据,确定网络结构。 例如对于RNN而言,你的数据是变长还是非变长;输入输出对应关系是many2one还是many2...
  • 机器学习的模型,要涉及到不少参数的调参。。那其正确的步骤应该是怎样的呢? 第一种做法是,对一个个或一组组参数去调,其他参数使用默认值。。调出一个或一组参数后,记录下来。下一次继续调另外一个或一组参数。...
  • 机器学习AI算法工程 前天 机器学习AI算法工程 公众号: datayx ...   一、问题描述 ...当我们在处理图像识别或者图像分类或者其他机器学习任务的...或者说我们在漫长而苦恼的调参过程中到底调的是哪些参数。。。...
  • Caffe调参经验

    千次阅读 2018-05-22 12:01:55
    假设现在你要在一批数据集上训练出一个caffe模型, 你要怎么做?训练中遇到的问题,要如何解决?仔细看下去吧! 第一步: 数据清洗 训练集和测试集是否同分布? 用cross validation去做验证。 如果CV训练结果OK...
  • 之前对比分析的主要是数据和特征层面,还有另一部分非常重要的工作等着大家去做,就是模型调参问题,在实验的最后,看一下对于树模型来说,应当如何进行参数调节。 调参是机器学习必经的一步,很多方法和经验并不是...
  • 使用遗传算法(GA)来自动率定经典水文概念性模型———新安江模型的各个参数,供大家学习参考 VS2008 with SP1 平台下编写,打开即可编译运行!
  • 时间序列-ARIMA模型调参检验实战

    千次阅读 2020-11-08 22:25:02
    关于截断与拖尾如何选择模型 参考:博客 剩余部分代码中都有 3.代码 #!usr/bin/env python # -*- coding:utf-8 _*- """ @author: liujie @software: PyCharm @file: ArmaModel(2,2)or(0,1).py @time: 2020/11/6 17:...
  • xgboost调参经验

    千次阅读 2019-10-11 22:28:54
    本文为kaggle上一位选手分享的xgboost调参经验的翻译。方便对xgboost模型参数的快速调试。 原文:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,241
精华内容 20,096
关键字:

模型调参经验