LightGBM by R on Windows 10

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


セットアップ

Windows 10 で GPU(CUDA)を利用するLightGBM のR-packageをセットアップする

を参考にさせていただいたが、私の環境は

Windows10にCUDA9.0とPyCUDAをインストールしてテストが動きcupyインストールに苦労してChainerのMNISTチュートリアルでGPU使用で速度が約6倍となるのを確かめるまで

を実施済みだったので重複する箇所は端折った。

で、Windows 10 で GPU(CUDA)を利用するLightGBM のR-packageをセットアップするにある動作チェック

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も同じ。

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


判別


2値

c.f. LightGBM/R-package/demo/basic_walkthrough.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では駄目なようだ。

bst <- lightgbm(data = train$data,

label = train$label,
num_leaves = 4,
learning_rate = 1,
nrounds = 2,
objective = "binary")

でモデル構築。

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を作成して投入する方法もある。

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

iris$Species<-as.numeric(as.factor(iris$Species)) -1

マルチクラスの場合も0, 1, 2, ... というような0始まりのnumerical型である必要がある。

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 が必要。

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

1 2 3
0 9 1 0
1 0 10 0
2 0 0 10

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


回帰

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

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

予測出来ている。


参考


日本語


日本語だがPython


英語

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