xgboost初識

XGBoost使用

原始數據

數據介紹

鳶尾花數據集是由杰出的統計學家R.A.Fisher在20世紀30年代中期創建的,它被公認為用于數據挖掘的最著名的數據集。它包含3種植物種類(Iris setosa、Irisversicolor和Iris virginica),每種各有50個樣本。

數據下載地址

鏈接:https://pan.baidu.com/s/1hrG8Yn6 密碼:pzgn

XGBoost的特性及使用

XGBoost特性

  1. 正則化
    • 標準GBM的實現沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。
    • 實際上,XGBoost以“正則化提升(regularized boosting)”技術而聞名。
  2. 并行處理
    • XGBoost可以實現并行處理,相比GBM有了速度的飛躍。
    • 不過,眾所周知,Boosting算法是順序處理的,它怎么可能并行呢?每一課樹的構造都依賴于前一棵樹,那具體是什么讓我們能用多核處理器去構造一個樹呢?我希望你理解了這句話的意思。如果你希望了解更多,點擊這個鏈接。
    • XGBoost 也支持Hadoop實現。
  3. 高度的靈活性
    • XGBoost 允許用戶定義自定義優化目標和評價標準
    • 它對模型增加了一個全新的維度,所以我們的處理不會受到任何限制。
  4. 缺失值處理
    • XGBoost內置處理缺失值的規則。
    • 用戶需要提供一個和其它樣本不同的值,然后把它作為一個參數傳進去,以此來作為缺失值的取值。XGBoost在不同節點遇到缺失值時采用不同的處理方法,并且會學習未來遇到缺失值時的處理方法。
  5. 剪枝
    • 當分裂時遇到一個負損失時,GBM會停止分裂。因此GBM實際上是一個貪心算法
    • XGBoost會一直分裂到指定的最大深度(max_depth),然后回過頭來剪枝。如果某個節點之后不再有正值,它會去除這個分裂。
    • 這種做法的優點,當一個負損失(如-2)后面有個正損失(如+10)的時候,就顯現出來了。GBM會在-2處停下來,因為它遇到了一個負值。但是XGBoost會繼續分裂,然后發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。
  6. 內置交叉驗證
    • XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。
    • 而GBM使用網格搜索,只能檢測有限個值。
  7. 在已有的模型基礎上繼續
    • XGBoost可以在上一輪的結果上繼續訓練。這個特性在某些特定的應用上是一個巨大的優勢。
    • sklearn中的GBM的實現也有這個功能,兩種算法在這一點上是一致的。

XGBoost參數

XGBoost的作者把所有的參數分成了三類:

  • 通用參數:宏觀函數控制。
  • Booster參數:控制每一步的booster(tree/regression)
  • 學習目標參數:控制訓練目標的表現
通用參數
  • booster[默認gbtree]

    選擇每次迭代的模型,有兩種選擇:

    • gbtree:基于樹的模型
    • gbliner:線性模型
  • silent[默認0]

    • 當這個參數值為1時,靜默模式開啟,不會輸出任何信息。
    • 一般這個參數就保持默認的0,因為這樣能幫我們更好地理解模型。
  • nthread[默認值為最大可能的線程數]

    • 這個參數用來進行多線程控制,應當輸入系統的核數。
    • 如果你希望使用CPU全部的核,那就不要輸入這個參數,算法會自動檢測它。
    • 還有兩個參數,XGBoost會自動設置,目前你不用管它。接下來咱們一起看booster參數。
booster參數

盡管有兩種booster可供選擇,我這里只介紹tree booster,因為它的表現遠遠勝過linear booster,所以linear booster很少用到。

  • eta[默認0.3]
    • 和GBM中的 learning rate 參數類似。
    • 通過減少每一步的權重,可以提高模型的魯棒性。
    • 典型值為0.01-0.2。
  • min_child_weight[默認1]
    • 決定最小葉子節點樣本權重和。
    • 和GBM的 min_child_leaf 參數類似,但不完全一樣。XGBoost的這個參數是最小樣本權重的和,而GBM參數是最小樣本總數。
    • 這個參數用于避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。
    • 但是如果這個值過高,會導致欠擬合。這個參數需要使用CV來調整。
  • max_depth[默認6]
    • 和GBM中的參數相同,這個值為樹的最大深度。
    • 這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更局部的樣本。
    • 需要使用CV函數來進行調優。
    • 典型值:3-10
  • max_leaf_nodes
    • 樹上最大的節點或葉子的數量。
    • 可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n2個葉子。
    • 如果定義了這個參數,GBM會忽略max_depth參數。
  • gamma[默認0]
    • 在節點分裂時,只有分裂后損失函數的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函數下降值。
    • 這個參數的值越大,算法越保守。這個參數的值和損失函數息息相關,所以是需要調整的。
  • max_delta_step[默認0]
    • 這參數限制每棵樹權重改變的最大步長。如果這個參數的值為0,那就意味著沒有約束。如果它被賦予了某個正值,那么它會讓這個算法更加保守。
    • 通常,這個參數不需要設置。但是當各類別的樣本十分不平衡時,它對邏輯回歸是很有幫助的。
    • 這個參數一般用不到,但是你可以挖掘出來它更多的用處。
  • subsample[默認1]
    • 和GBM中的subsample參數一模一樣。這個參數控制對于每棵樹,隨機采樣的比例。
    • 減小這個參數的值,算法會更加保守,避免過擬合。但是,如果這個值設置得過小,它可能會導致欠擬合。
    • 典型值:0.5-1
  • colsample_bytree[默認1]
    • 和GBM里面的max_features參數類似。用來控制每棵隨機采樣的列數的占比(每一列是一個特征)。
    • 典型值:0.5-1
  • colsample_bylevel[默認1]
    • 用來控制樹的每一級的每一次分裂,對列數的采樣的占比。
    • 我個人一般不太用這個參數,因為subsample參數和colsample_bytree參數可以起到相同的作用。但是如果感興趣,可以挖掘這個參數更多的用處。
  • lambda[默認1]
    • 權重的L2正則化項。(和Ridge regression類似)。
    • 這個參數是用來控制XGBoost的正則化部分的。雖然大部分數據科學家很少用到這個參數,但是這個參數在減少過擬合上還是可以挖掘出更多用處的。
  • alpha[默認1]
    • 權重的L1正則化項。(和Lasso regression類似)。
    • 可以應用在很高維度的情況下,使得算法的速度更快。
  • scale_pos_weight[默認1]
    • 在各類別樣本十分不平衡時,把這個參數設定為一個正值,可以使算法更快收斂。
學習目標參數

這個參數用來控制理想的優化目標和每一步結果的度量方法。

  • objective[默認reg:linear]

    這個參數定義需要被最小化的損失函數。最常用的值有:

    • binary:logistic 二分類的邏輯回歸,返回預測的概率(不是類別)。
    • multi:softmax 使用softmax的多分類器,返回預測的類別(不是概率)。 在這種情況下,你還需要多設一個參數:num_class(類別數目)。
    • multi:softprob 和multi:softmax參數一樣,但是返回的是每個數據屬于各個類別的概率。
  • eval_metric[默認值取決于objective參數的取值]

    • 對于有效數據的度量方法。
    • 對于回歸問題,默認值是rmse,對于分類問題,默認值是error。
  • 典型值有:

    • rmse 均方根誤差(∑Ni=1?2N??????√)
    • mae 平均絕對誤差(∑Ni=1|?|N)
    • logloss 負對數似然函數值
    • error 二分類錯誤率(閾值為0.5)
    • merror 多分類錯誤率
    • mlogloss 多分類logloss損失函數
    • auc 曲線下面積
  • seed(默認0)

    • 隨機數的種子
    • 設置它可以復現隨機數據的結果,也可以用于調整參數

如果你之前用的是Scikit-learn,你可能不太熟悉這些參數。但是有個好消息,python的XGBoost模塊有一個sklearn包,XGBClassifier。這個包中的參數是按sklearn風格命名的。會改變的函數名是:

  1. eta ->learning_rate
  2. lambda->reg_lambda
  3. alpha->reg_alpha

實驗過程

環境配置
  1. 前往https://www.lfd.uci.edu/~gohlke/pythonlibs/#pip,下載xgboost的whl文件。cp35代表適用與python3.5的環境。
  1. 將下載的whl文件通過pip命令安裝
xg.png
實驗過程
  • 引入相關包

    # -*- coding:utf-8 -*-
    import xgboost as xgb
    import numpy as np
    from sklearn.model_selection import train_test_split
    import matplotlib.pyplot as plt
    from sklearn.metrics import accuracy_score
    
  • 讀取文件

    通過numpy讀取文件

    data = np.loadtxt('iris.data.txt', dtype=float, delimiter=',', converters={4: iris_type})
    x, y = np.split(data, [4], axis=1)
    

    ?

  • 劃分測試集和訓練集

    # 拆分成訓練集與測試集
    x_train, x_test, y_train, y_test = train_test_split(x, y,  random_state=1)
    
  • 設置參數并訓練

    #設置參數
    param = {'max_depth': max_depth,
                 'eta': eta,
                 'silent': 1,
                 'objective': 'multi:softmax',
                 'num_class': num_class}
    
    num_round = round
    # 訓練模型
    bsg = xgb.train(param, train, num_round, evals=watch_list)
    
  • 預測準確率并作圖

    # 預測模型
    y_hat = bsg.predict(test)
    # 計算誤差
    #result = y_test.reshape(1, -1) == y_hat
    #true = float(np.sum(result)) / len(y_hat)
    return accuracy_score(y_test, y_hat)
    
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容