前言
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適用於以下場景:
- 大規模資料和高維特徵:當資料集規模很大或者特徵維度很高時,LightGBM可以透過並行化和創新性技術,快速地訓練出一個準確的模型。
- 非線性問題:LightGBM在處理非線性問題時表現出色,因此它適用於許多需要處理非線性問題的領域,例如金融、電商和醫療等。
- 可解釋性需求:LightGBM支援特徵重要性評估和視覺化,能夠幫助使用者理解模型的工作原理和特徵的貢獻,適用於需要理解模型背後邏輯的場景。
- 需要快速訓練和預測的場景:LightGBM在處理大規模資料和高維特徵時表現出色,因此適用於需要快速訓練和預測的場景,例如線上廣告和推薦系統等。
LightGBM的基本工作原理
- 透過迭代地訓練多棵決策樹來構建一個強大的整合模型。
- 損失函式:LightGBM支援多種損失函式,例如均方誤差(MSE)、對數損失(Log loss)和L1損失等。使用者可以根據具體問題選擇合適的損失函式。
- 初始化:LightGBM將訓練資料隨機分成若干個小批次,每個小批次的大小可以由使用者自定義。對於每個小批次,LightGBM使用一棵單節點的決策樹作為初始模型。
- 梯度提升:LightGBM採用梯度提升演演算法,透過迭代地訓練多棵決策樹來不斷提高模型的預測準確性。在每次迭代中,LightGBM根據當前模型的預測結果計算出每個樣本的負梯度,將負梯度作為新的目標變數來訓練下一棵決策樹。這樣,每棵決策樹都是在之前模型的基礎上進行訓練的。
- 單側取樣:LightGBM引入了基於梯度的單側取樣(GOSS)技術,透過降低低梯度樣本的取樣率,提高高梯度樣本的取樣率,減少資料集的噪聲,從而加速模型的訓練。
- 獨佔特徵繫結:LightGBM還引入了獨佔特徵繫結(EFB)技術,將相似的特徵分成一組,同時只選取一組特徵作為決策樹分裂的依據,減少了分裂的計算量和噪聲,提高了模型的準確性和泛化能力。
- 分裂策略:LightGBM採用基於梯度的直方圖分裂演演算法,將特徵值按照梯度的大小劃分為若干個直方圖,選取最優的分裂點來進行分裂,減少了計算量和噪聲,提高了模型的準確性和泛化能力。
- 葉子結點最佳化:LightGBM採用直方圖最佳化演演算法,將每個葉子結點的樣本按照特徵值的大小劃分為若干個直方圖,計算每個直方圖的梯度和Hessian矩陣,從而快速地確定每
- 評估指標:LightGBM支援多種評估指標,例如準確率、AUC、平均絕對誤差(MAE)和均方誤差(MSE)等。使用者可以根據具體問題選擇合適的評估指標。
- 提前停止:LightGBM還支援提前停止技術,當模型的效能在驗證集上不再提升時,自動停止模型的訓練,防止模型過擬合。
- 並行加速:LightGBM採用並行加速技術,可以利用多執行緒和多機並行加速模型的訓練,提高模型訓練的效率。
安裝和配置LightGBM
安裝LightGBM
htGBM的安裝可以透過多種方式進行,這裡介紹兩種較為常用的方式:使用Anaconda安裝和使用pip安裝。
使用Anaconda安裝:
-
首先,需要安裝Anaconda(如果已經安裝,可以跳過此步驟)。在Anaconda官網上下載對應版本的Anaconda安裝程式,安裝過程中可以根據需要選擇新增環境變數、設定路徑等選項。
-
開啟Anaconda Prompt,輸入以下命令建立一個新的conda環境(例如,取名為lgb):
conda create -n lgb python=3.7
其中,python=3.7表示建立Python 3.7的環境,可以根據需要選擇其他版本。
-
啟用lgb環境:
conda activate lgb
-
安裝LightGBM:
conda install lightgbm
或者
pip install lightgbm
安裝完成後,可以使用以下命令驗證LightGBM是否安裝成功:
python -c "import lightgbm; print(lightgbm.__version__)"
如果輸出了LightGBM的版本號,則說明安裝成功。由於LightGBM是一個C++庫,安裝時還需要安裝C++編譯器和相關的開發工具。
配置LightGBM的環境
為了更好地使用LightGBM,需要配置相應的環境。主要包括以下幾個方面:
- 資料格式:LightGBM支援多種資料格式,包括libsvm格式、CSV格式、numpy陣列和Pandas DataFrame等。在使用LightGBM之前,需要確保資料格式正確,並根據具體情況選擇合適的資料格式。
- 引數設定:LightGBM有多個引數可以進行調整,例如樹的深度、學習率、葉子結點數目等。在使用LightGBM之前,需要了解這些引數的含義和作用,並根據具體情況進行調整。
- 並行加速:LightGBM支援多執行緒和分散式計算,可以大大加快模型的訓練速度。在使用LightGBM之前,需要配置並行加速的相關引數,以充分利用計算資源。
- GPU加速:LightGBM還支援使用GPU進行加速,可以進一步提高模型的訓練速度。在使用LightGBM之前,需要配置GPU的相關引數,並確保系統中已經安裝了適當的GPU驅動程式和CUDA工具包。
具體來說,可以按照以下步驟進行LightGBM環境的配置:
-
資料格式的配置:根據資料的格式選擇不同的資料讀取函式,例如:
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)
-
引數設定的配置:使用引數字典進行引數的配置,例如:
params = { 'boosting_type': 'gbdt', 'objective': 'binary', 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.9 }
-
並行加速的配置:使用引數控制並行加速的方式和執行緒數,例如:
params = { 'num_threads': 4, 'device': 'cpu' }
-
GPU加速的配置:在使用GPU進行加速時,需要安裝相應的GPU驅動程式和CUDA工具包,然後在引數中指定使用GPU和相關的引數,例如:
params = { 'device': 'gpu', 'gpu_platform_id': 0, 'gpu_device_id': 0 }
配置完成後,就可以使用LightGBM進行模型訓練和預測了。
LightGBM的編譯和安裝
LightGBM是一個開源的機器學習庫,提供了高效的梯度提升決策樹演演算法。在使用LightGBM之前,需要先將其編譯並安裝到系統中。下面介紹一下LightGBM的編譯和安裝過程。
- 下載LightGBM原始碼
首先需要從LightGBM的GitHub倉庫中下載原始碼。可以使用以下命令進行下載:
bashCopy code
git clone --recursive https://github.com/microsoft/LightGBM
這裡使用了--recursive
選項,可以同時下載LightGBM的子模組。
- 安裝依賴項
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
- 編譯LightGBM
進入LightGBM原始碼目錄,使用以下命令進行編譯:
mkdir build
cd build
cmake ..
make -j4
這裡使用了-j4
選項,可以同時編譯4個檔案。編譯完成後,可以在build
目錄下找到lightgbm
可執行檔案。
- 安裝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 特定技術和方法:
- LightGBM 可以自動處理類別特徵,無需進行獨熱編碼或標籤編碼。
- LightGBM 可以自動處理缺失值,使用 NaN 或其他值來代替缺失值。
- LightGBM 可以自動處理離群值,無需額外的處理。
- 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))
總結
- LightGBM 是一個高效,分散式,高效能的梯度提升框架,具有許多優點,如快速訓練速度,高準確性和可擴充套件性等。
- LightGBM 的基本工作原理是透過將資料集分成許多小資料集,並使用特定的演演算法構建決策樹來構建強大的預測模型。
- LightGBM 還具有許多高階特性和功能,如資料並行處理,直方圖加速,類別特徵處理,特徵重要性分析和自定義損失函式等。
- 在使用 LightGBM 進行建模時,需要先準備和清洗資料,進行特徵工程,然後構建 LightGBM 模型,進行訓練和調整,最後使用模型進行預測。
- LightGBM 在許多應用場景中都有很好的表現,包括分類和迴歸模型,時間序列預測,推薦系統,影像識別等。