Pythonで学ぶ「ランダムフォレスト」:アンサンブル学習の強力な仕組みを理解しよう
![]()
【Yuki】
こんにちは、Hirokiくん。今日は機械学習のアルゴリズムの中でも、特に実用的で人気のある「ランダムフォレスト」についてお話ししようと思います。少し複雑な仕組みに聞こえるかもしれませんが、根本的な考え方はとてもシンプルなので、安心してくださいね。
![]()
【Hiroki】
Yukiさん、よろしくお願いします!「ランダムフォレスト」って名前、かっこいいですよね。直訳すると「ランダムな森」ですけど、どうしてそんな名前がついているんですか?
![]()
【Yuki】
ふふ、良いところに気づきましたね。それは、このアルゴリズムが「たくさんの木」を集めて「森」を作るからなんです。まずはその基礎となる「決定木(けっていぎ)」という概念から説明しますね。
決定木:データに基づいた「もし〜なら」の積み重ね
![]()
【Yuki】
ランダムフォレストを理解するには、まず「決定木」を知る必要があります。決定木というのは、データを分類するために「もし〜が〇〇以上なら右、そうでなければ左」という風に、条件分岐を繰り返していく手法のことです。
![]()
【Hiroki】
あ、それならわかります!フローチャートみたいなものですよね?例えば「気温が30度以上か?」→「Yesならアイスが売れる、Noなら売れない」みたいな。
![]()
【Yuki】
その通りです。機械学習における決定木は、蓄積されたデータから、最も効率よくデータを分けられる条件を自動で見つけ出してくれるんです。ただ、一つの決定木には弱点があります。それは、データに過剰に適合しすぎてしまう「過学習(オーバーフィッティング)」を起こしやすいという点です。
![]()
【Hiroki】
過学習……。学習データにはぴったり合うけど、新しいデータに対しては正解を出せなくなってしまう状態のことですよね。
![]()
【Yuki】
はい。一本の木だけだと、特定のデータのクセに引きずられて、少し偏った判断をしてしまうことがあるのかもしれません。そこで登場するのが「ランダムフォレスト」です。
アンサンブル学習:三人寄れば文殊の知恵
![]()
【Yuki】
ランダムフォレストは、一本の強力な木を作るのではなく、「たくさんの普通の木」を作って、その多数決で最終的な結果を決める手法なんです。このように複数のモデルを組み合わせて精度を高める方法を「アンサンブル学習」と呼びます。
![]()
【Hiroki】
「三人寄れば文殊の知恵」みたいな感じですね。一人だと間違えるかもしれないけど、みんなで話し合えば正しい答えに辿り着きやすい、という。
![]()
【Yuki】
まさにその通りだと思います。誰か一人の意見に頼るのではなく、多くの意見を統合することで、モデル全体の安定性がぐっと高まるんです。誰かの役に立つために作られた小さな部品たちが、集まることで大きな力を発揮する……そんな風に考えると、少し素敵なアルゴリズムだと思いませんか?
![]()
【Hiroki】
なるほど。でも、同じデータを使ってたくさんの木を作っても、全部同じような木になってしまいませんか?それだと多数決の意味がないような気がします。
![]()
【Yuki】
Hirokiくん、鋭いですね。実は、そこが「ランダム」という言葉の由来に関わってきます。ランダムフォレストでは、それぞれの木が「異なる視点」を持つように、二つの工夫をしているんです。
バギングと特徴量のランダム選択
![]()
【Yuki】
一つ目の工夫は「ブートストラップサンプリング」と呼ばれるものです。元のデータから、重複を許してランダムにデータを取り出し、木ごとに少しずつ違うデータセットを与えます。この手法を「バギング(Bagging)」と言います。
![]()
【Hiroki】
へぇ、わざと不完全なデータや、少し偏ったデータを与えて、個性を持たせるんですね。
![]()
【Yuki】
そうです。そして二つ目の工夫が「特徴量のランダム選択」です。木が条件分岐を作るときに、すべての項目(特徴量)を見るのではなく、その中からランダムに選ばれたいくつかの項目だけを見て判断するように制限をかけます。
![]()
【Hiroki】
あえて情報を制限するんですか?
![]()
【Yuki】
はい。例えば「気温」という項目が強力すぎると、どの木も「気温」だけで判断してしまいますよね。でも、ランダムに項目を絞ることで、「湿度」や「風速」に注目する木も生まれます。こうして多様な木を作ることで、森全体としての判断の幅が広がる……のかもしれません。
Pythonでの実装:Scikit-learnを使ってみよう
![]()
【Hiroki】
仕組みはなんとなくわかってきました!実際にPythonで使うにはどうすればいいんですか?
![]()
【Yuki】
Pythonには「Scikit-learn」というとても便利なライブラリがあります。これを使えば、驚くほど簡単にランダムフォレストを実装できますよ。まずは基本的な分類のコードを見てみましょうか。
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 1. データの読み込み(アヤメのデータセット)
iris = load_iris()
X, y = iris.data, iris.target
# 2. 学習データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 3. ランダムフォレストのモデルを作成
# n_estimators は「作る木の数」です
model = RandomForestClassifier(n_estimators=100, random_state=42)
# 4. モデルの学習
model.fit(X_train, y_train)
# 5. 予測と評価
y_pred = model.predict(X_test)
print(f"正解率: {accuracy_score(y_test, y_pred):.4f}")
![]()
【Hiroki】
わあ、思ったより短いですね!RandomForestClassifierを呼び出して、fitで学習させるだけなんだ。
![]()
【Yuki】
そうなんです。42行目(コード内の引数)で指定している n_estimators=100 は、森の中に100本の木を作る、という意味です。この数を増やすと一般的に精度は安定しますが、計算に時間がかかるようになります。
ランダムフォレストのメリット・デメリット
![]()
【Hiroki】
ランダムフォレストって、非の打ち所がない最強のアルゴリズムに聞こえるんですけど、何か欠点はないんですか?
![]()
【Yuki】
そうですね、もちろん完璧ではありません。メリットとデメリットを整理してみましょうか。
メリット: - 精度が高い: 多くのケースで、デフォルト設定のままでも高い性能を発揮します。 - 過学習に強い: 多数決を取るため、一本の決定木よりもノイズに強いです。 - 特徴量の重要度がわかる: どの項目が予測に大きく寄与したかを教えてくれます。 - 前処理が楽: データのスケール(単位)を揃える必要がほとんどありません。
デメリット: - モデルが重い: 木の数を増やすと、メモリを消費し、予測にも時間がかかります。 - 解釈性の低下: 一本の決定木なら図に描いて説明できますが、100本の木の多数決を人間が追いかけるのは大変です。 - 回帰での限界: 学習データの範囲外の数値を予測するのは苦手です。
![]()
【Hiroki】
「特徴量の重要度がわかる」っていうのは面白そうですね!どうやって見るんですか?
![]()
【Yuki】
学習したモデルの feature_importances_ という属性にそのデータが入っています。これを見れば、「この予測には『花びらの長さ』が一番効いているんだな」といったことが一目でわかるんですよ。
ハイパーパラメータの調整
![]()
【Hiroki】
さっきのコードに n_estimators がありましたが、他にも設定できる項目があるんですよね?
![]()
【Yuki】
ええ、いくつか重要なものがあります。少し控えめに調整するのがコツかもしれません。
- n_estimators: 木の数。多いほど安定しますが、100〜500くらいが一般的です。
- max_depth: 木の深さ。深くしすぎると過学習の原因になるので、データに合わせて制限することがあります。
- min_samples_split: 枝分かれさせるために必要な最小のデータ数。
- random_state: 乱数のシード値。これを固定すると、何度実行しても同じ結果が得られるので、実験の時には大切です。
![]()
【Hiroki】
なるほど。いろいろ変えてみて、一番いい設定を探すわけですね。
まとめ
![]()
【Yuki】
ランダムフォレストは、個々の「木」は未熟でも、それらが協力し合うことで「森」として知的な判断を下す……。そんな、少し健気で力強いアルゴリズムです。
![]()
【Hiroki】
「多様性が大事」っていうのは、なんだか人間社会にも通じる話で面白いです。Yukiさん、今日も丁寧にありがとうございました!
![]()
【Yuki】
どういたしまして。Hirokiくんがそう言ってくれると、わたしも嬉しいです。もし興味があれば、実際のデータセット(タイタニックの生存予測など)を使って、ランダムフォレストを試してみてくださいね。きっと新しい発見があるはずですから。
![]()
【Hiroki】
はい!さっそく自分の環境でコードを動かしてみます!
参考文献: - scikit-learn official documentation (RandomForestClassifier) - User Guide: Ensemble methods
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


