LightGBM 常见问题解答
请在 https://github.com/microsoft/LightGBM/issues 提交问题、功能请求和错误报告。
这个项目主要由志愿者维护,所以请耐心等待。如果你的请求有时间限制或者超过一个月没有得到回复,请标记下面的维护者寻求帮助。
@guolinke 柯国霖
@shiyu1994 Yu Shi
@jameslamb James Lamb
@jmoralez José Morales
LightGBM 常见问题
1. 我在哪里可以找到更多关于 LightGBM 参数的详细信息?
查看 参数。
2. 在具有数百万特征的数据集上,训练不会开始(或需要很长时间才开始)。
使用较小的 bin_construct_sample_cnt
值和较大的 min_data
值。
3. 当在大数据集上运行 LightGBM 时,我的电脑内存不足。
多种解决方案:将 histogram_pool_size
参数设置为你希望为 LightGBM 使用的 MB 数(histogram_pool_size + 数据集大小 ≈ 使用的 RAM),降低 num_leaves
或降低 ``max_bin``(参见 Microsoft/LightGBM#562)。
4. 我使用的是Windows系统。我应该使用Visual Studio还是MinGW来编译LightGBM?
Visual Studio 对 LightGBM 表现最佳。
5. 在使用 LightGBM GPU 时,我无法在多次运行中重现结果。
这是正常且预期的行为,但您可以尝试使用 gpu_use_dp = true
以提高可重复性(参见 Microsoft/LightGBM#560)。您也可以使用 CPU 版本。
6. 当改变线程数时,Bagging 是不可复现的。
LightGBM 的 bagging 是多线程的,因此其输出取决于使用的线程数。目前 没有解决方法。
从 #2804 开始,bagging 结果不再依赖于线程数。因此,此问题应在最新版本中得到解决。
7. 我尝试使用随机森林模式,但LightGBM崩溃了!
这是任意参数的预期行为。要启用随机森林,您必须使用不同于1的 bagging_fraction
和 feature_fraction
,以及一个 bagging_freq
。此线程 包含一个示例。
8. 在Windows上使用LightGBM处理非常大的数据集时,即使是在多核系统上,CPU使用率也很低(如10%)。
请使用 Visual Studio ,因为它可能比 MinGW 快 10倍 ,特别是在处理非常大的树时。
9. 当我尝试使用 categorical_feature
参数指定一个分类列时,我收到了以下一系列警告,但该列中没有负值。
[LightGBM] [Warning] Met negative value in categorical features, will convert it to NaN
[LightGBM] [Warning] There are no meaningful features, as all feature values are constant.
您尝试通过 categorical_feature
传递的列可能包含非常大的值。LightGBM 中的分类特征受限于 int32 范围,因此您不能传递大于 Int32.MaxValue
(2147483647) 的值作为分类特征(参见 Microsoft/LightGBM#1359)。您应该首先将它们转换为从零到类别数量的整数。
10. LightGBM 随机崩溃,错误信息如下:Initializing libiomp5.dylib, but found libomp.dylib already initialized.
OMP: Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.
OMP: Hint: This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.
可能的原因:此错误意味着您的机器上安装了多个 OpenMP 库,并且它们之间存在冲突。(错误消息中的文件扩展名可能因操作系统而异)。
如果你使用的是由 Conda 分发的 Python,那么很可能是由于 Conda 中的 numpy
包引起的错误,该包包含了 mkl
包,而 mkl
包与系统范围的库冲突。在这种情况下,你可以在 Conda 中更新 numpy
包,或者通过在 Conda 环境文件夹 $CONDA_PREFIX/lib
中创建一个符号链接到系统范围的库,来替换 Conda 的 OpenMP 库实例。
解决方案:假设你正在使用带有 Homebrew 的 macOS,该命令会用指向 Homebrew 安装的系统范围库文件的符号链接覆盖当前活动 Conda 环境中的 OpenMP 库文件:
ln -sf `ls -d "$(brew --cellar libomp)"/*/lib`/* $CONDA_PREFIX/lib
上述修复在OpenMP 8.0.0版本发布之前工作正常。从8.0.0版本开始,Homebrew的OpenMP配方包含了``-DLIBOMP_INSTALL_ALIASES=OFF``选项,这导致修复不再有效。然而,你可以手动创建库别名的符号链接:
for LIBOMP_ALIAS in libgomp.dylib libiomp5.dylib libomp.dylib; do sudo ln -sf "$(brew --cellar libomp)"/*/lib/libomp.dylib $CONDA_PREFIX/lib/$LIBOMP_ALIAS; done
另一种解决方法是完全从Conda的包中移除MKL优化:
conda install nomkl
如果这不是你的情况,那么你应该自行查找冲突的 OpenMP 库安装,并只保留其中一个。
11. LightGBM 在同时使用多线程(OpenMP)和 Linux 中的分叉时会挂起。
使用 nthreads=1
来禁用 LightGBM 的多线程。OpenMP 存在一个错误,当多线程激活时会导致分叉的会话挂起。一个更昂贵的解决方案是使用新进程而不是使用 fork,然而,请记住这将创建新进程,您必须复制内存并加载库(例如:如果您想分叉当前进程 16 次,那么您将需要在内存中制作 16 份数据集的副本)(参见 Microsoft/LightGBM#1789)。
如果分叉会话内部确实需要多线程,另一种选择是使用Intel工具链编译LightGBM。Intel编译器不受此错误影响。
对于 C/C++ 用户,在 fork 发生之前不能使用任何 OpenMP 功能。如果在 fork 发生之前使用了 OpenMP 功能(例如:使用 OpenMP 进行 fork),OpenMP 将在 forked 会话中挂起。请改用新进程,并根据需要创建新进程来复制内存,而不是进行 fork(或者,使用 Intel 编译器)。
云平台容器服务在使用Linux fork在单个实例上运行多个容器时,可能会导致LightGBM挂起。例如,LightGBM在AWS Batch数组作业中挂起,这些作业`使用ECS代理 <https://aws.amazon.com/batch/faqs>`__ 来管理多个运行中的作业。设置 nthreads=1
可以缓解这个问题。
12. 为什么LightGBM默认不启用早停功能?
早停法涉及选择一个验证集,这是一种特殊的保留集,用于在每次迭代后评估模型的当前状态,以确定训练是否可以停止。
在 LightGBM
中,我们决定要求用户直接指定这个集合。将训练数据分割成训练集、测试集和验证集的方法有很多。
适当的分割策略取决于任务和数据的领域,这是建模者拥有的信息,但作为通用工具的 LightGBM
并不具备。
13. LightGBM 是否支持直接从基于零或基于一的 LibSVM 格式文件加载数据?
LightGBM 支持直接从基于零的 LibSVM 格式文件加载数据。
14. 为什么在使用 MinGW 编译 LightGBM 时,CMake 找不到编译器?
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
这是在使用 MinGW 时 CMake 的一个已知问题。最简单的解决方案是再次运行你的 cmake
命令以绕过 CMake 的一次性停止器。或者你可以将你的 CMake 版本升级到至少 3.17.0。
更多详情请参见 Microsoft/LightGBM#3060。
15. 我可以在哪里找到 LightGBM 的标志以便在我的演示中使用?
你可以在 这里 找到不同文件格式和分辨率的 LightGBM 标志。
16. LightGBM 在运行期间或之后随机崩溃或操作系统挂起。
可能的原因:此行为可能表明您的机器上安装了多个 OpenMP 库,并且它们相互冲突,类似于 常见问题 #10
。
如果你使用的任何 Python 包依赖于 threadpoolctl
,在这种情况下,你也可能在日志中看到以下警告:
/root/miniconda/envs/test-env/lib/python3.8/site-packages/threadpoolctl.py:546: RuntimeWarning:
Found Intel OpenMP ('libiomp') and LLVM OpenMP ('libomp') loaded at
the same time. Both libraries are known to be incompatible and this
can cause random crashes or deadlocks on Linux when loaded in the
same Python program.
Using threadpoolctl may cause crashes or deadlocks. For more
information and possible workarounds, please see
https://github.com/joblib/threadpoolctl/blob/master/multiple_openmp.md
多个 OpenMP 实例之间冲突的详细描述在 以下文档 中提供。
解决方案:假设您正在使用 LightGBM Python 包和 conda 作为包管理器,我们强烈建议使用 conda-forge
频道作为所有 Python 包安装的唯一来源,因为它包含内置的补丁来解决 OpenMP 冲突。其他一些解决方法列在 这里 的“Intel OpenMP 和 LLVM OpenMP 情况的解决方法”部分。
如果这不是你的情况,那么你应该自行查找冲突的 OpenMP 库安装,并只保留其中一个。
R-包
1. 在使用 LightGBM 进行训练的命令在之前的 LightGBM 模型训练过程中发生错误后将无法工作。
在R包的旧版本(v3.3.0``之前),这种情况偶尔会发生,解决方法是运行 ``lgb.unloader(wipe = TRUE)
以移除所有与LightGBM相关的对象。关于此问题的讨论可以在 Microsoft/LightGBM#698 中找到。
自 v3.3.0
版本起,这已不再必要,并且函数 lgb.unloader()
已从 R 包中移除。
2. 我使用了 setinfo()
,尝试打印我的 lgb.Dataset
,现在 R 控制台卡住了!
至少从 LightGBM v3.3.0 开始,这个问题已经解决,打印 Dataset
对象不会再导致控制台冻结。
在旧版本中,避免在调用 setinfo()
后打印 Dataset
。
自 LightGBM v4.0.0 起,setinfo()
已被新方法 set_field()
取代。
3. data.table::data.table()...第二个参数为 NULL
。
如果你在运行 lightgbm
时遇到这个错误,你可能遇到了在 #2715 和之后的 #2989 中报告的相同问题。我们已经发现,在某些情况下,使用 data.table
1.11.x 会导致这个错误。为了解决这个问题,你可以将 data.table
升级到至少 1.12.0 版本。
4. package/dependency ‘Matrix’ is not available ...
2024年4月,Matrix==1.7-0
发布到 CRAN。该版本要求 R (>=4.4.0)
。{Matrix}
是 {lightgbm}
的硬运行时依赖项,因此在任何早于 4.4.0
的 R 版本上运行 install.packages("lightgbm")
会导致类似以下结果。
package ‘Matrix’ is not available for this version of R
在不升级到 R 4.4.0 或更高版本的情况下修复此问题,请手动安装较旧版本的 {Matrix}
。
install.packages('https://cran.r-project.org/src/contrib/Archive/Matrix/Matrix_1.6-5.tar.gz', repos = NULL)
Python-包
1. 从GitHub使用 python setup.py install
安装时出现 错误:设置脚本指定了一个绝对路径
。
备注
截至v4.0.0,lightgbm
不支持直接调用 setup.py
。此回答仅适用于v4.0.0之前的 lightgbm
版本。
error: Error: setup script specifies an absolute path:
/Users/Microsoft/LightGBM/python-package/lightgbm/../../lib_lightgbm.so
setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths.
此错误应在最新版本中得到解决。如果您仍然遇到此错误,请尝试删除您的 Python 包中的 lightgbm.egg-info
文件夹并重新安装,或查看 这个在 stackoverflow 上的帖子。
2. 错误信息:在构建数据集之前无法...
。
我看到类似…的错误信息。
Cannot get/set label/weight/init_score/group/num_data/num_feature before construct dataset
但我已经通过一些代码构建了一个数据集,例如:
train = lightgbm.Dataset(X_train, y_train)
或错误信息如
Cannot set predictor/reference/categorical feature after freed raw data, set free_raw_data=False when construct Dataset to avoid this.
解决方案:由于 LightGBM 构建了用于构建树的 bin mappers,并且在同一个 Booster 中训练和验证数据集共享相同的 bin mappers、分类特征和特征名称等,因此数据集对象在构建 Booster 时被构造。如果你设置了 ``free_raw_data=True``(默认),原始数据(使用 Python 数据结构)将被释放。因此,如果你想:
在构建数据集之前获取标签(或权重/初始分数/组/数据),这与获取
self.label
相同;在构建数据集之前设置标签(或权重/初始分数/组),这与
self.label=some_label_array
相同;在构建数据集之前获取 num_data(或 num_feature),你可以通过
self.data
获取数据。然后,如果你的数据是numpy.ndarray
,可以使用类似self.data.shape
的代码。但在对数据集进行子集化之后不要这样做,因为你会总是得到None
;在构建数据集后设置预测器(或参考/分类特征),您应该设置
free_raw_data=False
或使用相同的原始数据初始化一个 Dataset 对象。
3. 在使用 pip install lightgbm
从 PyPI 安装 LightGBM 后,我随机遇到了段错误(segfaults)。
我们正在尽最大努力提供具有高运行速度且兼容任何硬件、操作系统、编译器等的通用轮子。然而,有时我们无法保证LightGBM在任何特定环境中的使用可能性(参见 Microsoft/LightGBM#1743)。
因此,在遇到段错误的情况下,您应该首先尝试 从源代码编译 使用 pip install --no-binary lightgbm lightgbm
。有关操作系统特定的先决条件,请参见 https://github.com/microsoft/LightGBM/blob/master/python-package/README.rst。
另外,欢迎在我们的 GitHub 仓库中提交新的问题。我们总是会单独查看每个案例,并尝试找到根本原因。
4. 我想通过conda安装LightGBM。我应该选择哪个频道?
我们强烈建议从 conda-forge
频道安装,而不是从 default
频道安装。
有关一些具体示例,请参见 此评论。
此外,自 lightgbm==4.4.0
起,conda-forge
包自动支持基于 CUDA 的 GPU 加速。