# 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)
```