LightGBM FAQ 常见问题解答

内容


关键问题

在使用 LightGBM 遇到坑爹的问题时(程序奔溃,预测结果错误,无意义输出…),你应该联系谁?

如果你的问题不是那么紧急,可以把问题放到 Microsoft/LightGBM repository.

如果你的问题急需要解决,首先要明确你有哪些错误:

  • 你认为问题会不会复现在 CLI(命令行接口),R 或者 Python上 ?
  • 还是只会在某个特定的包(R 或者 Python)上出现?
  • 还是会在某个特定的编译器(gcc 或者 MinGW)上出现?
  • 还是会在某个特定的操作系统(Windows 或者 Linux)上出现?
  • 你能用一个简单的例子复现这些问题吗?
  • 你能(或者不能)在去掉所有的优化信息和在 debug 模式下编译 LightGBM 时复现这些问题吗?

当出现问题的时候,根据上述答案,随时可以@我们(不同的问题可以@不同的人,下面是各种不同类型问题的负责人),这样我们就能更快地帮助你解决问题。

记住这是一个免费的/开放的社区支持,我们可能不能做到全天候的提供帮助.

LightGBM

  • 问题 1:我可以去哪里找到关于LightGBM参数的更多详细内容?
  • 方法 1:可以看一下这个 Parameters and Laurae++/Parameters 网站。

  • 问题 2:在一个有百万个特征的数据集中,(要在很长一段时间后才开始训练或者)训练根本没有开始。
  • 方法 2:对 bin_construct_sample_cnt 用一个较小的值和对 min_data 用一个较大的值。

  • 问题 3:当在一个很大的数据集上使用LightGBM,我的电脑会耗尽内存。
  • 方法 3:很多方法啊:将 histogram_pool_size 参数设置成你想为LightGBM分配的MB(histogram_pool_size + dataset size = approximately RAM used), 减少 num_leaves 或减少 max_bin (点这里 Microsoft/LightGBM#562)。

  • 问题 4:我使用Windows系统。我应该使用Visual Studio或者MinGW编译LightGBM吗?
  • 方法 4:推荐使用 Visual Studio,因为它的性能更好。

  • 问题 5:当使用LightGBM,我每次运行得到的结果都不同(结果不能复现)。
  • 方法 5:这是一个很正常的问题,我们/你也无能为力。 你可以试试使用 gpu_use_dp = true 来复现结果(点这里 Microsoft/LightGBM#560)。 你也可以使用CPU的版本试试。

  • 问题 6:Bagging在改变线程的数量时,是不能复现的。
  • 方法 6:由于LightGBM Bagging是多线程运行的,它的输出依赖于使用线程的数量。 There is no workaround currently

  • 问题 7:我试过使用随机森林模式,LightGBM崩溃啦!
  • 方法 7:这是设计的问题。 你必须使用 bagging_fractionfeature_fraction 与1不同,要和 bagging_freq 结合使用。 看这个例子 this thread

  • 问题 8:当在一个很大的数据集上和很多核心系统使用LightGBMWindows系统时,CPU不是满负荷运行(例如只使用了10%的CPU)。
  • 方法 8:请使用 Visual Studio, 因为Visual Studio可能 10x faster than MinGW,尤其是在很大的树上。

R 包

  • 问题 1:在训练先前的LightGBM模型时一个错误出现后,任何使用LightGBM的训练命令都不会起作用。
  • 方法 1:在R控制台中运行 lgb.unloader(wipe = TRUE),再重新创建LightGBM数据集(这会消除所有与LightGBM相关的变量)。 由于这些指针,选择不去消除这些变量不会修复这些错误。 这是一个已知的问题: Microsoft/LightGBM#698

  • 问题 2:我使用过 setinfo ,试过打印我的 lgb.Dataset ,结果R控制台无响应。
  • 方法 2:在使用 setinfo 后避免打印 lgb.Dataset. 这是一个已知的bug:Microsoft/LightGBM#539

Python 包

  • 问题 1:当从GitHub使用 python setup.py install 安装,我看到如下错误信息。

    ``` error:错误:安装脚本指定绝对路径: /Users/Microsoft/LightGBM/python-package/lightgbm/../../lib_lightgbm.so setup()参数必须 一直 是/-分离路径相对于setup.py目录, 从不 是绝对路径。

    ```

  • 方法 1:这个错误在新版本中应该会被解决。 如果你还会遇到这个问题,试着在你的Python包中去掉 lightgbm.egg-info 文件夹,再重装一下, 或者对照一下这个 this thread on stackoverflow


  • 问题 2:我看到错误信息如下

    ``` 在构建数据集前不能 get/set label/weight/init_score/group/num_data/num_feature。

    ```

    但是我已经使用下面的代码构建数据集

    ``` train = lightgbm.Dataset(X_train, y_train)

    ```

    或如下错误信息

    ``` 在释放原始数据后,不能设置predictor/reference/categorical特征。可以在创建数据集时设置free_raw_data=False避免上面的问题。

    ```

  • 方法2: 因为LightGBM创建bin mappers来构建树,在一个Booster内的train和valid数据集共享同一个bin mappers,类别特征和特征名等信息,数据集对象在创建Booster时候被创建。 如果你设置 free_raw_data=True (默认),原始数据(在Python数据结构中的)将会被释放。 所以,如果你想要:

    • 在创建数据集前get label(or weight/init_score/group),这和get self.label 操作相同。
    • 在创建数据集前set label(or weight/init_score/group),这和 self.label=some_label_array 操作相同。
    • 在创建数据集前get num_data(or num_feature),你可以使用 self.data 得到数据,然后如果你的数据是 numpy.ndarray,使用一些类似 self.data.shape 的代码。
    • 在构建数据集之后set predictor(or reference/categorical feature),你应该设置 free_raw_data=False 或使用同样的原始数据初始化数据集对象。