三、进阶

3.1 缺失值处理

  1. lightgbm 默认处理缺失值,你可以通过设置use_missing=False 使其无效。

  2. lightgbm 默认使用NaN 来表示缺失值。你可以设置zero_as_missing 参数来改变其行为:

    • zero_as_missing=True 时:NaN0 (包括在稀疏矩阵里,没有显示的值) 都视作缺失值。
    • zero_as_missing=False 时:只有NaN 才是缺失值(默认的行为)

3.2 分类特征支持

  1. 当使用local categorical 特征(而不是one-hot 编码的特征)时,lightgbm 可以提供良好的精确度。

  2. 要想使用categorical 特征,则启用categorical_feature 参数(参数值为列名字符串或者列名字符串的列表)

    • 首先要将categorical 特征的取值转换为非负整数,而且如果是连续的范围更好
    • 然后使用min_data_per_groupcat_smooth 去处理过拟合(当样本数较小,或者category 取值范围较大时)

3.3 LambdaRank

  1. LambdaRank 中,标签应该是整数类型,较大的数字代表更高的相关性。

    如:0表示差、1 表示一般、2 表示好、3 表示完美

  2. 使用max_position 设置 NDCG 优化的位置

  3. label_gain 设置增益的int 标签。

3.4 并行学习

  1. lightgbm 已经提供了以下并行学习算法:

    并行算法开启方式
    数据并行tree_learner=’data’
    特征并行tree_learner=’feature’
    投票并行tree_learner=’voting’

    tree_learner 默认为 'serial'。 表示串行学习。

    这些并行算法适用于不同场景:

     样本数量较小样本数量巨大
    特征数量较小特征并行数据并行
    特征数量巨大特征并行投票并行
  2. 构建并行版本:

    默认的并行版本基于socket 的并行学习,如果需要基于MPI 的并行版本,则需要手动编译

    • 首先收集所有想要运行并行学习的机器的IP,并指定一个TCP 端口号(要求在这些机器上,这些端口没有被防火墙屏蔽掉)。

      然后将这些IP 和端口写入到文件中(假设文件名为ip.txt ):

      1. ip1 port
      2. ip2 port

      其中要求:

      • 数量必须和num_machines 或者num_machine 参数相等
      • 必须包含127.0.0.1 (或者包含localhost 对应的其它ip),它代表本地
      • port 必须和local_listen_port 或者local_port 参数相等
    • 然后在配置文件中编译以下参数:

      1. tree_learner= 你的并行算法
      2. num_machines= 并行计算的机器的数量
      3. machine_list_file=ip.txt #要求每个并行计算的机器占一行
      4. local_listen_port=port
    • 然后将数据文件、可执行文件、配置文件、以及ip.txt 拷贝到所有并行学习的机器上。

    • 在所有机器上运行以下命令:

      • windowslightgbm.exe config=配置文件
      • Linux: ./lightgbm config=配置文件
  3. 并行学习的注意事项:

    • 当前Python 版本不支持并行,必须采用lightgbm 二进制的方式。

    • 在执行推断时,要求数据的特征与训练时的特征完全一致

      • 必须都包含label 列。推断时,该列的数值不起作用,仅仅是个占位符。
      • 如果有 header,则列的先后顺序不重要。如果没有header,则必须顺序也要保持相同。