Press "Enter" to skip to content

Learn from Top Kagglers:高级调参技巧

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

 

阅读原文,获取jupyter notebook文件。

 

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 lecture

 

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:models

 

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)

 

1.无论如何,我们从来没有时间调整所有的参数,所以我们需要提出一个很好的子集来调整。假设我们是xgboost新手,不知道哪些参数是需要调的,可以在Github或Kaggle Kernels搜索到前人通常设置的参数。

 

2.理解改变其中一个参数会发生什幺。

 

3.大多数人手动完成调参工作。也可以使用超参数优化工具,但手动执行通常会更快。

 

Hyperparameter optimization software自动调参工具

 

运行调参工具可能需要很长时间,因此最好的策略是在夜间运行它。

 

A lot of libraries to try:

 

Hyperopt

 

Scikit-optimize

 

Spearmint

 

GPyOpt

 

RoBO

 

SMAC3

 

从广义上讲,不同的参数会导致三种不同的结果

 

1.Underfitting(bad)

 

2.Good fit and generalization(good)

 

3.Overfitting(bad)

 

因此我们需要把想要调整的参数分为两组。第一组是约束模型的参数,第二组与第一组效果相反。

 

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

 

 

ModelWhere
GBDTXGBoost-dmlc/xgboost
LightGBM-Microsoft/LightGBM
CatBoost-catboost/catboost
RandomForest/ExtraTreesscikit-learn
OthersRGF-baidu/fast_rgf

 

GBDT

 

 

XGBoostLightGBM
max_depthmax_depth/num_leaves
subsamplebagging_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添加到模型中。

Other

 

seed:

一般情况下随机种子对于模型影响不大。但如果随机种子对你的影响非常大时,建议你可以多次提交,或者根据随机性调整你的验证方案。

 

当我们找到合适的轮数时,可以做一个通常会提高分数的技巧。我们将num_round乘以α,将eta除以α,模型通常会变得更好。可能应用的参数也需要调整,但通常可以保留原样。

 

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

 

In pratice lead to more overfitting

 

SGD + momentum

 

Adam/Adadelta/Adagrade/..

 

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%,这是非常强的正则化,实践证明这是可以的。

 

Linear models

 

Scikit-learn

 

Sklearn wraps libLinear and libSVM

 

Compile yourself for multicore support

 

SVC/SVR

 

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。从小的值开始,是因为参数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

 

e.g.average max_depth=4,5,6for an optimal 5

 

Over random seed

 

Or over small deviations from optimal parameters

 

相关链接

 

调整估计器的超参数(sklearn)

http://scikit-learn.org/stable/modules/grid_search.html

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注