ともにゃん的データ分析ブログ

勉強したことの備忘録とかね

XGBoostの概要

XGBoostの凄さに最近気がついたので、もうちょっと詳しく知りたいと思って以下の論文を読みました。

XGBoost: A Scalable Tree Boosting System

せっかくなので、簡単にまとめてみたいと思います。。。と思っていたら結構な量になってしいました。
何か間違い等がありましたらコメントをしていただくか、@kefism へ連絡をしてくださると嬉しいです。

続きを読む

tree系のアルゴリズム(決定木・ランダムフォレスト・xgboostなど)で目的変数に対数を取ってはいけない

よくよく考えたら当たり前のことに気づいたのでメモです。


回帰とかをするときに、例えば目的変数が正の値しか取り得ないような場合、目的変数を対数変換したりします。
そのノリで、タイトルに挙げたのtree系のアルゴリズムを適用するときにも対数変換をしてる人がいるんじゃないでしょうか。僕もその一人です。
ただ、どうも予測値が実測値を過小評価している感がすごかったのです。そこで原因を考えてみました。

続きを読む

【R】データフレームにcharacterやfactorの列が含まれているときに、その列をすべてダミー変数化する関数

タイトル通りの関数を作りましたのでここに置いておきます。
データフレームに文字列が入ってて分析を回せない、、、その列だけ取り出してダミー化してまた結合してって面倒くせえ、、、ってときにお使いください。

{dummies}パッケージを使用していますのでご注意ください。

is.dropは、多重共線性等を気にしたときにTRUEとしてください。1列抜かれます。

convOnlyCharacters2Dummies <- function(data, is.drop = FALSE){
  library(dummies)
  convDummies <- function(data, is.drop){
    N <- ncol(data)
    row_names <- names(data)
    
    names_list <- c()
    new_data <- rep(NA, nrow(data))
    for(n in 1:N){
      unique_value <- sort(unique(data[,n]))
      dummied_data <- dummy(data[,n])
      
      if(is.drop == TRUE){
        new_data <- cbind(new_data, dummied_data[,-ncol(dummied_data)])
        names_list <- c(names_list, 
                        paste(row_names[n], unique_value, sep = ".")[-ncol(dummied_data)])
      } else {
        new_data <- cbind(new_data, dummied_data)
        names_list <- c(names_list, paste(row_names[n], unique_value, sep = "."))
      }
    }
    
    new_data <- as.data.frame(new_data)
    names(new_data) <- c("temp", names_list)
    
    return(new_data[,-1])
  }
  
  varnames <- names(data)
  todummiesnames <- c()
  for(name in varnames){
    if(class(data[[name]]) == "character" || class(data[[name]]) == "factor"){
      todummiesnames <- c(todummiesnames, name)
    } 
  }
  dummies_df <- convDummies(data[, todummiesnames], is.drop)
  df <- cbind(data[, which(!(varnames %in% todummiesnames))], dummies_df)
  
  return(df)
}

【R】ランダムフォレストを実行できるパッケージ{ranger}用の、変数の重要度を可視化する関数

タイトル通りの関数を作ったのでここに置いておきます。
可視化には{ggplot2}を使用しています。

# ranger_fitにrangerで構築したモデルを、topに表示したい変数の個数を指定します。
# topに値を指定しない場合は全変数の重要度を表示します。変数の数が多い時にご指定ください。
plotVarImp <- function(ranger_fit, top=NULL){
  library(ggplot2)
  
  pd <- data.frame(Variable = names(ranger_fit$variable.importance),
                   Importance = as.numeric(ranger_fit$variable.importance)) %>% 
    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)
}

【R】データフレームを渡すと欠損値のある列を抜いてくれる関数

タイトル通りの関数を作ったのでここに置いておきます。

# データフレーム df から欠損値のある列を除去する関数
removeNaCol <- function(df){
  is_na <- apply(df, 2, function(x) sum(is.na(x))) > 0
  return(df[,which(!is_na)])
}