とある技術者の徒然草

生産技術者の適当な日記(統計言語Rに関するメモがメイン)

【R言語】LightGBMでマルチクラス分類

RにLightGBMをインストール

まずインストールが面倒である。
以下のHPに沿ってインストールしたが何故かエラーが起きた

lightgbm.readthedocs.io

対策

・QAで書いてあった以下の対策でうまくインストールすることができた。

https://github.com/Microsoft/LightGBM/issues/1678
1. open the C:\LightGBM\R-package\src\install.libs.R 1. set use_precompile <- TRUE 1. modify if (!file.copy("../../CMakeLists.txt", "../CMakeLists.txt", overwrite = TRUE)){ stop("Copying CMakeLists failed") } 1. Rscript> install.packages(file.path("C:", "LightGBM", "R-package", fsep = "\"), repos = NULL, type = "source") done!

irisデータセットにlightGBMを使用してマルチクラス分類してみる

library(caret)
library(lightgbm)
library(knitr)
library(tidyverse)
library(data.table)
library(DT)

#factorを数値化 0が基準
iris$Species <- iris$Species %>% as.factor() %>% as.numeric() - 1

inTrain <- createDataPartition(iris$Species, p=.7, list = F)

train <- iris[inTrain,]
test <- iris[-inTrain,]

lll<-data.matrix(train[, 1:4])

data_train <- lgb.Dataset(data = data.matrix(train[, 1:4]), label = train[, 5])

params <- list(objective = "multiclass", metric = "multi_logloss", num_class = 3)#metric が重要
model <- lgb.train(params,
                   data_train,
                   100,
                   min_data = 1,
                   is_sparse=FALSE,#kari
                   colnames=TRUE,#
                   learning_rate = .1)

result <- predict(model, data.matrix(test[, 1:4]))
result2 <- predict(model, data.matrix(test[, 1:4]),reshape = TRUE)#TRUEだとマトリックスとなる

summary(train)
nrow(test)

list <- list()#からのリストを作成
list2 <- list()#からのリストを作成


#n,n+1,n+2の値で最大値を探して、クラス3,2,1に変換する
i <- 1
for (i in 1:nrow(test)){
  max = max(result[(i-1)*3+1], result[(i-1)*3+2], result[(i-1)*3+3])
  list[i] <- if_else(max == result[(i-1)*3+3], 3, if_else(max == result[(i-1)*3+2], 2, 1))
}

pred_df <- data.frame()

#アマトリックスで返した方が分かりやすい
i <- 1
for(i in 1:nrow(test)){
  pred_df[i,1] <- which.max(result2[i,])-1
}

pred <- list %>% as.numeric() - 1
pred2 <- list2 %>% as.numeric() - 1


#Confusion matrix
pred_table <- table(pred, test$Species)

pred_table <- table(pred_df$V1, test$Species)


confusionMatrix(pred_table)

・ 感想
初心者にはランダムフォレストのほうが使いやすそうだ。。