xgboost 與 lightgbm 官方均支持多分類任務,但不直接支持多標籤分類任務,實現多標籤任務的方法之一是結合sklearn 提供的 multiclass 子類,如OneVsRestClassifier。
下面分別給出 多分類 與 多標籤 任務的使用實例。
xgboost 多分類任務
from xgboost import XGBClassifier
import numpy as np
clf_multiclass = XGBClassifier()
train_data = np.random.rand(500, 100) # 500 entities, each contains 100 features
train_label = np.random.randint(5, size=500) # 5 targets
val_data = np.random.rand(100, 100)
clf_multiclass.fit(train_data,train_label)
val_pred = clf_multiclass.predict(val_data)
lightgbm 多分類任務
from lightgbm import LGBMClassifier
import numpy as np
clf_multiclass = LGBMClassifier()
train_data = np.random.rand(500, 100) # 500 entities, each contains 100 features
train_label = np.random.randint(5, size=500) # 5 targets
val_data = np.random.rand(100, 100)
clf_multiclass.fit(train_data,train_label)
val_pred = clf_multiclass.predict(val_data)
xgboost 多標籤任務
from xgboost import XGBClassifier
from sklearn.multiclass import OneVsRestClassifier
import numpy as np
clf_multilabel = OneVsRestClassifier(XGBClassifier())
train_data = np.random.rand(500, 100) # 500 entities, each contains 100 features
train_label = np.random.randint(2, size=(500,20)) # 20 targets
val_data = np.random.rand(100, 100)
clf_multilabel.fit(train_data,train_label)
val_pred = clf_multilabel.predict(val_data)
lightgbm 多標籤任務
from lightgbm import LGBMClassifier
from sklearn.multiclass import OneVsRestClassifier
import numpy as np
clf_multilabel = OneVsRestClassifier(LGBMClassifier())
train_data = np.random.rand(500, 100) # 500 entities, each contains 100 features
train_label = np.random.randint(2, size=(500,20)) # 20 targets
val_data = np.random.rand(100, 100)
clf_multilabel.fit(train_data,train_label)
val_pred = clf_multilabel.predict(val_data)
運行效率相關的幾個測試
1.關於多標籤問題,
根據目前的測試,當數據體量較大(樣本量,特徵量,類別數目)時,此方案速度極慢,且如果啓動並行內存佔用量極大。可能由於使用OVR 直接建立了對應類別數量的分類模型,後續測試是否有更優化的實現方法。
2.xgboost 官方提供了gpu加速支持,調用語句中增加如下超參數即可
clf_multiclass = XGBClassifier(tree_method='gpu_hist', gpu_id=0)
親測使用gpu效率較高。
3. xgboost 與 lightgbm 均可通過n_jobs 設置啓用並行加速,暫未進行測試。
4. lightgbm 的 gpu加速方法暫未測試。