【R言語】LightGBMでマルチクラス分類
RにLightGBMをインストール
まずインストールが面倒である。
以下のHPに沿ってインストールしたが何故かエラーが起きた
対策
・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)
・ 感想
初心者にはランダムフォレストのほうが使いやすそうだ。。