# Python 包的相关介绍
该文档给出了有关 LightGBM Python 软件包的基本演练.
**其它有用的链接列表**
* [Python 例子](https://github.com/Microsoft/LightGBM/tree/master/examples/python-guide)
* [Python API](./Python-API.rst)
* [参数优化](./Parameters-Tuning.rst)
## 安装
安装 Python 软件包的依赖, `setuptools`, `wheel`, `numpy` 和 `scipy` 是必须的, `scikit-learn` 对于 sklearn 接口和推荐也是必须的:
```
pip install setuptools wheel numpy scipy scikit-learn -U
```
参考 [Python-package](https://github.com/Microsoft/LightGBM/tree/master/python-package) 安装指南文件夹.
为了验证是否安装成功, 可以在 Python 中 `import lightgbm` 试试:
```
import lightgbm as lgb
```
## 数据接口
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 = lgb.Dataset('train.svm.bin')
```
**要加载 numpy 数组到 Dataset 中:**
```
data = 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 = lgb.Dataset(csr)
```
**保存 Dataset 到 LightGBM 二进制文件将会使得加载更快速:**
```
train_data = lgb.Dataset('train.svm.txt')
train_data.save_binary('train.bin')
```
**创建验证数据:**
```
test_data = train_data.create_valid('test.svm')
```
or
```
test_data = lgb.Dataset('test.svm', reference=train_data)
```
在 LightGBM 中, 验证数据应该与训练数据一致(格式一致).
**指定 feature names(特征名称)和 categorical features(分类特征):**
```
train_data = 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` 类型的值.
**当需要时可以设置权重:**
```
w = np.random.rand(500, )
train_data = lgb.Dataset(data, label=label, weight=w)
```
或者
```
train_data = 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=True` (默认为 `True`)
2. 在 `Dataset` 被构造完之后手动设置 `raw_data=None`
3. 调用 `gc`
## 设置参数
LightGBM 可以使用一个 pairs 的 list 或一个字典来设置 [参数](./Parameters.rst). 例如:
* 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)
```
该模型将开始训练, 直到验证得分停止提高为止. 验证错误需要至少每个 <cite>early_stopping_rounds</cite> 减少以继续训练.
如果提前停止, 模型将有 1 个额外的字段: <cite>bst.best_iteration</cite>. 请注意 <cite>train()</cite> 将从最后一次迭代中返回一个模型, 而不是最好的一个.
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 = np.random.rand(7, 10)
ypred = bst.predict(data)
```
如果在训练过程中启用了提前停止, 可以用 <cite>bst.best_iteration</cite> 从最佳迭代中获得预测结果:
```
ypred = bst.predict(data, num_iteration=bst.best_iteration)
```