具有貝葉斯優化的XGBoost和隨機森林

原文鏈接:https://www.kdnuggets.com/2019/07/xgboost-random-forest-bayesian-optimisation.html

作者 | Edwin Lisowski
編譯 | CDA數據分析師

在這篇文章中,我們將介紹帶有貝葉斯優化算法的兩種流行的算法即XGBoost和隨機森林,並指出這些算法的優缺點。XGBoost(XGB)和隨機森林(RF)都是集成學習方法,並通過組合各個決策樹的輸出(我們假設基於樹的XGB或RF)來預測(分類或迴歸)。

讓我們深入比較一下 - XGBoost與Random Forest

XGBoost或Gradient Boosting

XGBoost每次構建一個決策樹,每一個新的樹都修正以前訓練過的決策樹所產生的錯誤。

XGBoost應用程序的示例

在Addepto,我們使用XGBoost模型來解決異常檢測問題,例如在監督學習方法中。在這種情況下,XGB非常有用,因爲數據集通常非常不平衡。此類數據集的示例是移動應用中的用戶/消費者交易,能量消耗或用戶行爲。

優點

由於通過優化目標函數導出了增強樹,基本上XGB可以用來解決幾乎所有可以寫出漸變的目標函數。這包括排名和泊松迴歸等內容,RF難以實現。

缺點

如果數據有噪聲,XGB模型對過度擬合更敏感。由於樹木是按順序建造的,因此培訓通常需要更長時間。GBM比RF更難調整。通常有三個參數:樹的數量,樹的深度和學習率,並且構建的每個樹通常是淺的。

隨機森林

隨機森林(RF)使用隨機數據樣本獨立訓練每棵樹。這種隨機性有助於使模型比單個決策樹更健壯。由於RF不太可能過度擬合訓練數據。

隨機森林應用示例

隨機森林差異性已被用於各種應用,例如,基於組織標記數據找到患者羣。在以下兩種情況下,隨機森林模型對於這種應用非常有吸引力:

我們的目標是爲具有強相關特徵的高維問題提供高預測精度。

我們的數據集非常嘈雜,並且包含許多缺失值,例如,某些屬性是分類或半連續的。

優點

隨機森林中的模型調整比XGBoost更容易。在RF中,我們有兩個主要參數:每個節點要選擇的特徵數量和決策樹的數量。RF比XGB更難裝配。

缺點

隨機森林算法的主要限制是大量的樹可以使算法對實時預測變慢。對於包含具有不同級別數的分類變量的數據,隨機森林偏向於具有更多級別的那些屬性。

貝葉斯優化是一種優化功能的技術,其評估成本很高。它建立目標函數的後驗分佈,並使用高斯過程迴歸計算該分佈中的不確定性,然後使用獲取函數來決定採樣的位置。貝葉斯優化專注於解決問題:

max f(x)(x∈A)

超參數的尺寸(x∈Rd)經常在最成功的應用d <20。

通常設置甲IA超矩形(*x∈R d:*ai ≤ xi ≤ bi)。目標函數是連續的,這是使用高斯過程迴歸建模所需的。它也缺乏像凹面或線性這樣的特殊結構,這使得利用這種結構來提高效率的技術徒勞無功。貝葉斯優化由兩個主要組成部分組成:用於對目標函數建模的貝葉斯統計模型和用於決定下一步採樣的採集函數。

據初始空間填充實驗設計評估目標後,它們被迭代地用於分配N個評估的預算的剩餘部分,如下所示:

  1. 觀察初始點

  2. 當n≤N時執行,使用所有可用的數據更新後驗概率分佈

    設Xn是採集功能的最大化

    觀察yn= f(xn)

  3. 返回一個解決方案:用最大的評估點

我們可以說貝葉斯優化是爲黑盒無導數全局優化而設計來總結這個問題。它在機器學習中調整超參數非常受歡迎。

下面是整個優化的圖形摘要:具有後驗分佈的高斯過程、觀察和置信區間以及效用函數,其中最大值表示下一個樣本點。

由於效用函數,貝葉斯優化在調整機器學習算法的參數方面比網格或隨機搜索技術更有效。它可以有效地平衡“探索”和“利用”,找到全局最優。

爲了呈現貝葉斯優化,我們使用用Python編寫的BayesianOptimization庫來調整隨機森林和XGBoost分類算法的超參數。我們需要通過pip安裝它:

pip install bayesian-optimization

現在讓我們訓練我們的模型。首先我們導入所需的庫:

#Import libraries
import pandas as pd
import numpy as np
from bayes_opt import BayesianOptimization
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

我們定義了一個函數來運行貝葉斯優化給定數據,優化函數及其超參數:

#Bayesian optimization
def bayesian_optimization(dataset, function, parameters):
   X_train, y_train, X_test, y_test = dataset
   n_iterations = 5
   gp_params = {"alpha": 1e-4}

   BO = BayesianOptimization(function, parameters)
   BO.maximize(n_iter=n_iterations, **gp_params)

   return BO.max

我們定義了優化函數,即隨機森林分類器及其超參數n_estimators,max_depth和min_samples_split。另外,我們使用給定數據集上的交叉驗證分數的平均值:

def rfc_optimization(cv_splits):
    def function(n_estimators, max_depth, min_samples_split):
        return cross_val_score(
               RandomForestClassifier(
                   n_estimators=int(max(n_estimators,0)),                                                               
                   max_depth=int(max(max_depth,1)),
                   min_samples_split=int(max(min_samples_split,2)), 
                   n_jobs=-1, 
                   random_state=42,   
                   class_weight="balanced"),  
               X=X_train, 
               y=y_train, 
               cv=cv_splits,
               scoring="roc_auc",
               n_jobs=-1).mean()

    parameters = {"n_estimators": (10, 1000),
                  "max_depth": (1, 150),
                  "min_samples_split": (2, 10)}
    
    return function, parameters

類似地,我們爲XGBoost分類器定義函數和超參數:

def xgb_optimization(cv_splits, eval_set):
    def function(eta, gamma, max_depth):
            return cross_val_score(
                   xgb.XGBClassifier(
                       objective="binary:logistic",
                       learning_rate=max(eta, 0),
                       gamma=max(gamma, 0),
                       max_depth=int(max_depth),                                               
                       seed=42,
                       nthread=-1,
                       scale_pos_weight = len(y_train[y_train == 0])/
                                          len(y_train[y_train == 1])),  
                   X=X_train, 
                   y=y_train, 
                   cv=cv_splits,
                   scoring="roc_auc",
                   fit_params={
                        "early_stopping_rounds": 10, 
                        "eval_metric": "auc", 
                        "eval_set": eval_set},
                   n_jobs=-1).mean()

    parameters = {"eta": (0.001, 0.4),
                  "gamma": (0, 20),
                  "max_depth": (1, 2000)}
    
    return function, parameters

現在基於選擇的分類器,我們可以優化它並訓練模型:

#Train model
def train(X_train, y_train, X_test, y_test, function, parameters):
    dataset = (X_train, y_train, X_test, y_test)
    cv_splits = 4
    
    best_solution = bayesian_optimization(dataset, function, parameters)      
    params = best_solution["params"]

    model = RandomForestClassifier(
             n_estimators=int(max(params["n_estimators"], 0)),
             max_depth=int(max(params["max_depth"], 1)),
             min_samples_split=int(max(params["min_samples_split"], 2)), 
             n_jobs=-1, 
             random_state=42,   
             class_weight="balanced")

    model.fit(X_train, y_train)
    
    return model

我們使用AdventureWorksDW2017 SQL Server數據庫的視圖[dbo].[vTargetMail]作爲示例數據,我們可以依據個人數據預測人們是否購買自行車。作爲貝葉斯優化的結果,我們提取出了連續樣本:

ITER AUC MAX_DEPTH min_samples_split n_estimators
1 0.8549 45.88 6.099 34.82
2 0.8606 15.85 2.217 114.3
3 0.8612 47.42 8.694 306.0
4 0.8416 10.09 5.987 563.0
5 0.7188 4.538 7.332 766.7
6 0.8436 100.0 2.0 448.6
7 0.6529 1.012 2.213 315.6
8 0.8621 100.0 10.0 1E + 03
9 0.8431 100.0 2.0 154.1
10 0.653 1.0 2.0 1E + 03
11 0.8621 100.0 10.0 668.3
12 0.8437 100.0 2.0 867.3
13 0.637 1.0 10.0 10.0
14 0.8518 100.0 10.0 10.0
15 0.8435 100.0 2.0 317.6
16 0.8621 100.0 10.0 559.7
17 0.8612 89.86 10.0 82.96
18 0.8616 49.89 10.0 212.0
19 0.8622 100.0 10.0 771.7
20 0.8622 38.33 10.0 469.2
21 0.8621 39.43 10.0 638.6
22 0.8622 83.73 10.0 384.9
23 0.8621 100.0 10.0 936.1
24 0.8428 54.2 2.259 122.4
25 0.8617 99.62 9.856 254.8

我們可以看到貝葉斯優化在第23步中找到了最佳參數,在測試數據集上得出0.8622 AUC分數。如果要檢查更多樣品,這個結果可能會更高。我們優化的隨機森林模型具有以下ROC AUC曲線:

我們提出了一種使用貝葉斯優化在機器學習中調整超參數的簡單方法,貝葉斯優化是一種更快的方法,可以找到最優值,而且比網格或隨機搜索方法更先進。

搜索···進入···解鎖更多優質內容和精彩資訊,不要錯過喲!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章