トップページ | ひとつ上のページ | 目次ページ | このサイトについて | ENGLISH

データ分析のためのランダムフォレスト

ランダムフォレストのよく知られている使い方については、 ランダムフォレスト のページにまとめています。 このページは、ランダムフォレストをデータの構造を調べるために使う使い方です。 データ分析のための使い方になります。

ランダムフォレストで作られるランダムな木のひとつひとつを、目で確認する方法です。

N進木のランダムフォレスト

一般的なランダムフォレストは、2進木になっているようです。 しかし、 N進木 のページに書いているように、2進木は 定量的な仮説の探索 をする時にとても不便です。

そこで、CHAIDベースとC5.0ベースのランダムフォレストも作ってみました。

Rの実施例(たくさんの木の画像ファイルを作る)

ポイントになるのは10回分のデータセットの作り方です。 このコードでは、自分で調整できるのが便利です。

rpartベースのランダムフォレスト

R の使用例は下記になります。 (下記は、コピーペーストで、そのまま使えます。 この例では、Cドライブの「Rtest」というフォルダに、 「Data.csv」という名前でデータが入っている事を想定しています。 このコードの前に、ライブラリ「partykit」のインストールが必要です。

データは、Yと20個のXがあるとします。90行分あります。
Decision Tree

setwd("C:/Rtest") # 作業用ディレクトリを変更
library(rpart)
# ライブラリを読み込み
library(partykit)
# ライブラリを読み込み
Data <- read.csv("Data.csv", header=T)
# データを読み込み
ncolMax <- ncol(Data)
# データの列数を求める
nrowMax <- nrow(Data)
# データの行数を求める
DataY <- Data$Y
# Yの列を別名で保管する
Data$Y <- NULL
# データからYの列を消して、Xの列だけにする
for (i in 1:9) {
# ループの始まり。「9」でランダムサンプリングを9回実行することを表す
DataX <- Data[,runif (floor(sqrt(ncolMax)), max=ncolMax)]
# ランダムに列数の平方根の数の列を選択する
Data1 <- transform(DataX, Y = DataY) 
# Yと選択したXで新しいデータセットを作る
Data2 <- Data1[runif (floor(sqrt(nrowMax)), ,max=nrowMax), ]
# ランダムに行数の平方根の数の行を選択する
treeModel <- rpart(Y ~ ., data = Data2, minsplit = 3)
# rpartを実行
jpeg(paste("plot",i,".jpg"), width = 300, height = 300)
# 描画デバイスを開く
plot(as.party(treeModel))
# グラフにする。繰り返した回数分のグラフファイルができる。
dev.off()
# 描画デバイスを閉じる
}
# ループの終わり

このコードを実行すると、作業用ディレクトリに結果の画像ファイルが木の数だけ作成されます。
Decision Tree
狙い通りに、枝が3つ以上になる木もできました。

C5.0ベースのランダムフォレスト

R の使用例は下記になります。 (下記は、コピーペーストで、そのまま使えます。 この例では、Cドライブの「Rtest」というフォルダに、 「Data.csv」という名前でデータが入っている事を想定しています。 このコードの前に、ライブラリ「partykit」と「C50」のインストールが必要です。

データは、上記と同じです。

setwd("C:/Rtest") # 作業用ディレクトリを変更
library(C50)
# ライブラリを読み込み
library(partykit)
# ライブラリを読み込み
Data <- read.csv("Data.csv", header=T, stringsAsFactors=TRUE)
# データを読み込み
ncolMax <- ncol(Data)
# データの列数を求める
nrowMax <- nrow(Data)
# データの行数を求める
if (class(Data$Y) == "numeric") {
# 条件分岐の始まり
Data$Y <- droplevels(cut(Data$Y, breaks = 5,include.lowest = TRUE))
# 5分割する場合。量的データは、質的データに変換する。
}
# if文の処理の終わり
DataY <- Data$Y
# Yの列を別名で保管する
for (i in 1:ncolMax) {
# ループの始まり。データの列数を数えて同じ回数繰り返す
if (class(Data[,i]) == "logical") {
# 条件分岐の始まり
Data[,i] <- as.factor(Data[,i])
# logical型の列は、factor型に変換する。
}
# if文の処理の終わり
}
# ループの終わり
Data$Y <- NULL
# データからYの列を消して、Xの列だけにする
for (i in 1:9) {
# ループの始まり。「9」でランダムサンプリングを9回実行することを表す
DataX <- Data[,runif (floor(sqrt(ncolMax)), max=ncolMax)]
# ランダムに列数の平方根の数の列を選択する
Data1 <- transform(DataX, Y = DataY) 
# Yと選択したXで新しいデータセットを作る
Data2 <- Data1[runif (floor(sqrt(nrowMax)), ,max=nrowMax), ]
# ランダムに行数の平方根の数の行を選択する
treeModel <- C5.0(Y ~ ., data = Data2)
# C5.0を実行
jpeg(paste("plot",i,".jpg"), width = 300, height = 300)
# 描画デバイスを開く
plot(as.party(treeModel))
# グラフにする。繰り返した回数分のグラフファイルができる。
dev.off()
# 描画デバイスを閉じる
}
# ループの終わり

このコードを実行すると、作業用ディレクトリに結果の画像ファイルが木の数だけ作成されます。
Decision Tree
狙い通りに、枝が3つ以上になる木もできました。

CHAIDベースのランダムフォレスト

量的データも3分岐以上になる N進木 にしたい場合は、CHAIDを使っても良いと思います。

下のコードの特徴ですが、CHAIDであることの他に、 アンサンブル学習 のページに書いている「列のバギング」になっています。 つまり、サンプリングは列だけで、行はしていません。

C5.0ベースのものと比べると、計算時間が長いです。

このコードの前に、ライブラリ「CHAID」のインストールが必要です。

setwd("C:/Rtest") # 作業用ディレクトリを変更
library(CHAID)
# ライブラリを読み込み
Data <- read.csv("Data.csv", header=T, stringsAsFactors=TRUE)
# データを読み込み
ncolMax <- ncol(Data)
# データの列数を求める
nrowMax <- nrow(Data)
# データの行数を求める
for (i in 1:ncolMax) {
# ループの始まり。データの列数を数えて同じ回数繰り返す
if (class(Data[,i]) == "numeric") {
# 条件分岐の始まり
Data[,i] <- droplevels(cut(Data[,i], breaks = 5,include.lowest = TRUE))
# 5分割する場合。量的データは、質的データに変換する。
}
# if文の処理の終わり
}
# ループの終わり
DataY <- Data$Y
# Yの列を別名で保管する
Data$Y <- NULL
# データからYの列を消して、Xの列だけにする
for (i in 1:9) {
# ループの始まり。「9」でランダムサンプリングを9回実行することを表す
DataX <- Data[,runif (floor(sqrt(ncolMax)), max=ncolMax)]
# ランダムに列数の平方根の数の列を選択する
Data1 <- transform(DataX, Y = DataY) 
# Yと選択したXで新しいデータセットを作る
#Data2 <- Data1[runif (floor(sqrt(nrowMax)), ,max=nrowMax), ]
# ランダムに行数の平方根の数の行を選択する
Data2 <- Data1
# 行はサンプリングしない
treeModel <- chaid(Y ~ ., data = Data2)
# C5.0を実行
jpeg(paste("plot",i,".jpg"), width = 600, height = 300)
# 描画デバイスを開く
plot(treeModel)
# グラフにする。繰り返した回数分のグラフファイルができる。
dev.off()
# 描画デバイスを閉じる
}
# ループの終わり

Decision Tree



参考文献

このページの例とは違うコードが載っていますが、 ランダムフォレスト用のデータセットを作るためのヒントは、これを参考にさせていただきました。
http://tips-r.blogspot.com/2014/06/r1.html


Pythonで、木をたくさん作る過程を動画にする話があります。
https://watlab-blog.com/2020/01/06/random-forest-animation/


順路 次は 個々のカテゴリの仲間分けの分析

Tweet データサイエンス教室