LightGBM 是微軟開發的一個強大的開源梯度提升框架。它旨在高效和可延伸,能夠處理大型資料集和高維特徵。LightGBM結合使用基於梯度的單邊取樣(GOSS)和獨佔特徵捆綁(EFB)來降低計算成本並提高模型的準確性。
LightGBM 支援各種目標函數,可用於迴歸和分類問題。它還提供了一些高階功能,例如提前停止、交叉驗證和超引數調整,以幫助使用者構建穩健的模型。此外,它還為流行的程式語言(如 Python、R 和 C++)提供介面,使其易於整合到現有的資料科學工作流程中。
總體而言,LightGBM 是構建高效能梯度提升模型的熱門選擇,尤其是對於大規模和高維資料集。
LightGBM是一個開源的梯度提升框架,由微軟公司在2017年推出。它旨在提供一個高效、可延伸、準確和易於使用的機器學習工具,可以處理大規模資料和高維特徵,適用於迴歸、分類和排序等各種任務。
LightGBM的起源可以追溯到GBDT(梯度提升決策樹)演演算法,它是一種基於決策樹的機器學習方法,通過遞迴地訓練一系列的決策樹來構建一個強大的預測模型。GBDT已經被廣泛應用於各種領域,例如推薦系統、廣告和金融等。然而,GBDT演演算法仍然存在一些限制,例如對於高維資料和大規模資料集的處理效率不高。
為了解決這些問題,LightGBM引入了一些創新性的技術,如基於梯度的單側取樣(GOSS)和獨佔特徵繫結(EFB)等,以提高訓練速度和準確性。此外,LightGBM還支援並行化處理、GPU加速、多種損失函數和多種分類器等功能,使其在大規模資料和高維特徵的處理中表現出色。這些優勢使得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環境的設定:
資料格式的設定:根據資料的格式選擇不同的資料讀取函數,例如:
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的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原始碼目錄,使用以下命令進行編譯:
mkdir build
cd build
cmake ..
make -j4
這裡使用了-j4
選項,可以同時編譯4個檔案。編譯完成後,可以在build
目錄下找到lightgbm
可執行檔案。
可以使用以下命令將LightGBM安裝到系統中:
sudo make install
這樣,LightGBM就安裝到了系統中。可以使用以下命令檢查LightGBM是否安裝成功:
lightgbm --version
如果輸出了LightGBM的版本號,就說明安裝成功了。
需要注意的是,LightGBM還支援使用GPU進行加速,可以通過設定相關的編譯選項啟用GPU加速。具體方法可以參考LightGBM的官方檔案。
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)
二分類任務,乳腺癌資料集
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)
一個實際的案例研究是使用 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))