AI_Python|LightGBM Python 软件包的基本演练.

Python 包的相关介绍 其它有用的链接列表

  • Python 例子
  • Python API
  • 参数优化
  • 视频介绍
安装 安装 Python 软件包的依赖, setuptools, wheel, numpyscipy 是必须的, scikit-learn 对于 sklearn 接口和推荐也是必须的:
pip install setuptools wheel numpy scipy scikit-learn -U

pip install lightgbm

更多内容参考 Python-package 安装指南文件夹.
为了验证是否安装成功, 可以在 Python 中 import lightgbm 试试:
import lightgbm as lgb

特性及功能 请参考: http://lightgbm.apachecn.org/cn/latest/Features.html
数据接口 LightGBM Python 模块能够使用以下几种方式来加载数据:
  • libsvm/tsv/csv txt format file(libsvm/tsv/csv 文本文件格式)
  • Numpy 2D array, pandas object(Numpy 2维数组, pandas 对象)
  • LightGBM binary file(LightGBM 二进制文件)
加载后的数据存在 Dataset 对象中.
要加载 ligsvm 文本文件或 LightGBM 二进制文件到 Dataset 中:
train_data = https://www.it610.com/article/lgb.Dataset('train.svm.bin')

要加载 numpy 数组到 Dataset 中:
data = https://www.it610.com/article/np.random.rand(500, 10)# 500 个样本, 每一个包含 10 个特征 label = np.random.randint(2, size=500)# 二元目标变量,0 和 1 train_data = lgb.Dataset(data, label=label)

要加载 scpiy.sparse.csr_matrix 数组到 Dataset 中:
csr = scipy.sparse.csr_matrix((dat, (row, col))) train_data = https://www.it610.com/article/lgb.Dataset(csr)

保存 Dataset 到 LightGBM 二进制文件将会使得加载更快速:
train_data = https://www.it610.com/article/lgb.Dataset('train.svm.txt') train_data.save_binary('train.bin')

创建验证数据:
test_data = https://www.it610.com/article/train_data.create_valid('test.svm')

or
test_data = https://www.it610.com/article/lgb.Dataset('test.svm', reference=train_data)

在 LightGBM 中, 验证数据应该与训练数据一致(格式一致).
指定 feature names(特征名称)和 categorical features(分类特征):
train_data = https://www.it610.com/article/lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3'])

LightGBM 可以直接使用 categorical features(分类特征)作为 input(输入). 它不需要被转换成 one-hot coding(独热编码), 并且它比 one-hot coding(独热编码)更快(约快上 8 倍)
注意: 在你构造 Dataset 之前, 你应该将分类特征转换为 int 类型的值.
【AI_Python|LightGBM Python 软件包的基本演练.】当需要时可以设置权重:
w = np.random.rand(500, ) train_data = https://www.it610.com/article/lgb.Dataset(data, label=label, weight=w)

或者
train_data = https://www.it610.com/article/lgb.Dataset(data, label=label) w = np.random.rand(500, ) train_data.set_weight(w)

并且你也可以使用 Dataset.set_init_score() 来初始化 score(分数), 以及使用 Dataset.set_group() ;来设置 group/query 数据以用于 ranking(排序)任务.
内存的高使用:
LightGBM 中的 Dataset 对象由于只需要保存 discrete bins(离散的数据块), 因此它具有很好的内存效率. 然而, Numpy/Array/Pandas 对象的内存开销较大. 如果你关心你的内存消耗. 您可以根据以下方式来节省内存:
  1. 在构造 Dataset 时设置 free_raw_data=https://www.it610.com/article/True (默认为 True
  2. Dataset 被构造完之后手动设置 raw_data=https://www.it610.com/article/None
  3. 调用 gc
设置参数 LightGBM 可以使用一个 pairs 的 list 或一个字典来设置 参数. 例如:
  • Booster(提升器)参数:
    param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'} param['metric'] = 'auc'

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

训练 训练一个模型时, 需要一个 parameter list(参数列表)和 data set(数据集):
num_round = 10 bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])

在训练完成后, 可以使用如下方式来存储模型:
bst.save_model('model.txt')

训练后的模型也可以转存为 JSON 的格式:
json_model = bst.dump_model()

以保存模型也可以使用如下的方式来加载.
bst = lgb.Booster(model_file='model.txt')#init model

交叉验证 使用 5-折 方式的交叉验证来进行训练(4 个训练集, 1 个测试集):
num_round = 10 lgb.cv(param, train_data, num_round, nfold=5)

提前停止 如果您有一个验证集, 你可以使用提前停止找到最佳数量的 boosting rounds(梯度次数). 提前停止需要在 valid_sets 中至少有一个集合. 如果有多个,它们都会被使用:
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)

该模型将开始训练, 直到验证得分停止提高为止. 验证错误需要至少每个 early_stopping_rounds 减少以继续训练.
如果提前停止, 模型将有 1 个额外的字段: bst.best_iteration. 请注意 train() 将从最后一次迭代中返回一个模型, 而不是最好的一个.
This works with both metrics to minimize (L2, log loss, etc.) and to maximize (NDCG, AUC). Note that if you specify more than one evaluation metric, all of them will be used for early stopping.
这与两个度量标准一起使用以达到最小化(L2, 对数损失, 等等)和最大化(NDCG, AUC). 请注意, 如果您指定多个评估指标, 则它们都会用于提前停止.
预测 已经训练或加载的模型都可以对数据集进行预测:

# 7 个样本, 每一个包含 10 个特征 data = https://www.it610.com/article/np.random.rand(7, 10) ypred = bst.predict(data)

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

完整例子:
# coding: utf-8 # pylint: disable = invalid-name, C0111 import json import lightgbm as lgb import pandas as pd from sklearn.metrics import mean_squared_error

# load or create your dataset print('Load data...')

# download data from https://github.com/Microsoft/LightGBM/tree/master/examples/regression df_train = pd.read_csv('../regression/regression.train', header=None, sep='\t') df_test = pd.read_csv('../regression/regression.test', header=None, sep='\t')y_train = df_train[0].values y_test = df_test[0].values X_train = df_train.drop(0, axis=1).values X_test = df_test.drop(0, axis=1).values# create dataset for lightgbm lgb_train = lgb.Dataset(X_train, y_train) lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)# specify your configurations as a dict params = { 'task': 'train', 'boosting_type': 'gbdt', 'objective': 'regression', 'metric': {'l2', 'auc'}, 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.9, 'bagging_fraction': 0.8, 'bagging_freq': 5, 'verbose': 0 }print('Start training...') # train gbm = lgb.train(params, lgb_train, num_boost_round=20, valid_sets=lgb_eval, early_stopping_rounds=5)print('Save model...') # save model to file gbm.save_model('model.txt')print('Start predicting...') # predict y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration) # eval print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)

    推荐阅读