高級調參技巧

如下是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

相關連接

相關文章
相關標籤/搜索