ビッグデータ解析に最適な”R”で”ランダムフォレスト”手法を体感してみた
最近、欲張りなことに”ディープラーニング”と”ビッグデータ解析”を同時に勉強してます。
ディープラーニングの方はさほど進展ありませんが、ビッグデータ解析でちょっと新しいツールと手法の存在を知ったので、早速使ってみました。
以下、このサイトを参考にしてます。
Rで遊ぶ ~ワインの等級をrandomForestで予測~ - Qiita
ここの記事が。ランダムフォレストってやつを試してみるには一番わかりやすかったですね。
ただ、ちょっとこの記事の内容だけでは端折りすぎててたどり着かなかったので、補足しつつ紹介。
まずツールですが、”R”と呼ばれるものがあります。
The Comprehensive R Archive Network
ビッグデータ解析や機械学習に使われる統計解析向けプログラミング言語・実行環境です。上のサイトから入手。
私はWindows版をゲット。バージョンは3.3.2でした(近々3.3.3が出るらしいですが)。
ダウンロードしたら早速インストール。
デスクトップにアイコンができるので起動すると、こんな感じの画面が。
さて、早速バリバリと使って解析・・・とはいきませんで、パッケージをインストールしなきゃいけません。
ここでは”caret”と”randomForest”の2つのパッケージを使うので、これらをインストールします。
上のメニューの”パッケージ”から”パッケージのインストール”を選択。
最初だけ接続先を聞かれます。”Japan(Tokyo)”というのを選びます。
続いてパッケージを選択。
ほんとにたーくさんあるので気がめいってきますが、この中から”caret”と”randomForest”を探し出してCtrlキーを押しながら選択し”OK”をクリック。
なにやらインストールがはじまります。
しばらくすると終了。
いよいよ、ビッグデータ解析の手法の一つである”ランダムフォレスト”ってやつを使ってみます。
と、その前にランダムフォレストとはなんぞや?ですが。
以下に説明サイトを張り付けておきますが。
Rでランダムフォレスト(random forest) | 一言茶屋 ~統計、R、Excelとか~
多分、なんのことやらわからないかもしれません・・・私も、社内の勉強会で説明されるまでさっぱりでした。
てことで、私なりに説明を。
例えば、良品・不良品の明確な基準がない製品がある(出来上がったら良・不良がわかる)として、その製品の大きさ・重さから良品・不良品を分ける仕組みを作ろうとします。
そこで、上のようにa(mm)、b(mm)、c(g)それぞれの良・不良の条件を仮に決めて、上のような枝分かれなふるいにかけます。
右のような製品の場合、この基準では「不良品」とされてしまいます。
実際に、この製品が不良品だったならこの”ふるい”は正しいということになります。
こういうのを”決定木”といいます。
こんな感じの決定木をたくさん作ります。
a、b、cの基準や枝分かれの数などはランダムに決定。
ただし、あらかじめ良品・不良品のわかっているデータを使って、この大量の決定木を”学習”させます。
学習によって作られた大量の”決定木”を使ってそれぞれで”良品”・”不良品”を判断させて、これら決定木の判断の多数決で良・不良を決定します。
最初の学習で”決定木”をランダムに生成し学習、その決定木をたくさん集めた”森”ということで”ランダムフォレスト”というそうです。
たくさんのデータがあれば、判断の精度も上がるようで、わりと使いやすく精度の高いビッグデータ解析手法として注目されているようです。
そんなランダムフォレストの威力を確かめるため、以下のサイトからデータを入手します。
UCI Machine Learning Repository: Wine Data Set
機械学習に使えるデータをたくさん登録しているUCIというサイトから、ワインの等級(1~3)とアルコール度やリンゴ酸含有量、色調などのデータが170個ほど収められてます。
上にある”Data Folder”をクリックすると、”wine.data”というCSV形式のファイルをゲットできます。
これをPC内に保存しておきます(ここでは”c:\tmp”に保存)。
先ほどインストールした”R”を起動、以下のコマンドを入力します。
> library(caret)
> library(randomForest)
続いて”wine.data”を読み込み。
> dat <- read.csv("c:/tmp/wine.data")
以下のコマンドを実行して、列名を直しておきます。
> names(dat) <- c("class", paste0("V", 1:13))
> dat <- transform(dat, class = as.factor(class))
> head(dat)
ここで
> str(dat)
と打ち込むと、データの概要が見えます。
> str(dat)
'data.frame': 177 obs. of 14 variables:
$ class: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
$ V1 : num 13.2 13.2 14.4 13.2 14.2 ...
$ V2 : num 1.78 2.36 1.95 2.59 1.76 1.87 2.15 1.64 1.35 2.16 ...
$ V3 : num 2.14 2.67 2.5 2.87 2.45 2.45 2.61 2.17 2.27 2.3 ...
$ V4 : num 11.2 18.6 16.8 21 15.2 14.6 17.6 14 16 18 ...
$ V5 : int 100 101 113 118 112 96 121 97 98 105 ...
$ V6 : num 2.65 2.8 3.85 2.8 3.27 2.5 2.6 2.8 2.98 2.95 ...
$ V7 : num 2.76 3.24 3.49 2.69 3.39 2.52 2.51 2.98 3.15 3.32 ...
$ V8 : num 0.26 0.3 0.24 0.39 0.34 0.3 0.31 0.29 0.22 0.22 ...
$ V9 : num 1.28 2.81 2.18 1.82 1.97 1.98 1.25 1.98 1.85 2.38 ...
$ V10 : num 4.38 5.68 7.8 4.32 6.75 5.25 5.05 5.2 7.22 5.75 ...
$ V11 : num 1.05 1.03 0.86 1.04 1.05 1.02 1.06 1.08 1.01 1.25 ...
$ V12 : num 3.4 3.17 3.45 2.93 2.85 3.58 3.58 2.85 3.55 3.17 ...
$ V13 : int 1050 1185 1480 735 1450 1290 1295 1045 1045 1510 ...
ここで”class”とはワインの等級。この部分が最終的に予測させたい応答変数となります。
V1:アルコール度、V2:リンゴ酸、V3:灰、V4:灰のアルカリ性、V5:マグネシウム、V6:トータルフェノール量、V7:フラバノイド、V8:非フラバノイドフェノール類、V9:プロアントシアニン、V10:色彩強度、V11:色調、V12:蒸留ワインのOD280/OD315、V13:プロリンとあります。ワインに詳しいわけではないのでさっぱりですが、そういうパラメータがあるということで。
全部で178個のデータを、学習用と検証用に分けます。
手で分けてもいいんですが、以下のコマンドを使うとさらっと分けられます。
> index <- createDataPartition(dat$class, p=.8, list=F)
> train <- dat[index, ]
> test <- dat[-index,]
こんな感じに、8割を学習用、2割を検証用に振り分けます。
続いてランダムフォレストでの機械学習に入るわけですが、その前に
> tuneRF(train[,-1], train[,1], doBest=T)
を実行。
すると、こんなグラフが。
これ、決定木の枝分かれ層の数(mtry)の最適値を探る関数のようです。
リンク先記事には”6が最適”となってますが、上では2と6あたりがOOBエラーってのが小さめ(1はもっと小さいですが・・・)。2でも6でもよさそうです。
このグラフも、実行するたびに変化するんですが・・・なんなのでしょう?数回実行すると、だいたい6あたりが最小になってるっぽいです。
てことで、mtry = 6で実行。
> rf <- randomForest(class~., data=train, mtry=6)
応答変数を”class”、データは先ほど分離した”train”、決定木の層は”6”、決定木の数はデフォルト値(500)を使います。
で、機械学習の結果が”rf”ってやつに収められてるはずなんですが・・・これを検証します。
評価用に残した”test”ってデータを使って検証。
> table(predict(rf, test), test$class)
1 2 3
1 10 0 0
2 1 14 0
3 0 0 9
こんな感じのマトリックスが出てきます。
縦の列がランダムフォレストによって予測されたワインの等級、横が実際の等級を示しているようです。
例えば、”予測”も”実際”も1等級のものが10個あるといってます。
対角上にのみ数字が並べば全部正解!となったんですが、ランダムフォレストが”2等級”と予測したけど実際は1等級だったというものが1つだけあります。残念。
さて、V1~V13の”等級”に関する重みづけを次のコマンドで確認できます。
> importance(rf)
MeanDecreaseGini
V1 7.1588086
V2 1.5091832
V3 0.6757448
V4 1.0331509
V5 1.7680900
V6 2.7761997
V7 19.1024801
V8 0.2138005
V9 0.8049197
V10 16.9945830
V11 5.8153684
V12 12.1655112
V13 23.5054326
ここではV13、V7、V10、V12、V1・・・の順に等級に影響を及ぼしていると推測できます。
とまあ、わかったようなわかんないような、ランダムフォレストのお試しでした。
これが一体何に使えるのか?
例えば、生産ラインで各々の機械に温度・加速度・光・・・・などのセンサーをつけておき、そのデータを記録。
ラインに流れる製品の良・不良を記録しておき、そのセンサーの値と合わせて保存。
ランダムフォレストによって学習したデータからは、いったいどのセンサー値が良・不良を左右しているかがわかります。
また、寄与度の高い場所でのセンサーの値が”不良品”寄りな値ばかり出すように変化した場合、ラインの異常を事前に予測できます。
つまり、工場でのIoTでの活用が期待されてるみたいですね。
この事例がそれにあたるのかどうかはわかりませんけど。
1個50円のセンサーで工場内IoT、残業ゼロに | ワクスタ(The Work Style Studio)
これを読む限り、多分、似たようなことをやっているものと思われます。
このほかにもSVMだのlasso回帰だの、いろいろな手法があるようです。この辺はこれから勉強する予定。
ディープラーニングもそうですが、複数の手法を知っておくといざ大量のデータに埋もれてしまいそうなときに助かるかもしれません。そんなわけで、これからもいろいろと試してみるつもりです。
データサイエンティスト養成読本 R活用編 【ビジネスデータ分析の現場で役立つ知識が満載! 】 (Software Design plus) |
« Google Brainが開発した 8×8の画像から元画像を復元する技術 | トップページ | なんとアルバム33曲すべてが”Get Wild”なTMNの新しいアルバム »
「数値解析系」カテゴリの記事
- Windows 11でFORTRANをコンパイルしたい!という方への対処法(2025.01.04)
- どこに視線を向けているかを可視化してくれる物体検出器(2024.12.23)
- 2024年まとめ記事(2024.12.31)
- 生成AI解説書籍「ChatGPT & 生成AI」という本を買った(2024.12.08)
- Googleの生成AI「Gemini Advanced」に入ってみた(2024.12.01)
« Google Brainが開発した 8×8の画像から元画像を復元する技術 | トップページ | なんとアルバム33曲すべてが”Get Wild”なTMNの新しいアルバム »
コメント