以下是Coursera上的How to Win a Data Science Competition: Learn from Top Kagglers課程筆記。
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
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%,這是非常強的正則化,實踐證明這是可以的。
Linear models
-
Scikit-learn
-
SVC/SVR
- Sklearn wraps
libLinear
andlibSVM
- Compile yourself for multicore support
- Sklearn wraps
-
LogisticRegression/LinearRegression + regularizers
-
SGDClassifier/SGDRegressor
-
Vowpal Wabbit
-
FTRL
-
SVM幾乎不需要調參,這是最大的益處
-
最新版的
libLinear
和libSVM
支持多核處理,但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