とある技術者の徒然草

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

【R言語】ランダムフォレストrangerパッケージ 変数の重要度を可視化

rangerパッケージにおける変数重要度の可視化


kefism.hatenablog.com
こちらの関数がうまく動かなかったため改造して、関数を作成した。

library(tidyverse)
library(ranger)
# random sampling
df <- diamonds
str(df)

n <- nrow(df)
s <- sample(n, n * 0.7)

df_train <- df[s,]
df_test <- df[-s,]

rf_ranger <- ranger(
  formula = price ~. ,
  data = df_train ,
  num.tree = 50,
  mtry = 3,#best = 6
  importance = 'impurity'
)

#関数作成
plotVarImp <- function(ranger_fit, top=NULL){
  library(ggplot2)
#追記 これがないとエラー?
  n <-length(ranger_fit$variable.importance)
  
  pd <- data.frame(Variable = names(ranger_fit$variable.importance[1:n]),
                   Importance = as.numeric(ranger_fit$variable.importance[1:n])) %>% 
    arrange(desc(Importance))
  
  if(is.null(top)){
    pd <- arrange(pd, Importance)
  } else {
    pd <- arrange(pd[1:top,], Importance)
  }
  p <- ggplot(pd, aes(x=factor(Variable, levels=unique(Variable)), y=Importance)) +
    geom_bar(stat="identity") +
    xlab("Variables") + 
    coord_flip()
  plot(p)
}

plotVarImp(rf_ranger)

g1 <- plotVarImp(rf_ranger)

rf_ranger2 <- ranger(
  formula = price ~. ,
  data = df_train ,
  num.tree = 50,
  mtry = 3,#best = 6
  importance = 'permutation'
)

g2 <- plotVarImp(rf_ranger2)

library("gridExtra")
grid.arrange(g1,g2,ncol = 2) # 2列に並べる

f:id:M_taka072:20190203233547p:plain
vi_ranger


グラフの見方

ランダムフォレストの変数重要度は
Gini不純度と順序入れ替え(permutation)に基づく2種類がある。
この二つグラフの上位の変数が全く入れ替わっている場合は、
モデルとして安定していないと判断できる。