機器學習-整合學習LightGBM

2023-02-21 12:02:12

前言

LightGBM 是微軟開發的一個強大的開源梯度提升框架。它旨在高效和可延伸,能夠處理大型資料集和高維特徵。LightGBM結合使用基於梯度的單邊取樣(GOSS)和獨佔特徵捆綁(EFB)來降低計算成本並提高模型的準確性。

LightGBM 支援各種目標函數,可用於迴歸和分類問題。它還提供了一些高階功能,例如提前停止、交叉驗證和超引數調整,以幫助使用者構建穩健的模型。此外,它還為流行的程式語言(如 Python、R 和 C++)提供介面,使其易於整合到現有的資料科學工作流程中。

總體而言,LightGBM 是構建高效能梯度提升模型的熱門選擇,尤其是對於大規模和高維資料集。

介紹LightGBM

LightGBM的背景和起源

  • LightGBM是一個開源的梯度提升框架,由微軟公司在2017年推出。它旨在提供一個高效、可延伸、準確和易於使用的機器學習工具,可以處理大規模資料和高維特徵,適用於迴歸、分類和排序等各種任務。

  • LightGBM的起源可以追溯到GBDT(梯度提升決策樹)演演算法,它是一種基於決策樹的機器學習方法,通過遞迴地訓練一系列的決策樹來構建一個強大的預測模型。GBDT已經被廣泛應用於各種領域,例如推薦系統、廣告和金融等。然而,GBDT演演算法仍然存在一些限制,例如對於高維資料和大規模資料集的處理效率不高。

  • 為了解決這些問題,LightGBM引入了一些創新性的技術,如基於梯度的單側取樣(GOSS)和獨佔特徵繫結(EFB)等,以提高訓練速度和準確性。此外,LightGBM還支援並行化處理、GPU加速、多種損失函數和多種分類器等功能,使其在大規模資料和高維特徵的處理中表現出色。這些優勢使得LightGBM在學術界和工業界都得到廣泛的應用和認可。

LightGBM的優點和適用場景

  • 高效性:LightGBM引入了基於梯度的單側取樣(GOSS)和獨佔特徵繫結(EFB)等創新性技術,提高了模型的訓練速度和準確性。它也支援多執行緒和GPU加速,進一步提高了處理效率。
  • 可延伸性:LightGBM能夠處理大規模資料和高維度特徵,並且支援分散式計算,可在多個計算節點上並行訓練模型。
  • 準確性:LightGBM在處理高維度資料和非線性問題時表現出色,通常可以獲得比其他梯度提升框架更好的預測結果。
  • 可解釋性:LightGBM支援特徵重要性評估和視覺化,能夠幫助使用者理解模型的工作原理和特徵的貢獻。
  • 靈活性:LightGBM支援多種損失函數和分類器,能夠適應各種迴歸、分類和排序任務。

基於上述優點,LightGBM適用於以下場景:

  1. 大規模資料和高維特徵:當資料集規模很大或者特徵維度很高時,LightGBM可以通過並行化和創新性技術,快速地訓練出一個準確的模型。
  2. 非線性問題:LightGBM在處理非線性問題時表現出色,因此它適用於許多需要處理非線性問題的領域,例如金融、電商和醫療等。
  3. 可解釋性需求:LightGBM支援特徵重要性評估和視覺化,能夠幫助使用者理解模型的工作原理和特徵的貢獻,適用於需要理解模型背後邏輯的場景。
  4. 需要快速訓練和預測的場景:LightGBM在處理大規模資料和高維特徵時表現出色,因此適用於需要快速訓練和預測的場景,例如線上廣告和推薦系統等。

LightGBM的基本工作原理

  • 通過迭代地訓練多棵決策樹來構建一個強大的整合模型。
  1. 損失函數:LightGBM支援多種損失函數,例如均方誤差(MSE)、對數損失(Log loss)和L1損失等。使用者可以根據具體問題選擇合適的損失函數。
  2. 初始化:LightGBM將訓練資料隨機分成若干個小批次,每個小批次的大小可以由使用者自定義。對於每個小批次,LightGBM使用一棵單節點的決策樹作為初始模型。
  3. 梯度提升:LightGBM採用梯度提升演演算法,通過迭代地訓練多棵決策樹來不斷提高模型的預測準確性。在每次迭代中,LightGBM根據當前模型的預測結果計算出每個樣本的負梯度,將負梯度作為新的目標變數來訓練下一棵決策樹。這樣,每棵決策樹都是在之前模型的基礎上進行訓練的。
  4. 單側取樣:LightGBM引入了基於梯度的單側取樣(GOSS)技術,通過降低低梯度樣本的取樣率,提高高梯度樣本的取樣率,減少資料集的噪聲,從而加速模型的訓練。
  5. 獨佔特徵繫結:LightGBM還引入了獨佔特徵繫結(EFB)技術,將相似的特徵分成一組,同時只選取一組特徵作為決策樹分裂的依據,減少了分裂的計算量和噪聲,提高了模型的準確性和泛化能力。
  6. 分裂策略:LightGBM採用基於梯度的直方圖分裂演演算法,將特徵值按照梯度的大小劃分為若干個直方圖,選取最優的分裂點來進行分裂,減少了計算量和噪聲,提高了模型的準確性和泛化能力。
  7. 葉子結點優化:LightGBM採用直方圖優化演演算法,將每個葉子結點的樣本按照特徵值的大小劃分為若干個直方圖,計算每個直方圖的梯度和Hessian矩陣,從而快速地確定每
  8. 評估指標:LightGBM支援多種評估指標,例如準確率、AUC、平均絕對誤差(MAE)和均方誤差(MSE)等。使用者可以根據具體問題選擇合適的評估指標。
  9. 提前停止:LightGBM還支援提前停止技術,當模型的效能在驗證集上不再提升時,自動停止模型的訓練,防止模型過擬合。
  10. 並行加速:LightGBM採用並行加速技術,可以利用多執行緒和多機並行加速模型的訓練,提高模型訓練的效率。

安裝和設定LightGBM

安裝LightGBM

htGBM的安裝可以通過多種方式進行,這裡介紹兩種較為常用的方式:使用Anaconda安裝和使用pip安裝。

使用Anaconda安裝:

  1. 首先,需要安裝Anaconda(如果已經安裝,可以跳過此步驟)。在Anaconda官網上下載對應版本的Anaconda安裝程式,安裝過程中可以根據需要選擇新增環境變數、設定路徑等選項。

  2. 開啟Anaconda Prompt,輸入以下命令建立一個新的conda環境(例如,取名為lgb):

    conda create -n lgb python=3.7
    

    其中,python=3.7表示建立Python 3.7的環境,可以根據需要選擇其他版本。

  3. 啟用lgb環境:

    conda activate lgb
    
  4. 安裝LightGBM:

    conda install lightgbm
    

    或者

    pip install lightgbm
    

    安裝完成後,可以使用以下命令驗證LightGBM是否安裝成功:

    python -c "import lightgbm; print(lightgbm.__version__)"
    

    如果輸出了LightGBM的版本號,則說明安裝成功。由於LightGBM是一個C++庫,安裝時還需要安裝C++編譯器和相關的開發工具。

設定LightGBM的環境

為了更好地使用LightGBM,需要設定相應的環境。主要包括以下幾個方面:

  1. 資料格式:LightGBM支援多種資料格式,包括libsvm格式、CSV格式、numpy陣列和Pandas DataFrame等。在使用LightGBM之前,需要確保資料格式正確,並根據具體情況選擇合適的資料格式。
  2. 引數設定:LightGBM有多個引數可以進行調整,例如樹的深度、學習率、葉子結點數目等。在使用LightGBM之前,需要了解這些引數的含義和作用,並根據具體情況進行調整。
  3. 並行加速:LightGBM支援多執行緒和分散式計算,可以大大加快模型的訓練速度。在使用LightGBM之前,需要設定並行加速的相關引數,以充分利用計算資源。
  4. GPU加速:LightGBM還支援使用GPU進行加速,可以進一步提高模型的訓練速度。在使用LightGBM之前,需要設定GPU的相關引數,並確保系統中已經安裝了適當的GPU驅動程式和CUDA工具包。

具體來說,可以按照以下步驟進行LightGBM環境的設定:

  1. 資料格式的設定:根據資料的格式選擇不同的資料讀取函數,例如:

    import pandas as pd
    import numpy as np
    import lightgbm as lgb
    
    # 讀取CSV格式的資料
    data = pd.read_csv('data.csv')
    
    # 將numpy陣列轉換為Dataset格式
    X_train = np.random.rand(100, 10)
    y_train = np.random.rand(100)
    train_data = lgb.Dataset(X_train, label=y_train)
    
  2. 引數設定的設定:使用引數字典進行引數的設定,例如:

    params = {
        'boosting_type': 'gbdt',
        'objective': 'binary',
        'num_leaves': 31,
        'learning_rate': 0.05,
        'feature_fraction': 0.9
    }
    
  3. 並行加速的設定:使用引數控制並行加速的方式和執行緒數,例如:

    params = {
        'num_threads': 4,
        'device': 'cpu'
    }
    
  4. GPU加速的設定:在使用GPU進行加速時,需要安裝相應的GPU驅動程式和CUDA工具包,然後在引數中指定使用GPU和相關的引數,例如:

    params = {
        'device': 'gpu',
        'gpu_platform_id': 0,
        'gpu_device_id': 0
    }
    

設定完成後,就可以使用LightGBM進行模型訓練和預測了。

LightGBM的編譯和安裝

LightGBM是一個開源的機器學習庫,提供了高效的梯度提升決策樹演演算法。在使用LightGBM之前,需要先將其編譯並安裝到系統中。下面介紹一下LightGBM的編譯和安裝過程。

  1. 下載LightGBM原始碼

首先需要從LightGBM的GitHub倉庫中下載原始碼。可以使用以下命令進行下載:

bashCopy code
git clone --recursive https://github.com/microsoft/LightGBM

這裡使用了--recursive選項,可以同時下載LightGBM的子模組。

  1. 安裝依賴項

LightGBM依賴於一些第三方庫,需要先安裝這些依賴項。具體依賴項的安裝方法因作業系統而異,以下是一些常見作業系統的安裝方法:

  • Ubuntu/Debian:

    sudo apt-get install cmake libboost-dev libboost-system-dev libboost-filesystem-dev
    
  • CentOS/Fedora:

    sudo yum install cmake boost-devel
    
  • macOS (使用Homebrew):

    brew install cmake boost
    
  1. 編譯LightGBM

進入LightGBM原始碼目錄,使用以下命令進行編譯:

mkdir build
cd build
cmake ..
make -j4

這裡使用了-j4選項,可以同時編譯4個檔案。編譯完成後,可以在build目錄下找到lightgbm可執行檔案。

  1. 安裝LightGBM

可以使用以下命令將LightGBM安裝到系統中:

sudo make install

這樣,LightGBM就安裝到了系統中。可以使用以下命令檢查LightGBM是否安裝成功:

lightgbm --version

如果輸出了LightGBM的版本號,就說明安裝成功了。

需要注意的是,LightGBM還支援使用GPU進行加速,可以通過設定相關的編譯選項啟用GPU加速。具體方法可以參考LightGBM的官方檔案。

使用LightGBM進行建模

資料準備和特徵工程

  • 資料準備和特徵工程是機器學習中至關重要的一步。LightGBM支援各種資料格式,包括LibSVM格式、CSV格式、numpy陣列等。在資料準備階段,需要將資料集劃分為訓練集、驗證集和測試集,並進行資料淨化和預處理,包括處理缺失值、異常值、離群值、重複值等。在特徵工程階段,需要選擇合適的特徵並進行特徵提取、特徵選擇和特徵變換等操作,以提高模型的預測能力和泛化能力。

構建LightGBM模型

  • 構建LightGBM模型需要確定模型的超引數和目標函數。在LightGBM中,可以通過調整超引數來控制模型的複雜度、速度和準確度等屬性,包括學習率、樹的數量、樹的深度、葉子節點數等。目標函數是LightGBM優化的目標,可以選擇分類任務中的交叉熵、迴歸任務中的平方誤差、排序任務中的NDCG等。LightGBM還支援自定義目標函數。

訓練和調整LightGBM

  • 訓練和調整LightGBM模型需要使用訓練集和驗證集進行模型訓練和評估。在訓練過程中,可以使用交叉驗證等技術來防止過擬合。在調整模型超引數時,可以使用網格搜尋、隨機搜尋、貝葉斯優化等方法來找到最優超引數。LightGBM還提供了一些內建的調參工具,包括GridSearchCV、RandomizedSearchCV等。

應用LightGBM模型進行預測

  • 應用LightGBM模型進行預測需要使用測試集或新的資料集。在預測時,可以使用predict方法得到預測結果,或使用predict_proba方法得到預測概率。在分類任務中,可以使用predict_classes方法將預測概率轉換為類別。在迴歸任務中,可以使用均方誤差、均方根誤差、平均絕對誤差等指標評估模型的預測效能。

程式碼

A. 資料準備和特徵工程

import pandas as pd
import numpy as np

# 載入資料集
data = pd.read_csv('data.csv')

# 劃分資料集為訓練集、驗證集和測試集
train_data = data.loc[:8000, :]
val_data = data.loc[8000:9000, :]
test_data = data.loc[9000:, :]

# 處理缺失值
train_data.fillna(train_data.mean(), inplace=True)
val_data.fillna(train_data.mean(), inplace=True)
test_data.fillna(train_data.mean(), inplace=True)

# 特徵選擇和變換
features = ['age', 'sex', 'income']
train_X = train_data[features]
train_y = train_data['label']
val_X = val_data[features]
val_y = val_data['label']
test_X = test_data[features]
test_y = test_data['label']

B. 構建LightGBM模型

import lightgbm as lgb

# 構建LightGBM模型
params = {
    'objective': 'binary',
    'metric': 'binary_logloss',
    'num_leaves': 31,
    'learning_rate': 0.1
}
lgb_train = lgb.Dataset(train_X, train_y)
lgb_val = lgb.Dataset(val_X, val_y, reference=lgb_train)
model = lgb.train(params, lgb_train, valid_sets=lgb_val, num_boost_round=100)

C. 訓練和調整LightGBM模型

# 使用交叉驗證防止過擬合
cv_results = lgb.cv(params, lgb_train, num_boost_round=100, nfold=5, stratified=False, shuffle=True)

# 調整超引數
from sklearn.model_selection import GridSearchCV
param_grid = {
    'num_leaves': [31, 64, 128],
    'learning_rate': [0.1, 0.01, 0.001]
}
grid_search = GridSearchCV(model, param_grid=param_grid, cv=5)
grid_search.fit(train_X, train_y)

D. 應用LightGBM模型進行預測

# 使用訓練好的LightGBM模型進行預測
y_pred = model.predict(test_X)

# 對概率進行閾值處理,將大於0.5的預測為正類,小於等於0.5的預測為負類
y_pred_binary = np.where(y_pred > 0.5, 1, 0)

# 計算預測效能
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
acc = accuracy_score(test_y, y_pred_binary)
prec = precision_score(test_y, y_pred_binary)
rec = recall_score(test_y, y_pred_binary)
f1 = f1_score(test_y, y_pred_binary)
auc = roc_auc_score(test_y, y_pred)

print('Accuracy:', acc)
print('Precision:', prec)
print('Recall:', rec)
print('F1 score:', f1)
print('ROC AUC score:', auc)

案例研究和應用實踐

A. 基於LightGBM的分類和迴歸模型

  • 二分類任務,乳腺癌資料集

  • import lightgbm as lgb
    from sklearn.datasets import load_breast_cancer
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    
    # 載入資料
    data = load_breast_cancer()
    X, y = data.data, data.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 構建LightGBM模型
    lgb_model = lgb.LGBMClassifier(
        num_leaves=31,
        learning_rate=0.05,
        n_estimators=20
    )
    
    # 訓練LightGBM模型
    lgb_model.fit(X_train, y_train)
    
    # 在測試集上進行預測
    y_pred = lgb_model.predict(X_test)
    
    # 計算預測效能
    accuracy = accuracy_score(y_test, y_pred)
    print("Accuracy:", accuracy)
    
    

B. 處理實際資料集的案例研究

一個實際的案例研究是使用 LightGBM 對房價資料集進行建模和預測。該資料集包含房屋的各種特徵,例如房屋的大小、位置、房間數量、衛生間數量等等,以及每個房屋的銷售價格。

在處理房價資料集時使用的 LightGBM 特定技術和方法:

  1. LightGBM 可以自動處理類別特徵,無需進行獨熱編碼或標籤編碼。
  2. LightGBM 可以自動處理缺失值,使用 NaN 或其他值來代替缺失值。
  3. LightGBM 可以自動處理離群值,無需額外的處理。
  4. LightGBM 可以使用隨機森林、貝葉斯優化等技術來進行模型的調參。

使用 LightGBM 對房價資料集進行建模和預測的範例程式碼:

import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 載入資料集
data = pd.read_csv('house_prices.csv')

# 劃分資料集
train_data, test_data, train_target, test_target = train_test_split(
    data.drop('SalePrice', axis=1), data['SalePrice'], test_size=0.2, random_state=42)

# 定義 LightGBM 資料集
train_dataset = lgb.Dataset(train_data, label=train_target)

# 設定引數
params = {
    'boosting_type': 'gbdt',
    'objective': 'regression',
    'metric': 'rmse',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9
}

# 訓練模型
num_round = 100
bst = lgb.train(params, train_dataset, num_round)

# 測試模型
test_pred = bst.predict(test_data)
test_rmse = mean_squared_error(test_target, test_pred) ** 0.5
print('RMSE on test set: {:.2f}'.format(test_rmse))

總結

  1. LightGBM 是一個高效,分散式,高效能的梯度提升框架,具有許多優點,如快速訓練速度,高準確性和可延伸性等。
  2. LightGBM 的基本工作原理是通過將資料集分成許多小資料集,並使用特定的演演算法構建決策樹來構建強大的預測模型。
  3. LightGBM 還具有許多高階特性和功能,如資料並行處理,直方圖加速,類別特徵處理,特徵重要性分析和自定義損失函數等。
  4. 在使用 LightGBM 進行建模時,需要先準備和清洗資料,進行特徵工程,然後構建 LightGBM 模型,進行訓練和調整,最後使用模型進行預測。
  5. LightGBM 在許多應用場景中都有很好的表現,包括分類和迴歸模型,時間序列預測,推薦系統,影象識別等。