なっトク! 生成AI・DL/機械学習

明快! 機械学習「ランダムフォレスト」をざっくり知る

2024-05-19

たすく

きょうは「仕分ける道具が、なぜ数値も出せるのか」を、順に開けていきます

ランダムフォレストは、分類にも回帰にも使えます。

説明を読むと、たしかにそう書いてあります。

ただ、ここで引っかかった方は多いはずです。

中身は決定木、つまり「はい/いいえ」で枝分かれする仕組みです。

それが、なぜ連続した数値を出せるのでしょうか。

言われてみれば、仕分けと数当ては別の作業だよね

あかり

ここは、大人の学び直しで差が出るところだと思っています。

学生時代なら、「両方に使えます」で先に進めました。

覚えることが目的だったからです。

いまは、その先が要ります。

使うかどうかを、自分で判断しなければならないからです。

判断するには、できることだけでなく、できないことを知る必要があります。

入門記事が書かないのは、たいてい後者のほうです。

なので、できない側まで書きます。

結論:変えているのは、まとめ方だけです

分類 … たくさんの木の答えを、多数決でまとめる

回帰 … たくさんの木の答えを、平均でまとめる

木の作り方は、ほとんど同じです。

違うのは、最後の一手だけ。

たすく

「両方に使える」というより、出口を付け替えている。そう捉えたほうが正確なんです


1本の木は、何をしているのか

決定木は、質問を重ねてデータを仕分けます。

「広さは100平方メートル以上か」

「築年数は20年より新しいか」

こうして枝分かれを繰り返すと、最後は小さな仲間に分かれます。

その仲間の中を見て、答えを出します。

  • 分類なら … その仲間に多かったほうを答える
  • 回帰なら … その仲間の数値を平均して答える

数式を解いているわけではありません。

似たものを集めて、その平均を返しているだけです。

ここが分かると、後の話がすべて素直に入ってきます。

ひとつ、細かい注記を挟みます。

分類を「多数決」と書きましたが、これは提案された当時の説明です。

広く使われているscikit-learnの実装は、少し違います。

各木が出した確率を平均して、いちばん高い種類を選びます。

たいていは同じ答えになりますが、同じ仕組みではありません。

自信のない木の1票と、確信のある木の1票を、区別できるかどうかが違います。

なぜ1本ではなく、森にするのか

木を1本だけ作ると、そのデータに合わせ込みすぎます。

手元のデータには完璧に当たるのに、新しいデータでは外す。

決定木は、単体だとこうなりやすい手法です。

そこで、たくさん作って平均します。

でも同じデータで作ったら、同じ木が並ぶだけじゃないの?

あかり
たすく

いいところを突きました。だから、わざと2か所でばらけさせるんです

  1. 使うデータをばらけさせる … 全件から重複ありで選び直し、木ごとに違う顔ぶれで学習させる
  2. 使う列をばらけさせる … 枝分かれのたびに、候補の列をランダムに絞る

2つ目が、地味に効きます。

強い列が1本あると、放っておけば全部の木がそれを使います。

似た木ばかりになり、平均しても意味がありません。

わざと視野を狭めた木を、たくさん作る。

間違い方がばらけるので、平均すると打ち消し合います。

なお、これで過学習が起きなくなるわけではありません。

1本の木より起きにくい、というだけです。

回帰係数は出ません

ここが、最初の関門です。

線形回帰なら、式が出ます。

「広さが1平方メートル増えると、価格は32万円上がる」

こういう言い方ができます。

ランダムフォレストには、これがありません。

式がないからです。

あるのは、枝分かれの規則が数百本ぶんだけ。

え、それで予測できてると言えるの?

あかり

言えます。

ただし、言えることの中身が違います。

「この条件なら、だいたいこの値」は出せます。

「この条件を1つ動かすと、いくら変わるか」は出せません。

答えは出るが、理由は式で説明できない。

逆に言えば、説明が要らない場面では、これで十分です。

値そのものが欲しいだけなら、困りません。

では、何なら分かるのか

代わりに出せるのが、特徴量の重要度です。

どの列が予測に効いていたかを、割合で示します。

たとえば、こういう形で出ます(値は説明のための例です)。

重要度
広さ40%
部屋数25%
立地20%
築年数10%
近隣の学校評価5%

ここで、ひとつ強く注意してほしいことがあります。

重要度は「効き目の大きさ」であって、「効き方」ではありません。

広さが40%だと分かっても、こうは言えません。

  • 広いほど高い、という向きは分からない
  • 広さが2倍だと価格がどうなるか、というも分からない

分かるのは、順位だけです。

そこ、混ぜて説明されてる気がする……

あかり

実際、混ざりやすいところです。

会議で「広さが効いています」と言うと、聞いた側は向きまで受け取ります。

その重要度にも、既知のクセがあります

さらに一段、踏み込んでおきます。

ふつうに出てくる重要度は、枝分かれでどれだけ仕分けが進んだかを足し上げたものです。

この作り方には、はっきりした偏りが知られています。

  • 取りうる値が多い列ほど、高く出ます。連続した数値の列が、二択の列より有利になります
  • 学習に使ったデータの上で計算するため、合わせ込んだ列まで高く出ます

これは実装の不備ではなく、仕組み上そうなるものです。

たすく

だから、出てきた順位をそのまま結論にしないでほしいんです。ここは注意書きが付いています

対処もあります。

列の値をわざとシャッフルして、成績がどれだけ落ちるかを測る方法です。

落ちれば、その列は効いていた。

落ちなければ、効いていなかった。

学習に使っていないデータの上で測れるので、偏りも避けられます。

順位を人に説明するなら、こちらを使うほうが安全です。

分類は、何種類までできるのか

よく聞かれるところなので、書いておきます。

仕組みの上での上限はありません。

2種類でも、100種類でも動きます。

詰まるのは、いつもデータの側です。

種類が増えれば、1種類あたりの件数は減ります。

10件しかない種類は、まず当たりません。

「何種類まで可能か」ではなく

「1種類あたり何件あるか」で考えてください。

数の上限を気にして止まる場面は、実務ではほとんどありません。

見落とされがちな弱点:外側が出せません

最後に、回帰で使うときの弱点をひとつ。

この手法の答えは、学習に使った数値の平均です。

ということは、学習データにあった範囲の外へは出られません。

過去の取引がすべて6,000万円以下だったとします。

どれだけ広い家を入れても、予測は6,000万円あたりで頭打ちになります。

え、それ知らずに使ったら怖いね

あかり
たすく

しかもエラーは出ません。それらしい値が返ってくるので、気づけないんです

右肩上がりを外に伸ばしたいなら、線形回帰のほうが向いています。

この2つは、優劣ではありません。

内側を細かく当てるか、外側へ伸ばすか。

向いている場所が違うだけです。

使いどころを、1行で

当てたいだけなら、強い。

理由を説明したいなら、向かない。

まず試す手法としては、いまでも有力です。

前処理の手間は、比較的少なくて済みます。

目盛りをそろえる作業は要りません。

ただし、ここも1つ注意があります。

「区分データもそのまま扱える」と書かれているのを見かけますが、scikit-learnの実装では数値に直す必要があります。

文字のまま渡すと、動きません。

まずこれで基準の成績を出し、そこから他と比べる。

そういう置き方が、いちばん扱いやすいと思っています。

できないことを知ってから、使う

最後に、勉強のしかたの話を少しだけ。

入門の説明は、できることから並びます。

売り込む必要があるからです。

ところが実務で効くのは、たいてい逆でした。

できないことを1つ知っているだけで、事故が1つ減ります。

できることを10個覚えても、事故は減りません。

今回でいえば、覚えて帰るのは3つで足ります。

  • 分類は多数決、回帰は平均。出口が違うだけ
  • 重要度は順位。向きも量も出ない
  • 学習データの外側へは出られない

結果の良し悪しをどう測るかは、F値とは何か。混同行列と調和平均で理解するにまとめました。

この辺りをどこまで勉強するかで迷ったら、統計検定2級と準1級、どちらが必要かで線を引いています。

  • この記事を書いた人
  • 最新記事

花丸たすく

▸「思考タイプ診断」で、働き方をスマートに
▸ あなたの価値を、現実を変える力へ
▸ 「IT戦略×データ分析×プロジェクトマネジメント」の知見
▸ 京都大学卒業後、教育・情報サービス系JTCなどでDX推進・データ分析・人材開発に従事