高級調參技巧


以下是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%,這是非常強的正則化,實踐證明這是可以的。
    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

相關鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM