ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

三步跑通 LightGBM:从 pip install 到线上部署的实战路径

三步跑通 LightGBM:从 pip install 到线上部署的实战路径 三步跑通 LightGBM从 pip install 到线上部署的实战路径【免费下载链接】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.项目地址: https://gitcode.com/GitHub_Trending/li/LightGBM模型刚在 notebook 里收敛下一步干什么以信贷违约预测为例先用 Python 装好 LightGBM 这个梯度提升GBDT框架再弄懂 Dataset、Booster 这两个核心对象最后把模型推上线提供服务。装对版本先跑通这一步的任务只有一个让import lightgbm成功并几秒钟内训完一个小模型。卡住的往往不是安装本身而是选错了路——源码编译先试错纯浪费时间GPU 环境里用默认 wheel又拿不到加速。按场景分三条路各有一句话取舍快速上手pip wheel零编译依赖最不容易出错代价是编译选项不可改。科学计算环境conda环境隔离、依赖求解省心版本可能比 PyPI 晚几周。性能调优源码编译要开 GPU/CUDA 或定制编译才走这条路代价是需要 CMake 和 C17 编译器这套工具链。多数人走第一条一条命令就够pip install lightgbm # 要用 pandas 或 scikit-learn 就连带 extra 一起装避免运行时缺依赖 pip install lightgbm[pandas,scikit-learn]需要 dask 分布式、arrow 数据源或绘图功能时换对应的[dask]、[arrow]、[plotting]extra装法相同。conda 环境conda create -n lgb python3.12 -y conda activate lgb conda install -c conda-forge lightgbm pandas scikit-learn源码编译当前 4.7 系要求 Python ≥ 3.10git clone --recursive https://gitcode.com/GitHub_Trending/li/LightGBM cd LightGBM pip install ./python-package --no-build-isolation要 GPU 加速就在源码编译上加 CMake 开关# OpenCL 版NVIDIA / AMD / Intel 都能用需要 OpenCL 运行时 pip install ./python-package --no-build-isolation \ --config-settingscmake.define.USE_GPUON # NVIDIA CUDA 版仅 Linux pip install ./python-package --no-build-isolation \ --config-settingscmake.define.USE_CUDAON官方实验里GPU 训练耗时普遍只有 CPU 的几分之一到十分之一数据量大到 CPU 跑不动时再考虑这条路。各系统具体要装哪些系统包见仓库内 Installation-Guide.rst不必背。用六行代码验证安装成功下面是最小可运行片段模拟 2000 条客户记录训 20 轮打印违约概率。能出数字环境就没问题import lightgbm as lgb import numpy as np rng np.random.default_rng(7) X rng.normal(size(2000, 5)) # 5 个特征 y (X[:, 0] 0.5 * X[:, 1] rng.normal(scale0.3, size2000) 0).astype(int) train lgb.Dataset(X, labely) params {objective: binary, metric: binary_logloss, verbose: -1} booster lgb.train(params, train, num_boost_round20) print(前 4 位客户违约概率:, np.round(booster.predict(X[:4]), 3))排查两个高频报错现象OSError: libgomp.so.1: cannot open shared object file原因系统缺 OpenMP 运行时库wheel 链接到了 gomp解法Linux 执行sudo apt install libgomp1macOS 执行brew install libomp现象用 DataFrame 构造 Dataset 时报 pandas ... is not supported 之类错误原因pandas 在 4.x 里是可选依赖基础包不默认安装解法pip install lightgbm[pandas]下一步看写代码时只会遇到的那两个对象。只有两个对象Dataset 与 Booster分工一句话Dataset 管「数据怎么高效地进去」——分箱、内存、分类特征Booster 管「模型怎么出来、怎么用」——训练迭代、预测输出、持久化。你写 LightGBM 代码基本全在这两个类里打转。列出 Dataset 能吃的输入格式4.7 里lgb.Dataset(...)的data参数接受文件路径CSV / TSV / LibSVM 文本文件或之前保存的 LightGBM 二进制文件numpy 二维数组pandas DataFramecategorical dtype 会被自动识别scipy 稀疏矩阵pyarrow Tablepolars DataFrame4.7 新增Sequence 对象实现__getitem__适合大文件流式读取日常 90% 的场景用前三者。记住两个开关reference 与 free_raw_datareference验证集应当复用训练集的分箱边界否则同一特征两边切法不同对齐就乱了。train_set lgb.Dataset(X_train, labely_train) val_set lgb.Dataset(X_val, labely_val, referencetrain_set) # 训练集要先构造free_raw_data默认Trueconstruct()完成后释放 Python 侧原始数据内存立刻变小构造后还要继续用原 numpy 数组的设False。max_bin、min_data_in_bin这类数据级参数控制分箱数与每箱最少样本数是内存和精度的权衡推荐值以官方文档 Parameters.rst 为准不在此展开。分类特征的正确指定方式categorical_feature有三种写法lgb.Dataset(df, labely, categorical_featureauto) # 自动识别 pandas 的 categorical dtype lgb.Dataset(df, labely, categorical_feature[city, grade]) # 按特征名 lgb.Dataset(X, labely, categorical_feature[0, 3]) # 按列索引不要先把分类特征 one-hot 再喂进来LightGBM 有自己的分类特征最优分裂算法one-hot 只会让特征数爆炸、树白白变宽。看 Booster 必用的三个属性print(booster.best_iteration) # 验证表现最好的轮次没触发早停时是 -1 booster.save_model(m.txt) # 模型写盘 s booster.model_to_string() # 模型变字符串适合存数据库、走网络传输 rebuilt lgb.Booster(model_strs) # 从字符串还原 Boosterbest_iteration值得多说一句只有挂了验证集和早停回调它才有意义训完做预测时记得传num_iterationbooster.best_iteration否则会用全部轮次实测分数会比日志里好看的那版差一截。选对 predict 的输出模式prob booster.predict(X_val) # 默认分类出概率、回归出分数 leaf booster.predict(X_val, pred_leafTrue) # 每行落在哪些叶子可做新特征 contrib booster.predict(X_val, pred_contribTrue) # 每特征 SHAP 贡献末列是基准偏移pred_leaf常拿来跟业务规则做特征交叉pred_contrib用于解释单条样本为什么被拒贷注意它的列数是「特征数 1」。到这里数据进得去、模型出得来下一步串成完整循环。一次完整的训练循环任务在信贷数据上端到端训出违约模型。循环六步建数据 → 定参数 → 挂回调 → 训练 → 评估 →可选交叉验证。按顺序做就不会跑偏卡住的人多半卡在第三步——不知道回调到底在干什么。第 1 步造数据、划验证集。这里手工模拟一张 2 万行的客户表import numpy as np import pandas as pd import lightgbm as lgb rng np.random.default_rng(2024) n 20000 income rng.normal(12000, 4000, n) # 月收入 util rng.beta(2, 5, n) # 信用卡额度使用率 inquiry rng.poisson(2, n) # 近 6 个月征信查询次数 credit_y rng.uniform(0, 15, n) # 信用记录年限 df pd.DataFrame({income: income, util: util, inquiry: inquiry, credit_years: credit_y}) logit 1.0 - np.log(income / 8000) - 3 * util 0.15 * inquiry - 0.02 * credit_y df[default] (rng.uniform(n) 1 / (1 np.exp(-logit))).astype(int) perm, cut rng.permutation(n), int(n * 0.8) train_df, val_df df.iloc[perm[:cut]], df.iloc[perm[cut:]]第 2 步定参数。只写看得懂的别堆配置params { objective: binary, metric: [binary_logloss, auc], num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.9, verbose: -1, }第 3 步挂回调。回调就是「训练到某个时机顺手做的事」最常用的三个callbacks [ lgb.early_stopping(stopping_rounds30), # 验证分数连续 30 轮不提升就停 lgb.log_evaluation(period50), # 每 50 轮打一行指标 lgb.record_evaluation(history{}), # 逐轮指标写进 dict方便事后画曲线 ]第 4 步训练。train_set lgb.Dataset(train_df, labeltrain_df[default]) val_set lgb.Dataset(val_df, labelval_df[default], referencetrain_set) booster lgb.train(params, train_set, num_boost_round500, valid_sets[val_set], valid_names[val], callbackscallbacks)第 5 步评估。用最佳轮而不是最后一轮from sklearn.metrics import roc_auc_score, log_loss val_score booster.predict(val_df.drop(columns[default]), num_iterationbooster.best_iteration) print(最佳轮次:, booster.best_iteration) print(AUC:, round(roc_auc_score(val_df[default], val_score), 4), | logloss:, round(log_loss(val_df[default], val_score), 4))第 6 步可选5 折交叉验证。验证集太小、担心结论靠运气时用 CV 替代单次验证cv lgb.cv(params, train_set, num_boost_round500, nfold5, callbacks[lgb.early_stopping(30), lgb.log_evaluation(100)]) print(CV 建议轮数:, len(cv[binary_logloss-mean]))先调这几个参数就够了数据没理干净之前先别急着调参真开始调优先看这五个参数推荐起点调什么num_leaves20 ~ 100复杂度第一闸欠拟合先加大过拟合先减小learning_rate0.01 ~ 0.1越小轮数越多但通常更稳min_data_in_leaf20 ~ 200过拟合的直接刹车叶子预测跳得厉害就调大feature_fraction0.8 ~ 1.0每棵树采样特征压制对个别特征的过度依赖bagging_fraction0.7 ~ 0.9行采样需配bagging_freq才生效其余参数要么影响次要要么和任务强相关以官方文档 Parameters.rst 为准。让模型跑起来模型训完了这一步的目标只有一个让它在 notebook 之外还能预测。先看两条保存加载路径再按规模分三档部署。选两条保存加载路径之一路径一原生 txtBooster直接存文件可读、可 diff也方便人工检查booster.save_model(credit_default.txt) loaded lgb.Booster(model_filecredit_default.txt)路径二sklearn 封装 joblib项目里已经在用LGBMClassifier就走这条import joblib from lightgbm import LGBMClassifier clf LGBMClassifier(num_leaves31, learning_rate0.05) clf.fit(X_train, y_train) joblib.dump(clf, credit_default.joblib) loaded joblib.load(credit_default.joblib)两条路径效果等价全项目统一用一条即可别混着存。 三档部署从脚本到 Docker第一档脚本内嵌。离线批量打分把模型加载和预测包成函数就够import numpy as np import lightgbm as lgb _model lgb.Booster(model_filecredit_default.txt) def score_default(rows: np.ndarray) - np.ndarray: return _model.predict(rows) # 输入列顺序必须和训练集一致第二档单 Web 服务。给前端或上游系统调用FastAPI 最小版import numpy as np import lightgbm as lgb from fastapi import FastAPI app FastAPI() _model lgb.Booster(model_filecredit_default.txt) app.post(/predict) def predict(payload: dict): rows np.asarray(payload[rows], dtypenp.float64) return {prob: _model.predict(rows).tolist()}注意服务端是按列顺序取值的不认列名。调用方少传一列或换了顺序分数全错。对外接口最好把列顺序写进契约文档。第三档容器化。预发和线上环境要一致Dockerfile 就几行FROM python:3.12-slim WORKDIR /app RUN pip install --no-cache-dir lightgbm fastapi uvicorn COPY credit_default.txt app.py ./ EXPOSE 8000 CMD [uvicorn, app:app, --host, 0.0.0.0, --port, 8000]再往上走更高 QPS、多副本就上 C-API 或批量推理服务超出本文范围。生产环境要补的三件事版本管理模型文件名带时间戳同名再放一个 metadata json记训练轮次、验证 AUC、数据哈希任何一版都能回滚。监控请求量、P95 延迟两个指标就够预测路径里别塞磁盘 IO。日志入口只记 shape 和时间戳客户数据原文一条都不要落盘。上线前躲开这五个坑验证集构造必须带referencetrain_set否则两边分箱边界对不齐早停之后predict 记得传num_iterationbooster.best_iteration预测输入列顺序必须与训练集一致别打乱构造后还要用原数组才把free_raw_data设为False模型文件要连同特征顺序、预处理脚本一起归档【免费下载链接】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.项目地址: https://gitcode.com/GitHub_Trending/li/LightGBM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表