LoginSignup
8
8

More than 3 years have passed since last update.

LightGBM by R on Windows 10

Last updated at Posted at 2019-03-23

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かつ判別、回帰とも簡易チュートリアル

8
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8