【ウーバーイーツ】配達データでランダムフォレスト【沖縄市】
これまでにバギングとブースティングを用いて予測モデルを作成し、誤判別率を算出してみた。


結果は、バギングモデルの誤判別率が0.4、ブースティングモデルの誤判別率が0.36となった。
今回もこれまでと同様に、誤判別率を改善できるかやってみる。
参考書籍・資料

主な参考箇所 16 集団学習
概要
扱うデータの確認
↓
ランダムフォレストについて調べる
↓
ランダムフォレストを用いて予測モデルを作成
使用するデータ
使用するデータは、私の配達データ。
期間は、2021年5月10日~10月31日。
上記期間の総配達件数は、1528件。※ ダブルピックも1件とカウント。
扱うデータの確認
前回同様に、3店舗の配達データを学習用データとテストデータに分ける。
合計配達単価 | ベース料金 | 配達調整金 | 店舗 | |
1 | 301 | 127 | 207 | マクドナルド コザ十字路店(A) |
2 | 329 | 132 | 219 | マクドナルド コザ十字路店(A) |
… | … | … | … | … |
62 | 406 | 150 | 284 | らあめん花月嵐 美里(B) |
… | … | … | … | … |
135 | 632 | 185 | 230 | A&W 美里店(C) |
… | … | … | … | … |
学習用データ↓
store | ベース料金 | 配達調整金 | 店舗 | |
1 | A | 127 | 207 | マクドナルド コザ十字路店 |
3 | A | 135 | 373 | マクドナルド コザ十字路店 |
5 | A | 115 | 272 | マクドナルド コザ十字路店 |
… | … | … | … | … |
テスト用データ↓
store | ベース料金 | 配達調整金 | 店舗 | |
2 | A | 132 | 219 | マクドナルド コザ十字路店 |
4 | A | 126 | 181 | マクドナルド コザ十字路店 |
6 | A | 125 | 378 | マクドナルド コザ十字路店 |
… | … | … | … | … |
ランダムフォレストについて
今回は、ランダムフォレスト(RF)という手法を用いて、モデルの精度向上を目指す。
バギングとRFの大きな違いは、バギングではすべての変数を用いるが、RFでは変数をランダムサンプリングしたサブセットを用いるので、多次元データ解析に向いている点である。ランダムサンプリングする変数の数Mは、ユーザが自由に設定することができる。ブレイマンは、M としては変数の数の正の平方根をとることを勧めている。
ランダムフォレストの説明文を見ると、「RFでは変数をランダムサンプリングしたサブセットを用いるので……」とある。今回のデータの説明変数は2つしかないため、ランダムフォレストを使う利点はなさそうに見える。
が、せっかくなので、やってみる。
ランダムフォレストで予測モデルを作成
書籍にならって、ランダムフォレストで予測モデルを作成してみる。
install.packages("randomForest") library(randomForest) set.seed(20) data.train <- read.table("clipboard",header = TRUE) data.train$store <- as.factor(data.train$store) data.test <- read.table("clipboard",header = TRUE) data.test$store <- as.factor(data.test$store) data.rf <- randomForest(store ~ .,data=data.train) data.rfp <- predict(data.rf,data.test[,-1]) (data.rft<-table(data.test[,1],data.rfp)) (1-sum(diag(data.rft))/sum(data.rft))
結果↓
A | B | C | |
A | 16 | 3 | 11 |
B | 3 | 29 | 5 |
C | 9 | 11 | 8 |
Aと判別したデータが、実際にAだった場合が28個中16個。
Bと判別したデータが、実際にBだった場合が43個中29個。
Cと判別したデータが、実際にCだった場合が24個中8個。
正しく判別できた個数が53個、正しく判別できなかった個数が42個となった。誤判別率は0.44となった。
今まで一番悪い結果になった。
追記
ランダムフォレストを用いた予測モデルの詳細を見てみる。
木の数と誤判別率の関係を確認する。
用いた木の数と誤判別率との関係は、関数plotのグラフから読み取ることができる。横軸が木の数で、縦軸が誤り率である。次のコマンドで作成した図16.1から、木の数が200前後を超えると誤判別率は比較的安定することが読み取れる。
plot(data.rf)
木の数約100以降から、誤り率が安定してきているのが分かる。
変数の重要度を確認してみる(2つしかないが、)。
RFは、判別・回帰における変数の重要度としてジニ分散指標を計算する。重要度は$importanceで呼び出す。また、関数varImpPlotを用いてグラフで示すことができる。
> data.rf$importance MeanDecreaseGini ベース料金 31.32463 配達調整金 29.90371 > varImpPlot(data.rf)
ベース料金の方が重要と分かる。
まとめ
今回は、ランダムフォレストを用いることで、予測モデルの誤判別率の改善を目指した。
結果、今まで最も悪い結果となった。おそらく、データセットが今回の手法に合っていなかったのだろう。
コメント