こんにちは。コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。
本日は、予測モデルの構築方法として、「ランダムフォレスト」アルゴリズムについて紹介します。
ランダムフォレストのアルゴリズムについて
ランダムフォレストのアルゴリズムは、「決定木モデル」が基になっています。決定木モデルとは、よくプログラムで書くif then elseのような簡単な説明変数の値によって結果を決める手法のことです。ランダムフォレストは、複数の「決定木モデル」を足し合わせる(平均化)するようなアンサンブル学習(Ensemble learning)というアルゴリズムを利用します。そのため、決定木モデルよりも高性能な予測が可能となっています。ランダムフォレストのアルゴリズムは、以下のような特性があるためオンラインサービスのログ分析に適していると言われています。
- 的変数と説明変数の型に(連続、不連続、バイナリー)何でも対応している
オンラインサービスの場合は、変数はユーザーの年齢(整数)、性別(不連続)、滞在時間(連続)であったりして、混ざったタイプの変数が多いです。そのため、何でも使えるランダムフォレストは便利です。
- 変数の分布に依存しない
分析手法によって、変数の分布に制約はあります。例:ガウス分布
データの分布の判断は難しいようなケースが多いため、分布の制約は無い方が安心です。
- 外れ値や欠損値などに強い
オンラインサービスの場合は、データが入っていなかったり、場合によっては、間違ったデータが入っていることがよくあります。例:値の代わりにnullが入っている等ランダムフォレストの予測モデルは、このようなデータによって影響を受けにくいため、データの前準備の手間を減らせます。
- 説明変数の数が非常に多いケースにも応用できる
サービスユーザーの特性を表す変数の数は、20個も30個もあることはよくあります。そのため、説明変数の数が多くてもきちんと機能する手法が不可欠です。
- 関係ない説明変数はモデルのパフォーマンスに影響しない。
線形回帰分析やニューラルネットワーク等は、目的変数と関係のない説明変数をモデル構築に使った場合、予測制度にかなり影響します。そのため、関係性のある目的変数だけを選ぶ等のデータの前準備が必要となります。しかし、ランダムフォレストは、そのような準備をする必要はあまりありません。
- ビッグデータに対応しやすい
最近、オンラインサービスデータは数百万も数千万件もあることがよくあります。ランダムフォレストは、複数の「決定木」モデルを合わせるような計算手法になっているため、分散計算プラットフォーム(Hadoop, Spark)を使って大量のデータでも扱いやすいです。
R言語を用いたランダムフォレストのアルゴリズムの利用
R言語とは、統計解析を得意とする(Libraryが多くある)スクリプト言語です。無料でダウンロードして、Windows, Mac, Linux等どんな環境でも利用できます。CRANからオープンソースのライブラリを無料でダウンロードしインストールすることによって、データマイニングや統計解析手法のほとんどを無料で利用することができます。ランダムフォレストを利用するにはパッケージのインストールが必要です。
RandomForestのインストール:
install.packages(“randomForest”, dependencies = TRUE)
library(randomForest)
データサンプル:
ランダムフォレストに入力するデータを、CSV形式で以下のように準備する。
一行目がヘッダーとして変数名、二行目から変数の値をCSV形式で記述する。
v1は目的変数、v2~v6は説明変数
data.csv(データサンプル)
v1,v2,v3,v4,v5,v6
n11,n12,n13,n14,n15,n16
n21,n22,n23,n24,n25,n26
…
CSVデータの読み込み:
datacsv <-read.csv(file=”data.csv”,header = T)
モデル構築:
RFmodel <- randomForest(v1 ~ v2+v3+v4+v5+v6, data= datacsv)
N二番目の変数に、説明変数を‘+’で組み合わせて記述する。V1は目的変数、V2~v6は説明変数を表します。
全ての説明変数を予測モデル構築に使う場合は、
RFmodel <- randomForest(v1 ~ ., data= datacsv)
モデル評価:
予測モデルの評価方法には色々あります。しかし、Rのprint関数を使うだけで簡単にモデル評価ができます。
例えば、ランダムフォレストを、バイナリーの目的変数を予測に用いた場合は、以下のような結果が表示されます。
Call:
randomForest(formula = v1 ~ ., data = datacsv, ntree = 2000)
Type of random forest: classification
Number of trees: 2000
No. of variables tried at each split: 10
OOB estimate of error rate: 28.82%
Confusion matrix:
continue redatsu class.error
r1 5573 1092 0.1638410
r2 2026 2128 0.4877227
真ん中のerror rate: 28.82%と出力されているのは、目的変数の予測の精度です。
100件を予測れば、28件の誤りが出る可能性があると出力されています。
モデルを用いた予測:
構築された予測モデルを用いて、結果(目的変数)の分からないユーザーのデータdata2を入力することで、予測値が出力されます。
Results <- predict(RFmodel ,data2)
モデル構築時の注意点:
- 目的変数の情報が説明変数に漏れないこと。目的変数と同じ情報が説明変数にも入ってしまった場合は、予測モデルの結果の精度が高くなると評価されますが、実際にデータ予測を行った場合、非常に精度が悪くなる場合があるため、注意して変数を定義しないといけません。
- ラベルとして扱わないといけないラベルタイプ(不連続型データ)の変数を、R言語のfactor()を用いて、ラベルとして認識させる必要がある。
- パラメータのntree(決定木の数)の値が小さい場合、結果が不安定な時がある。特に、説明変数の数が多い時は、十分に大きな値のntreeを設定する必要がある。
終わりに
今回は、ランダムフォレストをR言語で用いた予測モデル構築方法に関して軽く説明しました。今後、ランダムフォレストを「要因分析」へ応用する方法に関して説明していきます。
参考資料:
Rのダウンロード
R言語について
http://qiita.com/stkdev/items/6aba2c1db2fa056170ae
RandomForestについて