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
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新增到模型中。
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
andlibSVM
-
Compile yourself for multicore support
-
SVC/SVR
-
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。從小的值開始,是因為引數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
-
Python中梯度提升(GBM)中引數調整的完整指南
https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/
長按識別二維碼
獲取更多AI資訊
