LightGBM使用小结

最近在参加一些数据竞赛,诸如腾讯校园算法大赛和蚂蚁金服风险识别大赛,在参赛的过程中,发现原生的LightGBM比sklearn接口的LIghtGBM方便的不要太多。因此,趁此之际,总结一波。

数据接口

加载numpy数组到Dataset中:
1
2
3
4
5
# 500个样本,每一个包含10个特征
data = np.random.rand(500, 10)
# 二元目标变量,0和1
label = np.random.randint(2, size=500)
train_data = lgb.Dataset(data, label=label)
加载libsvm文本文件或者LightGBM二进制文件到Dataset中:
1
train_data = lgb.Dataset('train.svm.bin')
  • 保存Dataset到LightGBM二进制文件将会使得加载更快速
    1
    2
    train_data = lgb.Dataset(data, label=label)
    train_data.save_binary('train.bin')
指定feature names(分类名称)和categorical features(分类特征):
1
train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3'])

LightGBM可以直接使用categorical features作为输入,它不需要被转换为one-hot encoding(独热编码),并且它比one-hot更快。

内存的高使用:

LightGBM中的Dataset对象由于只需要保存discrete bins(离散的数据块),因此,它具有很好的内存效率。然而,Numpy/Array/Pandas对象的内存开销较大,如果更关心内存消耗的时候,可以根据以下方式来节省内存:

  • 在构造Dataset时设置free_raw_data=True (默认为True)
  • Dataset被构造完之后手动设置raw_data=None
  • 调用gc
验证集的产生

在LightGBM中,验证集的生成必须依赖于训练集,可用如下语句生成验证集:

1
val_data = train_data.create_valid(valid_x, label=valid_y)

设置参数

LightGBM可以使用一个pair的list或一个字典来设置参数,例如:

1
2
param = {'num_leaves': 31, 'num_trees': 100, 'objective': 'binary'}
param['metric'] = 'auc'

  • 可以指定多个eval指标
    1
    param['metric'] = ['auc', 'binary_logloss']

训练

  • 训练一个模型时,需要一个parameter list(参数列表)和dataset(数据集):

    1
    2
    3
    4
    # 迭代次数
    num_round = 10
    # valid_sets中包含训练集和验证集 即可看到过拟合现象
    bst = lgb.train(param, train_data, num_round, valid_sets=[train_data, test_data])
  • 在训练完成后,可以使用如下方式来保存模型:

    1
    bst.save_model('model.txt')
  • 已保存模型也可以使用如下方式来加载

    1
    bst = lgb.Booster(model_file='model.txt')

交叉验证

使用5-折方式的交叉验证来进行训练(4个训练集,1个测试集):

1
2
num_round = 10
lgb.cv(param, train_data, num_round, nfold=5)

早停策略

如果含有验证集,则可以使用早停策略来找到最佳参数的boosting rounds(梯度次数)。提前停止需要在valid_sets中至少有一个集合,如果有多个,它们都会被使用:

1
2
bst = lgb.train(param, train_data, num_round, valid_sets=valid_sets, early_stopping_rounds=10)
bst.save_model('model.txt', num_iteration=bst.best_iteration)

该模型将开始训练,直到验证得分停止提高为止。

预测

已经训练或加载的模型都可以对数据集进行预测:

1
2
data = np.random.rand(7, 10)
y_pred = bst.predict(data)

如果在训练过程中启用了提前停止,可以用bst.best_iteration从最佳迭代中获得预测结果:

1
y_pred = bst.predict(data, num_iteration=bst.best_iteration)

Compartir Comentarios