LightGBM by R on Windows 10 

LightGBMのRのライブラリがCRANではなく、インストールから予測実施までがそれほどわかりやすくはなかったので、以下にまとめました。

# セットアップ
[Windows 10 で GPU（CUDA）を利用するLightGBM のR-packageをセットアップする](http://kato-kohaku-0.hatenablog.com/entry/2018/08/29/004250)
を参考にさせていただいたが、私の環境は
[Windows10にCUDA9.0とPyCUDAをインストールしてテストが動きcupyインストールに苦労してChainerのMNISTチュートリアルでGPU使用で速度が約6倍となるのを確かめるまで](https://qiita.com/aokikenichi/items/dd6cb0d611784581c001)
を実施済みだったので重複する箇所は端折った。
で、[Windows 10 で GPU（CUDA）を利用するLightGBM のR-packageをセットアップする](http://kato-kohaku-0.hatenablog.com/entry/2018/08/29/004250)にある動作チェック

```r
library(lightgbm)
## Loading required package: R6
data(agaricus.train, package='lightgbm')
train <- agaricus.train
dtrain <- lgb.Dataset(train$data, label=train$label)
## Loading required package: Matrix
params <- list(objective="regression", metric="l2")
model <- lgb.cv(params, dtrain, 10, nfold=5, min_data=1, learning_rate=1, early_stopping_rounds=10)
```
公式[LightGBM R-package README](https://github.com/Microsoft/LightGBM/tree/master/R-package)も同じ。

は正常稼働したのだが、予測は？ってなって簡易チュートリアルが見つかりにくかったので調べた。

# 判別
## 2値
c.f. [LightGBM/R-package/demo/basic_walkthrough.R](https://github.com/Microsoft/LightGBM/blob/6488f319f243f7ff679a8e388a33e758c5802303/R-package/demo/basic_walkthrough.R)

```r
data(agaricus.train, package = "lightgbm")
data(agaricus.test, package = "lightgbm")
train <- agaricus.train
test <- agaricus.test
```

train, testともlist型。train\$dataがmatrix型の説明変数。train\$labelがnumeric型の目的変数。
なので、他のデータを使うときは0/1のnumeric型の目的変数と、matrix型の説明変数を用意すればよい。
2値でも0/1ではなく、1/2では駄目なようだ。

```r
bst <- lightgbm(data = train$data,
                label = train$label,
                num_leaves = 4,
                learning_rate = 1,
                nrounds = 2,
                objective = "binary")
```
でモデル構築。

```r
dtrain <- lgb.Dataset(data = train$data,
                      label = train$label)
bst <- lightgbm(data = dtrain,
                num_leaves = 4,
                learning_rate = 1,
                nrounds = 2,
                objective = "binary")
```
と、dgb.Dtasetを作成して投入する方法もある。

```r
pred <- predict(bst, test$data)
#plot(pred, test$label)
pred[pred >=0.5]<-1; pred[pred < 0.5]<-0
table(test$label, pred)

   pred
      0   1
  0 813  22
  1  13 763
```
で予測が可能。

## マルチ
c.f. [LightGBM/R-package/demo/multiclass.R](https://github.com/Microsoft/LightGBM/blob/6488f319f243f7ff679a8e388a33e758c5802303/R-package/demo/multiclass.R)

```r
iris$Species<-as.numeric(as.factor(iris$Species)) -1
```
マルチクラスの場合も0, 1, 2, ... というような0始まりのnumerical型である必要がある。

```r
library(lightgbm)

train <- as.matrix(iris[c(1:40, 51:90, 101:140), ])
test <- as.matrix(iris[c(41:50, 91:100, 141:150), ])
dtrain <- lgb.Dataset(data = train[, 1:4], label = train[, 5])
dtest <- lgb.Dataset.create.valid(dtrain, data = test[, 1:4], label = test[, 5])
valids <- list(test = dtest)

params <- list(objective = "multiclass", metric = "multi_error", num_class = 3)
model <- lgb.train(params,
                   dtrain,
                   100,
                   valids,
                   min_data = 1,
                   learning_rate = 1,
                   early_stopping_rounds = 10)
my_preds <- predict(model, test[, 1:4], reshape = T)
```
予測結果は、1行目のデータのclass1の確率、class2の確率、class3の確率、2行目のデータの……と出力されてしまうので、行毎クラス毎の行列で出す場合は reshape = T が必要。

```r
table(test[, 5], max.col(my_preds))

     1  2  3
  0  9  1  0
  1  0 10  0
  2  0  0 10
```
確率の一番高い列を取る max.col() でどのクラスを予測したかが分かる。

# 回帰

下記は予測までのデモが見つからず、下記で試してみた。

```r
library(lightgbm)

train <- as.matrix(iris[c(1:40, 51:90, 101:140), 1:4])
test <- as.matrix(iris[c(41:50, 91:100, 141:150), 1:4])
dtrain <- lgb.Dataset(data = train[, 1:3], label = train[, 4])
dtest <- lgb.Dataset.create.valid(dtrain, data = test[, 1:3], label = test[, 4])

params <- list(objective="regression", metric="l2")

model <- lgb.train(params, dtrain, 10, nfold=5, min_data=1, learning_rate=1)
my_preds <- predict(model, test)
plot(test[, 4], my_preds)
```
![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/116049/9082944d-5f22-78a0-f7e6-3dc198f4bab0.png)

予測出来ている。

# 参考
## 日本語
- 毎度分かりやすい、Rで学ぶ統計学
    - [機械学習アルゴリズム〜LightGBM〜](http://rtokei.tech/machine-learning/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%80%9Clightgbm%E3%80%9C/)

### 日本語だがPython
- Pythonだが丁寧な解説R化も楽そう
    - [LightGBM ハンズオン - もう一つのGradient Boostingライブラリ](https://qiita.com/TomokIshii/items/3729c1b9c658cc48b5cb)

## 英語
- KAGGLERの解説
    - [LightGBM in R](https://www.kaggle.com/andrewmvd/lightgbm-in-r)
- RPubsにあった解説
    - [LightGBM](https://github.com/Microsoft/LightGBM/tree/master/R-package)

で本記事が日本語でRかつ判別、回帰とも簡易チュートリアル