実際にランダムフォレストを使って、DMへの反応予測モデルを作成していきます。

フロー

  • データセットの作成
  • モデル作成用、検証用にデータセットを分離
  • モデル作成用のデータセットでモデリング
  • モデルでの予測値(検証用データの各要因をモデルに適用した結果)と検証用データの比較
  • モデル内容

参考:
https://www.kaggle.com/hmboxwala/trying-glmnet-1

# ライブラリの読み込み
library(readr)
library(dplyr)
library(ggplot2)
library(randomForest)

# データの読み込み
data <- read_csv("./data/case05_train.csv")

データセットの作成

# 欠損値の処理
data[is.na(data)] <- -1

# データ型の変換
feature.names <- names(data)[2:ncol(data)-1]
for (f in feature.names) {
  if (class(data[[f]])=="character") {
    levels <- unique(c(data[[f]]))
    data[[f]] <- as.integer(factor(data[[f]], levels=levels))
  }
}

データセットの分離

# すべてのデータを使うと時間がかかるので調整
data <- data[sample(nrow(data), 20000),]

#モデリング用と検証用にデータセットを分離
train.index <- sort(sample(1:nrow(data), size = 15000))
train <- data[train.index,]
test  <- data[-train.index,]

モデリング

ランダムフォレストでモデリング

# この処理は時間がかかります
# チューニング
train.tune <- tuneRF(train[,feature.names], factor(train$target),  doBest = T)
## mtry = 43  OOB error = 23.5%
## Searching left ...
## mtry = 22    OOB error = 23.29%
## 0.008794326 0.05
## Searching right ...
## mtry = 86    OOB error = 23.59%
## -0.003687943 0.05

# モデリング
train.rf <- randomForest(as.factor(target) ~., data = train, mtry = train.tune$mtry )

モデルの評価(検証用データと予測値の比較)

# 検証用データにモデルを適用
test$pred <- predict(train.rf, test)

group_by(test,pred,target) %>%
  summarise(count = n()) %>%
  ggplot(aes(x = as.factor(target), y = count, fill = as.factor(pred))) +
  geom_bar(stat = "identity") 

モデルの内容

各要因の影響度合い

varImpPlot(train.rf)

<< 1.ビジネスの理解 << 2.データの理解 


「データから価値を創造する」一般社団法人データマーケティングラボラトリー

Copyright© DML All Rights Reserved.