高级调参技巧

如下是Coursera上的How to Win a Data Science Competition: Learn from Top Kagglers课程笔记。html

Hyperparameter Optimization

  • List most important hyperparameters in major models; describe their impact
  • Understand the hyperparameter tuning process in general
  • Arrange hyperparameters by their importance

Hyperparameter tuning I

Plan for the lecturepython

  • Hyperparameter tuning in general
  • General pipeline
  • Manual and automatic tuning
  • What should we understand about hyperparameters?
  • Models,libraries and hyperparameter optimization
  • Tree-based models
  • Neural networks
  • Linear models

Plan for the lecture:modelsgit

  • Tree-based models
  • GBDT: XGBoost, LightGBM, CatBoost
  • RandomForest/ExtraTrees
  • Neural nets
  • Pytorch, Tensorflow, Keras...
  • Linear models
  • SVM, logistic regression
  • Vowpal Wabbit, FTRL
  • Factorization Machines(out of scope)
  • libFM, libFFM

How do we tune hyperparameters

  • 1.Select the most influential parameters
  • a.There are tons of parameters and we can'ttune all of them
  • 2.Understand,how exactly they influence the training
  • 3.Tune them
  • a.Manually(change and examine)
  • b.Automatically(hyperopt, etc)github

  • 1.不管如何,咱们历来没有时间调整全部的参数,因此咱们须要提出一个很好的子集来调整。假设咱们是xgboost新手,不知道哪些参数是须要调的,能够在Github或Kaggle Kernels搜索到前人一般设置的参数。
  • 2.理解改变其中一个参数会发生什么。
  • 3.大多数人手动完成调参工做。也可使用超参数优化工具,但手动执行一般会更快。算法

Hyperparameter optimization software自动调参工具

运行调参工具可能须要很长时间,所以最好的策略是在夜间运行它。网络

  • A lot of libraries to try:
  • Hyperopt
  • Scikit-optimize
  • Spearmint
  • GPyOpt
  • RoBO
  • SMAC3

从广义上讲,不一样的参数会致使三种不一样的结果dom

  • 1.Underfitting(bad)
  • 2.Good fit and generalization(good)
  • 3.Overfitting(bad)

所以咱们须要把想要调整的参数分为两组。第一组是约束模型的参数,第二组与第一组效果相反。ide

  • A parameter in red
  • Increasing it impedes fitting
  • Increase it to reduce overfitting
  • Decrease to allow model fit easier
  • A parameter in green
  • Increasing it leads to a batter fit(overfit) on train set
  • Increase it, if model underfits
  • Decrease if overfits

上面提到的颜色只是视频中的标记工具

Hyperparameter tuning II

一些基于树模型的超参数优化学习

  • Tree-based models
Model Where
GBDT XGBoost-dmlc/xgboost
LightGBM-Microsoft/LightGBM
CatBoost-catboost/catboost
RandomForest/ExtraTrees scikit-learn
Others RGF-baidu/fast_rgf

GBDT

XGBoost LightGBM
max_depth max_depth/num_leaves
subsample bagging_fraction
colsample_bytree,
colsample_bylevel
frature_fraction
min_child_weight,
lambda,alpha
min_data_in_leaf,
lambda_l1,lambda_l2
eta
num_round
learning_rate
num_iterations
Others:
seed
Others:
*_seed
  • max_depth:
    树越深,越能拟合数据集,但这能够会致使过拟合。根据任务的不一样,最大深度可能会有很大差别,有时是2,有时是27。建议max_depth大约从7开始,直到未过拟合的最大深度。须要注意的是深度增长,学习时间就更长。
  • num_leaves:
    在LightGBM中,能够控制叶的数量,而不是最大深度。由于树能够很深,但若是叶子数量少就不会致使过拟合。
  • subsample、bagging_fraction:
    这个参数能够控制每次喂给模型的数据量,取值在0,1之间。每次喂给它一小部分数据,可让它不那么过拟合,而且能够获得更好的泛化效果,可是模型的训练会更慢。这有点像正则化的做用。
  • colsample_bytree、colsample_bylevel:
    这个参数能够控制subsample中的分裂点。若是模型过拟合,能够尝试下降这些值。
  • min_child_weight,lambda,alpha:
    正则化参数。
  • min_child_weight:
    经验中,这是最重要的参数。增长它可让模型更保守,减小它会让模型有更少约束。根据不一样的任务,我发现最佳值为0,5,15,300,因此不要犹豫,尝试各类值,这取决于数据。
  • eta、num_round:eta本质上是一种学习权重,就像梯度降低同样。num_round是咱们想要执行的学习步数,换句话说,是咱们想要建多少棵树。每次迭代都会构建一个新树,以学习率eta添加到模型中。
  • 当咱们找到合适的轮数时,能够作一个一般会提升分数的技巧。咱们将num_round乘以α,将eta除以α,模型一般会变得更好。可能应用的参数也须要调整,但一般能够保留原样。

Other

  • seed:
    通常状况下随机种子对于模型影响不大。但若是随机种子对你的影响很是大时,建议你能够屡次提交,或者根据随机性调整你的验证方案。

sklearn.RandomForest/ExtraTrees

  • n_estimators:
    RandomForest构建每棵树是独立于其余树的,这意味这拥有大量树的模型不会致使过拟合,这于Gradient Boosting相反。咱们一般首先将n_estimators设置为很是小的数字,例如10,并看看这将花费多少时间,若是不太长,就把它设为一个比较大的值,例如300。
  • max_deep:
    控制树的深度,于XGBoost不一样,它能够被设置为None,这对应于无限深度。当数据集中的特征具备重复值和重要交互时,它实际上很是有用。在其余状况下,无约束深度的模型将当即过拟合。建议随机森林的深度从7左右开始。一般随机深林的最佳深度高于Gradient Boosting,全部不要犹豫尝试10,20或更高的值。
  • max_feature:
    与XGBoost中的参数相同。
  • min_samples_leaf:
    是一个相似正则化的参数,与XGBoost的min_child_weight和LightGBM的min_data_leaf相同。

Other

  • criterion:
    根据个人经验,Gini更常见,但有时Entropy更好。
  • random_state:
    随机种子参数
  • n_jobs:设置拥有多个核心数。默认状况下sklearn的RandomForest因为某种缘由仅使用一个核心。

Hyperparameter tuning III

  • Neural nets
  • Pytorch, Tensorflow, Keras...
  • Linear models
  • SVM, logistic regression
  • Vowpal Wabbit, FTRL

Neural Nets

这里讨论的是dense neural nets,即只含有全链接层的网络

自适应算法已高亮+斜体显示

  • Number of neurons per layer
  • Number of layers
  • Optimizers
  • SGD + momentum
  • Adam/Adadelta/Adagrade/..
    • In pratice lead to more overfitting
  • Batch size
  • Learning rate
  • Regularization
  • L2/L1 for weights
  • Dropout/Dropconnect
  • Static Dropconect

  • 建议从简单的开始,好比1层或2层,调试代码,确保训练时loss降低
  • 而后尝试找到一个可以过拟合的配置,以后在网络中调整一些东西
  • 神经网络的关键部分之一是优化方法
  • 自适应优化方法的确可让你更快的拟合数据,但根据个人经验,这也会致使严重的过拟合。普通的SGD收敛速度较慢,可是训练好的模型一般会有更好的泛化效果。Adaptive methods are useful,but in the settings others in classification and regression.
  • Batch Size:事实证实批量过大会致使更多的过拟合。凭经验,batch_size为500就能够认为很大。建议选择32或64左右的值,若是网络仍然过拟合,请尝试减小batch_size,反之增长它。batch_size也不该该过小,不然梯度可能会有太多噪声。在调整batch_size后,必要时,应该去调整其余网络数量。
  • 学习率:学习率不能过高也不能过低。所以,最佳学习率取决于其余参数。一般从一个大的学习率开始,好比0.1,而后逐步去减少它。有一条经验法则,若是你将batch_size增长alpha倍,你也能够提升学习率alpha倍。
  • 早期,人们大多使用L2和L1正则化。现在大多数人都使用dropout正则化。对我来讲,就是在数层以后当即将dropout做为第一层。
  • static dropconnect:一般咱们有一个密集链接的输入层,好比128个单位。咱们将改成一个很是巨大的隐藏层,好比4096个单位,对于通常的比赛来讲,这是一个巨大的网络,它会严重过拟合。如今为了规范它,咱们将对这一层随机dropout 99%,这是很是强的正则化,实践证实这是能够的。
    dropconnect.png

Linear models

  • Scikit-learn
  • SVC/SVR
    • Sklearn wraps libLinear and libSVM
    • Compile yourself for multicore support
  • LogisticRegression/LinearRegression + regularizers
  • SGDClassifier/SGDRegressor

  • Vowpal Wabbit
  • FTRL

  • SVM几乎不须要调参,这是最大的益处
  • 最新版的libLinearlibSVM支持多核处理,但Sklearn中的不支持多核处理。因此咱们须要动手变异这些库以使用此选项。
  • 几乎没有人使用kernel SVC,因此这里只讨论SVM
  • 对于不适合在内存中操做的数据,咱们可使用Vowpal Wabbit,它以在线的方式实现线性模型的学习。它只能直接从硬盘驱动器中逐行读取数据,永远不会将整个数据集加载到内存中。所以,容许学习很是庞大的数据集。
  • 线性模型的在线学习方法(FTRL)在前段时间特别受欢迎,他是Vowpal Wabbit中的实现。

Linear models

  • Regularization parameter(X,alpha,lambda,..)
  • Start with very small value and increase it.
  • SVC starts to work sklowe as C increase
  • Regularization type
  • L1/L2/L1+L2 --try each
  • L1 can be used for feature selection

  • C:对于SVM,我一般会从一个很是小的值开始,好比$10^{-6}$,每次乘以10。从小的值开始,是由于参数C越大,训练时间越长。
  • 选择L1仍是L2?答案是尝试二者,在我看来,它们很是相识。而且L1还有一个好处,能够给咱们提供一个稀疏权重,这能够用于特征选择。

Tips

  • Don't spend too much time tuning hyperparameters
  • Only if you don't have any more ideas or you have spare computational resources

  • Be patient
  • It can take thousands of rounds for GBDT or neural nets to fit.

  • Average everything
  • Over random seed
  • Or over small deviations from optimal parameters
    • e.g.average max_depth=4,5,6for an optimal 5

相关连接

相关文章
相关标签/搜索