ランダムフォレスト|決定木を束ねる高精度な機械学習手法

ランダムフォレスト

ランダムフォレストは、多数の決定木を組み合わせて分類や回帰を行う機械学習の手法である。個々の木は学習データと特徴量を無作為に選んで作られ、最終的な予測は各木の多数決または平均で決まる。複数のモデルを束ねるアンサンブル学習の代表例で、扱うデータの前処理が比較的少なくて済み、精度も安定しやすい。そのため、研究用途だけでなく製造業の品質管理や設備診断でも広く使われている。

誕生の経緯

原型は、1995年にベル研究所のティン・カム・ホーが発表した「random decision forests」にある。ホーは特徴量の部分集合を使って木を作る「ランダム部分空間法」を提案した。これに、1996年にレオ・ブレイマンが発表したバギングの考え方を組み合わせ、2001年に体系化したのが現在のランダムフォレストである。ブレイマンとアデル・カトラーは「Random Forests」の名称を商標として登録しており、商用ソフトウェアでは別名で実装されている例もある。

木を「ばらつかせる」二つの仕掛け

単独の決定木は学習データの細かな揺らぎまで覚え込みやすく、過学習を起こしやすい。この弱点を補うため、ランダムフォレストでは二段階で無作為性を入れる。一つ目はブートストラップ法による標本の復元抽出である。データ数をnとすると、ある1件が1回も選ばれない確率は (1 − 1/n)n で、nが大きいとき e−1 ≈ 0.368 に近づく。つまり各木はデータ全体のおよそ63.2%を使い、残り約36.8%は学習に使われない。二つ目は、木の各分岐点で特徴量を一部だけ候補にする操作である。全特徴量の数をpとした場合、分類では√p個、回帰ではp/3個程度を候補にするのが慣例となっている。

候補の中から分岐を選ぶ基準には、分類ではジニ不純度 G = 1 − Σk pk2(pkはクラスkの割合)がよく使われ、回帰では平均二乗誤差が用いられる。

予測の集約

木の本数をB、b番目の木の出力をTb(x)とすると、回帰の予測値は ŷ(x) = (1/B) Σb=1B Tb(x) となる。分類では各木の投票数が最も多いクラスを採用する。木同士の相関が低いほど平均化による分散低減の効果は大きくなる。特徴量をわざわざ間引くのは、この相関を下げるためである。

OOB誤差という便利な副産物

各木の学習に使われなかった約36.8%のデータは「OOB(Out-Of-Bag)」と呼ばれる。このデータをその木に予測させて誤差を集計すると、検証用データを別に用意しなくても汎化性能を見積もれる。計算コストのかかる交差検証を省略できるのは、試験データの少ない現場では大きな利点である。

主なハイパーパラメータ

調整すべきハイパーパラメータは少なく、初期値のままでも一定の精度が出ることが多い。代表的なものを、Pythonライブラリscikit-learnの名称とあわせて示す。

項目 scikit-learnでの名称 内容と目安
木の本数 n_estimators 既定値は100(バージョン0.22以前は10)。増やしても過学習しにくいが計算時間は比例して増える
分岐候補の特徴量数 max_features 分類は√p、回帰はp/3前後が出発点
木の最大深さ max_depth 既定では制限なし。メモリ不足時に制限する
葉の最小サンプル数 min_samples_leaf ノイズの多いデータでは5〜10程度に上げると安定する

他の手法と比べたときの立ち位置

同じ決定木系でも、勾配ブースティングは前の木の誤差を次の木が補う逐次型の手法で、チューニングを詰めれば精度で上回ることが多い。ただし学習率や木の深さなど調整項目が多く、設定を誤ると過学習しやすい。ランダムフォレストは木を並列に作れるのでCPUのコア数に応じて学習が速くなり、初期設定でも大きく外しにくい。画像や音声のような非構造データでは深層学習に及ばないものの、数十〜数百列程度の表形式データなら今でも有力な選択肢である。

製造現場での使われ方

工場では、温度、圧力、振動、電流値といったセンサーデータを説明変数にして、不良品の発生や設備の故障を予測する用途が多い。例えば射出成形では、シリンダー温度(樹脂によって180〜300℃程度)、射出圧力、保圧時間、金型温度などからショートショットやバリの発生を判定するモデルが組まれる。予知保全や異常検知の分野でも、軸受の振動データから算出した実効値や尖度を入力にして、劣化状態を分類する事例がある。

実務で評価されているのは、特徴量重要度を出力できる点である。品質会議で「なぜその製品が不良と判定されたのか」を説明する場面では、ブラックボックスになりがちなニューラルネットワークより受け入れられやすい。導入の初期費用も抑えやすく、オープンソースのライブラリと一般的な業務用PCで試作モデルを作れるため、データサイエンティストを置いていない中小の工場でもPoC(概念実証)に着手しやすい。注意したいのは不良率の偏りで、不良が全体の0.1%程度しかないラインでは、何も工夫しないと「すべて良品」と予測するだけで99.9%の正解率になってしまう。クラス重みの設定やアンダーサンプリングを併用し、適合率と再現率で評価するのが定石である。外観検査の画像そのものを入力にするより、画像から抽出した寸法や輝度などの数値を入力にした方が、この手法の強みは生きる。

特徴量重要度の読み方

重要度には、分岐による不純度の減少量を合計する方式と、ある特徴量の値をシャッフルして精度の低下幅を測る「置換重要度」がある。前者は計算が速い反面、取り得る値の種類が多い連続量を過大評価する傾向が知られている。工程パラメータの優先順位を決めるような判断に使うなら、置換重要度で確認しておくと安全である。

苦手とする場面

学習データの範囲外の値は予測できない。回帰で使う場合、葉に入ったデータの平均を返す構造のため、過去に経験したことのない高温条件などを入力しても、予測値は学習時の最大値付近で頭打ちになる。線形な傾向を外挿したい場合は回帰分析のほうが向く。モデルのファイルサイズが大きくなりやすいことも欠点で、木を500本、深さ無制限で作ると数百MBに達する場合があり、PLCや組込み機器への実装には向かない。エッジ側で動かすなら、本数や深さを絞るか、別の軽量モデルを検討する必要がある。

主な実装環境

Pythonではscikit-learnのRandomForestClassifierとRandomForestRegressorが標準的に使われる。R言語ではブレイマンらのFortranコードを移植したrandomForestパッケージのほか、高速なrangerパッケージが知られている。大規模データ向けにはApache Spark MLlibにも実装があり、GPUで学習できるRAPIDS cuMLを使えば数百万行規模のデータでも数分程度で学習できる場合がある。

コメント(β版)