據(jù)接口到訓(xùn)練、調(diào)參與預(yù)測(cè)的完整實(shí)踐)
LightGBM Python 包入門指南從數(shù)據(jù)接口到訓(xùn)練、調(diào)參與預(yù)測(cè)的完整實(shí)踐【免費(fèi)下載鏈接】LightGBMA fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/li/LightGBM本文是基于 LightGBM 倉庫 docs/Python-Intro.rst 編寫的 Python 包實(shí)戰(zhàn)指南系統(tǒng)講解 Python 生態(tài)下 LightGBM 的核心用法數(shù)據(jù)如何裝載進(jìn)Dataset、參數(shù)如何配置、模型如何訓(xùn)練與預(yù)測(cè)以及早停、交叉驗(yàn)證、內(nèi)存優(yōu)化等實(shí)戰(zhàn)要點(diǎn)。讀完本文你將掌握一套可直接復(fù)制運(yùn)行的最小工作流并理解其背后的源碼級(jí)實(shí)現(xiàn)原理能夠獨(dú)立完成從原始數(shù)據(jù)到可部署模型的完整鏈路。安裝與驗(yàn)證官方推薦通過 pip 安裝 LightGBMpip install lightgbm更詳細(xì)的構(gòu)建與安裝說明可參考 python-package。安裝完成后在 Python 中導(dǎo)入即可驗(yàn)證環(huán)境是否就緒import lightgbm as lgb倉庫內(nèi)的可執(zhí)行示例位于 examples/python-guide運(yùn)行這些示例還需要scikit-learn、pandas、matplotlib僅繪圖示例和scipy僅邏輯回歸示例pip install scikit-learn pandas matplotlib scipy -U python simple_example.py數(shù)據(jù)接口Dataset 是一切訓(xùn)練的起點(diǎn)LightGBM 不會(huì)直接在原始數(shù)據(jù)上訓(xùn)練。從源碼 python-package/lightgbm/basic.py 中的Dataset類文檔可以看到LightGBM does not train on raw data. It discretizes continuous features into histogram bins, tries to combine categorical features, and automatically handles missing and infinite values. This class handles that preprocessing, and holds that alternative representation of the input data.也就是說Dataset負(fù)責(zé)完成連續(xù)特征分箱直方圖化、類別特征合并、缺失值與無窮值處理等全部預(yù)處理并持有數(shù)據(jù)的內(nèi)部表示訓(xùn)練過程中真正使用的是這份內(nèi)部表示而不是原始內(nèi)存對(duì)象。支持的數(shù)據(jù)源Dataset構(gòu)造函數(shù)basic.py中_LGBM_TrainDataType類型定義python-package/lightgbm/basic.py支持以下輸入形式LibSVM零基索引/ TSV / CSV 格式的文本文件NumPy 2D 數(shù)組、SciPy 稀疏矩陣pandas DataFrame、polars DataFrame、pyarrow TableLightGBM 二進(jìn)制文件LightGBMSequence對(duì)象可傳入單個(gè)或多個(gè)下面逐一給出最小可運(yùn)行示例。本文示例依賴numpy請(qǐng)先導(dǎo)入import numpy as np從 LibSVM 文本文件或 LightGBM 二進(jìn)制文件加載train_data lgb.Dataset(train.svm.bin)當(dāng)data參數(shù)是字符串或pathlib.Path時(shí)它被解釋為文本文件CSV/TSV/LibSVM或 LightGBM Dataset 二進(jìn)制文件的路徑見 python-package/lightgbm/basic.py。從 NumPy 數(shù)組加載rng np.random.default_rng() data rng.uniform(size(500, 10)) # 500 個(gè)樣本每個(gè)樣本 10 個(gè)特征 label rng.integers(low0, high2, size(500, )) # 二分類標(biāo)簽 train_data lgb.Dataset(data, labellabel)從 SciPy 稀疏矩陣加載import scipy csr scipy.sparse.csr_matrix((dat, (row, col))) train_data lgb.Dataset(csr)稀疏矩陣適用于高維稀疏場(chǎng)景如 CTR 預(yù)估可以顯著降低內(nèi)存占用。用 Sequence 接口讀取超大文件HDF5 示例對(duì)于無法一次性載入內(nèi)存的大規(guī)模數(shù)據(jù)可以自定義實(shí)現(xiàn)lgb.Sequence接口。該抽象基類定義在 python-package/lightgbm/basic.py要求子類實(shí)現(xiàn)兩個(gè)抽象方法__getitem__(self, idx)支持整數(shù)索引隨機(jī)訪問單行、切片批量讀取多行和列表索引__len__(self)返回總行數(shù)同時(shí)提供類屬性batch_size 4096默認(rèn)每批讀取 4K 行可在子類中覆蓋。以下示例用h5py包裝 HDF5 數(shù)據(jù)集與 examples/python-guide/dataset_from_multi_hdf5.py 中的HDFSequence實(shí)現(xiàn)一致import h5py class HDFSequence(lgb.Sequence): def __init__(self, hdf_dataset, batch_size): self.data hdf_dataset self.batch_size batch_size def __getitem__(self, idx): return self.data[idx] def __len__(self): return len(self.data) f h5py.File(train.hdf5, r) train_data lgb.Dataset(HDFSequence(f[X], 8192), labelf[Y][:])使用Sequence接口有三個(gè)核心收益隨機(jī)訪問式采樣數(shù)據(jù)采樣不必遍歷整個(gè)數(shù)據(jù)集只需按索引取行批量讀取、按需加載構(gòu)造Dataset時(shí)按批讀取避免一次性把全部數(shù)據(jù)讀入內(nèi)存支持多數(shù)據(jù)文件可以把多個(gè)Sequence如多個(gè) HDF5 文件組合起來構(gòu)造一個(gè)Dataset。dataset_from_multi_hdf5.py還演示了如何把多個(gè) HDF5 文件組合成Dataset將多個(gè)HDFSequence放入列表傳入lgb.Dataset并通過params{bin_construct_sample_cnt: 200000, max_bin: 255}控制分箱采樣數(shù)量與最大分箱數(shù)。該示例對(duì) HDF5 的 chunk 大小做了針對(duì)性優(yōu)化——由于采樣是隨機(jī)訪問chunk 過大時(shí)一次 I/O 會(huì)讀入整塊數(shù)據(jù)因此 chunk 應(yīng)與batch_size匹配且數(shù)據(jù)按行主序存儲(chǔ)以減少拷貝。Sequence的完整 API 文檔見 docs/Python-API.rst 的 Data Structure API 一節(jié)。保存為二進(jìn)制文件加速加載將Dataset保存為 LightGBM 二進(jìn)制文件后續(xù)加載會(huì)顯著更快train_data lgb.Dataset(train.svm.txt) train_data.save_binary(train.bin)創(chuàng)建驗(yàn)證集驗(yàn)證集必須與訓(xùn)練集對(duì)齊特征順序、分箱方式一致。有兩種方式validation_data train_data.create_valid(validation.svm)或顯式傳入referencevalidation_data lgb.Dataset(validation.svm, referencetrain_data)源碼層面reference的作用是讓驗(yàn)證集復(fù)用訓(xùn)練集的分箱與預(yù)處理信息從而保證評(píng)估口徑一致。特征名與類別特征train_data lgb.Dataset(data, labellabel, feature_name[c1, c2, c3], categorical_feature[c3])LightGBM 支持直接使用類別特征輸入無需做 one-hot 編碼官方文檔明確說明其速度約為 one-hot 方案的 8 倍。構(gòu)造Dataset前需將類別特征轉(zhuǎn)換為int類型。從Dataset的 docstringpython-package/lightgbm/basic.py可進(jìn)一步了解類別特征的底層規(guī)則所有類別值會(huì)被轉(zhuǎn)換為 int32因此需小于 int32 最大值2147483647過大的取值會(huì)消耗更多內(nèi)存建議使用從 0 開始的連續(xù)整數(shù)負(fù)數(shù)會(huì)被當(dāng)作缺失值處理浮點(diǎn)型類別值會(huì)向 0 取整類別特征不支持單調(diào)約束。categorical_feature支持按索引整數(shù)列表或按名稱字符串列表需同時(shí)指定feature_name指定當(dāng)輸入為 pandas DataFrame 且參數(shù)為auto時(shí)會(huì)自動(dòng)識(shí)別 pandas 的無序類別列。advanced_example.py中categorical_feature[21]即為按索引指定的實(shí)戰(zhàn)用法。樣本權(quán)重、初始分?jǐn)?shù)與排序分組權(quán)重既可以在構(gòu)造時(shí)傳入也可以在構(gòu)造后設(shè)置rng np.random.default_rng() w rng.uniform(size(500, )) train_data lgb.Dataset(data, labellabel, weightw)train_data lgb.Dataset(data, labellabel) rng np.random.default_rng() w rng.uniform(size(500, )) train_data.set_weight(w)此外還可使用Dataset.set_init_score()設(shè)置初始分?jǐn)?shù)如繼續(xù)訓(xùn)練或遷移學(xué)習(xí)的先驗(yàn)預(yù)測(cè)以及Dataset.set_group()為排序任務(wù)learning-to-rank設(shè)置 group/query 數(shù)據(jù)。group的語義是每個(gè)查詢下的文檔數(shù)量例如 100 個(gè)文檔、group[10, 20, 40, 10, 10, 10]表示 6 個(gè)查詢組前 10 條記錄屬于第一組、第 11-30 條屬于第二組依此類推見 python-package/lightgbm/basic.py。內(nèi)存高效用法Dataset只保存離散化后的分箱數(shù)據(jù)內(nèi)存效率很高但 NumPy / pandas 原始對(duì)象本身占用較大。若關(guān)注內(nèi)存占用可按以下順序操作構(gòu)造Dataset時(shí)設(shè)置free_raw_dataTrue默認(rèn)即為True構(gòu)造內(nèi)部 Dataset 后立即釋放原始數(shù)據(jù)構(gòu)造完成后顯式將raw_data置為None調(diào)用gc觸發(fā)垃圾回收。需要說明的是advanced_example.py中刻意設(shè)置free_raw_dataFalse是為了演示復(fù)用原始數(shù)據(jù)構(gòu)造新的 Dataset的場(chǎng)景——這屬于需要保留原始數(shù)據(jù)的特例。設(shè)置參數(shù)LightGBM 使用 Python 字典配置參數(shù)完整參數(shù)清單見 docs/Parameters.rst。示例param {num_leaves: 31, objective: binary} param[metric] aucmetric也支持列表形式同時(shí)指定多個(gè)評(píng)估指標(biāo)param[metric] [auc, binary_logloss]倉庫示例中更完整的參數(shù)配置見 examples/python-guide/simple_example.pyparams { boosting_type: gbdt, objective: regression, metric: {l2, l1}, num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.9, bagging_fraction: 0.8, bagging_freq: 5, verbose: 0, }其中feature_fraction控制每輪迭代隨機(jī)采樣的特征比例緩解過擬合、加速訓(xùn)練bagging_fraction與bagging_freq控制 bagging 采樣的比例與頻率。更系統(tǒng)的調(diào)參思路可參考 docs/Parameters-Tuning.rst。訓(xùn)練模型訓(xùn)練只需參數(shù)列表與數(shù)據(jù)集num_round 10 bst lgb.train(param, train_data, num_round, valid_sets[validation_data])訓(xùn)練完成后可以保存模型文本格式bst.save_model(model.txt)也可以導(dǎo)出為 JSON 格式以便程序化解析advanced_example.py中還演示了將 JSON 寫入文件的完整做法json_model bst.dump_model()加載已保存的模型bst lgb.Booster(model_filemodel.txt) # init model交叉驗(yàn)證無需手動(dòng)劃分?jǐn)?shù)據(jù)直接進(jìn)行 5 折交叉驗(yàn)證lgb.cv(param, train_data, num_round, nfold5)cv返回每一輪的評(píng)估結(jié)果可用于判斷迭代輪數(shù)對(duì)泛化性能的影響。早停找到最優(yōu)迭代輪數(shù)配合驗(yàn)證集使用早停可以自動(dòng)確定最優(yōu)的 boosting 輪數(shù)。早停要求valid_sets中至少有一個(gè)驗(yàn)證集若傳入多個(gè)則除訓(xùn)練數(shù)據(jù)外的全部驗(yàn)證集都會(huì)參與早停判斷bst lgb.train(param, train_data, num_round, valid_setsvalid_sets, callbacks[lgb.early_stopping(stopping_rounds5)]) bst.save_model(model.txt, num_iterationbst.best_iteration)工作機(jī)理與關(guān)鍵細(xì)節(jié)模型會(huì)一直訓(xùn)練到驗(yàn)證分?jǐn)?shù)不再改善為止驗(yàn)證分?jǐn)?shù)必須至少每stopping_rounds輪改善一次否則停止最優(yōu)迭代輪次記錄在bst.best_iteration字段中且開啟早停后train()返回的模型本身就來自最優(yōu)迭代早停對(duì)最小化類指標(biāo)L2、log loss 等和最大化類指標(biāo)NDCG、AUC 等均適用若同時(shí)指定多個(gè)評(píng)估指標(biāo)默認(rèn)所有指標(biāo)都會(huì)參與早停判斷若只想依據(jù)第一個(gè)指標(biāo)判斷可向early_stopping構(gòu)造函數(shù)傳入first_metric_onlyTrue。simple_example.py展示了早停配合gbm.predict(X_test, num_iterationgbm.best_iteration)的完整回歸流程。預(yù)測(cè)訓(xùn)練好或加載好的模型可以直接對(duì)數(shù)據(jù)預(yù)測(cè)# 7 個(gè)樣本每個(gè)樣本 10 個(gè)特征 rng np.random.default_rng() data rng.uniform(size(7, 10)) ypred bst.predict(data)訓(xùn)練期間啟用了早停時(shí)可用bst.best_iteration鎖定最優(yōu)迭代進(jìn)行預(yù)測(cè)ypred bst.predict(data, num_iterationbst.best_iteration)advanced_example.py還演示了預(yù)測(cè)相關(guān)的其他細(xì)節(jié)從文件加載模型后只能以最優(yōu)迭代或保存時(shí)指定的迭代預(yù)測(cè)而通過pickle序列化的模型可以指定任意迭代次數(shù)預(yù)測(cè)。此外該示例還展示了gbm.feature_name()、gbm.feature_importance()獲取特征名與特征重要度以及通過init_model參數(shù)接受模型文件路徑或Booster對(duì)象實(shí)現(xiàn)繼續(xù)訓(xùn)練。進(jìn)階sklearn 接口與 Dask 分布式訓(xùn)練除原生train/cvAPI 外Python 包還提供與 scikit-learn 完全兼容的封裝見 docs/Python-API.rst 的 Scikit-learn API 一節(jié)LGBMModel、LGBMClassifier、LGBMRegressor、LGBMRanker。示例 examples/python-guide/sklearn_example.py 演示了其典型用法gbm lgb.LGBMRegressor(num_leaves31, learning_rate0.05, n_estimators20) gbm.fit(X_train, y_train, eval_X(X_test,), eval_y(y_test,), eval_metricl1, callbacks[lgb.early_stopping(5)]) y_pred gbm.predict(X_test, num_iterationgbm.best_iteration_)sklearn 接口天然支持自定義評(píng)估函數(shù)簽名f(y_true, y_pred) - (name, value, is_higher_better)、GridSearchCV網(wǎng)格搜索以及feature_importances_屬性。對(duì)大規(guī)模分布式訓(xùn)練可以進(jìn)一步使用 Dask API自 3.2.0 版本起提供DaskLGBMClassifier、DaskLGBMRegressor、DaskLGBMRanker對(duì)應(yīng)示例見 examples/python-guide/dask。完整的 API 目錄Data Structure API、Training API、Scikit-learn API、Dask API、Callbacks、Plotting、Utilities均可參考 docs/Python-API.rst。總結(jié)一條完整的 Python 工作流把上述內(nèi)容串起來一個(gè)典型流程如下裝載數(shù)據(jù)從文本文件、NumPy/SciPy、DataFrame 或Sequence構(gòu)造lgb.Dataset需要時(shí)指定feature_name、categorical_feature、weight劃分驗(yàn)證用create_valid或reference創(chuàng)建與訓(xùn)練集對(duì)齊的驗(yàn)證集配置參數(shù)用字典設(shè)置objective、metric、num_leaves、learning_rate等見 docs/Parameters.rst訓(xùn)練與早停lgb.train(..., callbacks[lgb.early_stopping(...)])用best_iteration保存最優(yōu)模型評(píng)估與部署bst.predict()預(yù)測(cè)save_model/dump_model持久化lgb.Booster(model_file...)重新加載。至此你已經(jīng)掌握了 LightGBM Python 包從數(shù)據(jù)接口到預(yù)測(cè)部署的全鏈路能力。倉庫中的 examples/python-guide 提供了可直接運(yùn)行的完整示例基礎(chǔ)流程simple_example.py、進(jìn)階技巧advanced_example.py、sklearn 接口sklearn_example.py、多 HDF5 文件dataset_from_multi_hdf5.py、Dask 分布式dask/建議結(jié)合本文邊運(yùn)行邊對(duì)照進(jìn)一步鞏固實(shí)戰(zhàn)技能。【免費(fèi)下載鏈接】LightGBMA fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/li/LightGBM創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考