# 模型建置
###### tags: `Machine Learning` `LightGBM`
## CatBoost、LightGBM、XGBoost

XGBoost(通常被稱為GBM殺手)
LightGBM使用一種全新的基於梯度的單側取樣(GOSS)技術來過濾資料例項,以尋找分割值。而XGBoost則是使用預分類演算法(presorted algorithm)和基於直方圖的演算法來計算最佳分割。這裡,例項意味著觀察值/樣本。
預分類的分割
- 對於每個節點,列舉所有的特徵
- 對於每個特徵,按特徵值對例項進行分類
- 使用線性掃描根據該特徵基礎資訊增益的程度確定最佳分割
- 以最佳的分割解決方案來處理所有的特徵
基於直方圖的演算法將一個特徵的所有資料點分割到離散的容器中,並使用這些容器來尋找直方圖的分割值。儘管它在訓練速度方面比預分類演算法效率高,因為預分類演算法列舉了預分類特徵值所有可能的分割點的,但它在速度方面仍然落後於GOSS。
### Goss 快速的原因
在AdaBoost中,樣本權重可以作為樣本重要性的一個很好的指標。然而,在梯度提升決策樹(GBDT)中沒有原始的樣本權重,因此針對AdaBoost的取樣方法不能直接應用到其中。這裡就需要基於梯度的取樣。
梯度代表了損失函式的切線斜率。所以從邏輯上說,如果資料點的梯度在某種意義上是很大的,那麼這些點對於找到最優的分割點來說是很重要的,因為它們有更高的誤差。
GOSS保留所有具有大梯度的例項,並在具有小梯度的例項上執行隨機取樣。例如,假設我有50萬行資料,1萬行有更高的梯度。所以我的演算法會選擇(更高梯度的1萬行 剩餘49萬行隨機選擇的x%)。假設x是10%,那麼在發現的分割值的基礎上,選擇的全部行數是50萬中的5萬9千。
這裡的基本假設是,具有小梯度訓練例項的樣本訓練誤差較小,並且已經訓練得很好。
為了保持相同的資料分佈,當計算資訊增益時,GOSS為小梯度的資料例項引入了一個常數乘數。因此,GOSS在減少資料例項的數量和保持學習決策樹的精確性之間取得了良好的平衡。
:::info
個人理解 : 針對梯度較大的點給他較大的權重,因為較大的梯度有更高的誤差,利於我們找到最優的分割點,較小的梯度則隨機抽取一定的百分比,計算時會更加快速,缺點容易過度擬合。
:::
### LightGBM API
classlightgbm.LGBMClassifier(boosting_type='gbdt',num_leaves=31, max_depth=-1, learning_rate=0.1, n_estimators=100, subsample_for_bin=200000, objective=None, class_weight=None, min_split_gain=0.0, min_child_weight=0.001, min_child_samples=20, subsample=1.0, subsample_freq=0, colsample_bytree=1.0, reg_alpha=0.0, reg_lambda=0.0, random_state=None, n_jobs=-1, silent=True, importance_type='split', **kwargs)
boosting_type = 'gbdt' :梯度提升樹, 'dart' : 丟樹, 'goss' : 單邊梯度採樣,'rf' : 隨機森林
### Anaconda 環境
- pip install jupyter
- pip install pip --upgrade
* 基本套件
```bash
pip install pandas matplotlib seaborn numpy scipy
```
* 機器學習套件
```bash
pip install tensorflow sklearn xgboost==0.90
```
* 其它套件
```bash
pip install pillow graphviz
pip install mlxtend
pip install numexpr
conda install -y shapely
pip install imgaug opencv-python==3.4.7.28
pip install jupyterlab
## 參考資料:
[多模型介紹 XGBoost, LGBM, catboost](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/510420/)
[LGBM介紹](https://kknews.cc/zh-tw/tech/y3a3x8j.html)
[樹模型介紹](https://www.itread01.com/content/1545255739.html)
[LightGBM API](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html)
[LightGBM API_2](https://github.com/microsoft/LightGBM/blob/master/docs/Parameters.rst)
[XGBoost API](https://xgboost.readthedocs.io/en/latest/python/python_api.html)
[貝氏優化](http://codewithzhangyi.com/2018/07/31/Auto%20Hyperparameter%20Tuning%20-%20Bayesian%20Optimization/)
[自動化超參數調整](https://medium.com/@jacky308082/%E8%87%AA%E5%8B%95%E5%8C%96%E8%AA%BF%E6%95%B4%E8%B6%85%E5%8F%83%E6%95%B8%E6%96%B9%E6%B3%95%E4%BB%8B%E7%B4%B9-%E4%BD%BF%E7%94%A8python-40edb9f0b462)
[梯度下降簡介](https://medium.com/@arlen.mg.lu/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E8%AC%9B%E4%B8%AD%E6%96%87-gradient-descent-b2a658815c72)
[梯度下降簡介1](https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%BA%8C-%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95-gradient-descent-406e1fd001f)
[正規化回歸 L1, L2](https://www.jamleecute.com/regularized-regression-ridge-lasso-elastic/)
[模型原理](https://www.itread01.com/content/1543163043.html)
[LightGBM](https://lightgbm.apachecn.org/#/docs/1)
[Bagging & Boosting](https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-ensemble-learning%E4%B9%8Bbagging-boosting%E5%92%8Cadaboost-af031229ebc3)
[模型驗證標準介紹](https://www.ycc.idv.tw/confusion-matrix.html)
[機器學習中樣本比例不平衡的處理方法](https://kknews.cc/zh-tw/code/8xr49oq.html)