こんにちは!G検定の学習、順調に進んでいますか?AIや機械学習の分野には専門用語が多くて、「アンサンブル学習」や「バギング」と聞いても、なんだか難しそう…と感じている方もいらっしゃるかもしれませんね。
でも、心配いりません!バギング (Bagging) は、機械学習モデルの予測精度をグンと引き上げてくれる、とても強力で基本的なテクニックなんです。実は、有名な「ランダムフォレスト」という手法も、このバギングが基礎になっています。
この記事では、G検定合格を目指すあなたのために、
- バギングって、そもそも何?
- どんな仕組みで動いているの?(図解でイメージ!)
- どんなメリット・デメリットがある?
- G検定でよく問われる「OOBエラー」「ランダムフォレスト」「ブースティング」との関係は?
といった点を、AI・機械学習の学習を始めたばかりの方にも分かりやすく、ステップバイステップで解説していきます。読み終わるころには、「なるほど、バギングってそういうことか!」とスッキリ理解できているはずです。
さあ、一緒にバギングの世界を探検して、G検定合格への武器を手に入れましょう!
バギングって何? まずは基本を押さえよう
まず、「アンサンブル学習」という言葉からおさらいしましょう。難しく考えなくて大丈夫です。「三人寄れば文殊の知恵」ということわざがありますよね?一人で考えるよりも、複数人で意見を出し合った方が、より良い結論に至ることが多い、という考え方です。
アンサンブル学習は、まさにこれと同じ発想!複数の機械学習モデル(学習器)を組み合わせて、個々のモデルよりも賢くて頑健な一つのモデルを作り出す手法のことです。
そして、バギング (Bagging) は、このアンサンブル学習の中でも代表的な手法の一つ。「Bootstrap Aggregating」を略した言葉です。なんだか難しそうですが、分解すれば怖くありません。
- Bootstrap (ブートストラップ): ちょっと特殊な方法で、元の学習データから「分身データセット」をたくさん作り出すこと。
- Aggregating (アグリゲーティング): 分身データセットで学習した複数のモデルの予測結果を、「集約」すること(多数決や平均をとること)。
つまり、バギングは「データをちょっとずつ変えた分身データセットで別々のモデルを学習させて、最後にみんなの意見をまとめる手法」とイメージすると分かりやすいでしょう。
特に、分類問題(例:画像が犬か猫か当てる)や回帰問題(例:家の価格を予測する)で、モデルの予測精度を向上させたいときによく使われます。
バギングの心臓部!ブートストラップサンプリングを見てみよう
バギングを理解する上で一番のキモとなるのが、ブートストラップサンプリング (Bootstrap Sampling) です。なぜこんなことをするのでしょうか?
もし全く同じデータで同じアルゴリズムを使ってモデルを学習させたら、全部同じモデルが出来上がってしまいますよね。それではアンサンブル(みんなで協力)する意味がありません。そこで、少しずつ違うデータセットで学習させることで、個性のある(=間違い方の違う)モデルをたくさん作り、それぞれの良いところを活かそう、というのが狙いです。
ブートストラップサンプリングの手順は、まるで「くじ引き」のようです。
- 元のデータセットを用意: まず、学習に使いたいデータがたくさん入った袋があると想像してください。
- くじ引き開始!: 袋の中から、データを1つランダムに選びます。
- 元に戻す: 選んだデータは記録したら、また袋の中に戻します。ここがポイント!同じデータが何回も選ばれる可能性があります(これを復元抽出や重複を許すと言います)。
- 繰り返し: 元のデータセットと同じ数になるまで、ステップ2と3を繰り返します。これで「分身データセット」(ブートストラップサンプル)が1つ完成!
- たくさん作る: この作業(ステップ2〜4)を何回も繰り返して、たくさんの「分身データセット」を作ります。
この方法で作られた分身データセット(ブートストラップサンプル)は、平均すると元のデータのうち約63.2%のユニークなデータを含んでいます。残りの約36.8%のデータは、そのサンプルには含まれていない、ということになります(これは後で重要になります!)。
分身データでモデルを育てて、みんなで予測!
さて、たくさんの分身データセット(ブートストラップサンプル)ができましたね。次は何をするのでしょうか?
今度は、それぞれの分身データセットを使って、個別にモデルを学習させます。例えば、決定木というアルゴリズムを使うなら、分身データセットの数だけ、少しずつ違う決定木モデルが出来上がります。
そして、新しいデータに対して予測を行うときは、これらのモデル全員に予測をしてもらいます。最後に、その予測結果を集約 (Aggregating) して、最終的な結論を出します。集約の方法は、問題の種類によって異なります。
- 分類問題 (例: 犬 or 猫): 多数決 を取ります。一番多くのモデルが予測したクラスを最終結果とします。「クラスA」と予測したモデルが一番多ければ、最終予測は「クラスA」です。まるで選挙のようですね!
- 回帰問題 (例: 価格予測): 各モデルの予測値の平均を取ります。あるモデルが「100万円」、別のモデルが「110万円」、さらに別のモデルが「105万円」と予測したら、それらの平均値を最終予測とします。
このように、少しずつ違うデータで学習した多様なモデルの意見を集約することで、個々のモデルが持つ弱点(例えば、特定のデータにだけ過剰に反応してしまう「過学習」)を互いに補い合い、全体としてより安定した、精度の高い予測ができるようになるのです。
バギングのすごいところ!(メリット)
バギングを使うと、どんないいことがあるのでしょうか?
過学習にサヨナラ!
モデルが学習データに慣れすぎてしまい、未知のデータに対してうまく予測できなくなることを「過学習」と言います。バギングは、複数のモデルの予測を平均化(または多数決)することで、個々のモデルが持つ過学習の傾向を打ち消し合い、過学習を抑える効果があります。特定のデータにだけ強く反応してしまうモデルがいても、他のモデルがそれを補正してくれるイメージです。
予測が安定する!
学習データが少し変わっただけで、予測結果が大きく変動してしまうような不安定なモデル(特に決定木などが該当します)に対して、バギングは非常に効果的です。複数のモデルの結果を集約するため、データの小さな変動に対する予測のブレが少なくなり、安定性が向上します。
計算も効率的に?
各モデルは、他のモデルとは独立して学習させることができます。これは、複数のコンピュータ(CPUコア)を使って同時に学習を進められる(並列処理)ことを意味します。モデルの数が多い場合でも、計算時間を短縮できる可能性があるのは嬉しいポイントです。
ちょっと待って!バギングの弱点(デメリット)
もちろん、バギングにも苦手なことや注意点があります。
計算パワーが必要
たくさんのモデルを個別に学習させる必要があるため、単一のモデルを学習させるよりも計算時間やメモリなどのコンピュータ資源が多く必要になります。データ量が非常に大きい場合や、モデルの数が多い場合は注意が必要です。
元のモデルの「苦手」は克服できない
バギングは主にモデルの分散 (Variance)、つまり予測のばらつきを抑えるのが得意な手法です。しかし、元のモデル自体が持つバイアス (Bias)、つまり予測が真の値から系統的にズレている傾向を減らす効果はあまり期待できません。例えば、そもそも的外れな予測しかできないモデルをたくさん集めて平均しても、やはり的外れな予測になりがちです。
「なぜ?」が分かりにくい
決定木のような単一のモデルであれば、「この特徴量が重要で、こういう理由でこの予測になった」という解釈が比較的しやすいです。しかし、バギング(やランダムフォレスト)のようにたくさんのモデルを組み合わせると、最終的な予測に至った明確な理由を説明するのが難しくなります(解釈可能性の低下)。ブラックボックス化しやすい、とも言えます。
【G検定頻出!】OOBエラーって何?賢く性能チェック!
さて、ブートストラップサンプリングの説明で、「各サンプルには元のデータの約63.2%しか含まれない」という話がありましたね。では、残りの約36.8%のデータ(そのサンプルを作る際に一度も選ばれなかったデータ)はどうなるのでしょうか?
実はこの「選ばれなかったデータ」、OOB (Out-Of-Bag) データ と呼ばれ、非常に役に立ちます!
通常、機械学習モデルの性能を評価するには、学習に使っていない未知のデータ(検証データやテストデータ)を用意する必要があります。しかし、バギングでは、OOBデータを使ってモデルの性能を擬似的に評価できるのです!これを OOBエラー推定 (OOB Score) と呼びます。
具体的には、あるデータ点 i に対して、そのデータ点 i が含まれていないブートストラップサンプルで学習されたモデルたちだけを使って予測を行います。そして、その予測結果と実際のデータ点 i の正解ラベルを比較することで、モデルの誤り率(エラー)を計算します。これをすべてのデータ点について行うことで、モデル全体の性能を評価できる、というわけです。
OOBエラーのメリット:
- 別途、検証データを用意する手間が省ける。
- 学習データを最大限に学習に使いつつ、性能評価もできる。
G検定ポイント: OOBエラーは、バギングやランダムフォレストにおいて、学習に使われなかったデータ(OOB)を利用して、モデルの汎化性能(未知のデータへの対応力)を評価する仕組みである、と覚えておきましょう!交差検証に似た役割を果たします。
【G検定頻出!】ランダムフォレストとの関係は?
「バギング」と聞くと、「ランダムフォレスト」を思い浮かべる方も多いのではないでしょうか?それもそのはず、ランダムフォレストは、バギングをベースにして、さらに強力にしたアルゴリズムなんです!
ランダムフォレストは、基本的に以下の要素で構成されています。
- ベースモデル: 決定木
- アンサンブル手法: バギング (ブートストラップサンプリング + 予測の集約)
- 追加の工夫: 特徴量のランダム選択
バギングとの大きな違いは、この「特徴量のランダム選択」がある点です。
バギングでは、各決定木を学習させる際、分岐(ノード)ごとにすべての特徴量の中から最適な分割点を探します。 一方、ランダムフォレストでは、分岐ごとにランダムに選ばれた一部の特徴量の中から最適な分割点を探します。
なぜ、わざわざ特徴量をランダムに選ぶのでしょうか?
もし、データの中に非常に強力な特徴量(例えば、予測にすごく役立つ特徴量)があると、バギングで作られる多くの決定木が、最初の分岐でその強力な特徴量を使ってしまう可能性があります。すると、出来上がる決定木たちがどれも似たような構造になり、モデル間の多様性が失われ、アンサンブル学習の効果が薄れてしまうことがあります(モデル間の相関が高くなる、と言います)。
そこでランダムフォレストでは、あえて使う特徴量を制限することで、各決定木が異なる特徴量に着目するように仕向けます。これにより、さらに多様性に富んだ、互いに相関の低い決定木がたくさん作られ、結果としてバギングよりもさらに過学習しにくく、安定した精度の高いモデルになる傾向があります。
特徴 | バギング (決定木ベース) | ランダムフォレスト |
データサンプリング | ブートストラップサンプリング | ブートストラップサンプリング |
特徴量選択 | すべての特徴量を使って分岐を決定 | ランダムに選んだ一部の特徴量から分岐を決定 |
モデルの多様性 | 高い | さらに高い |
モデル間の相関 | 低い | さらに低い |
主な目的 | 分散低減、過学習抑制 | 分散低減、過学習抑制(より強力に) |
G検定ポイント: ランダムフォレストはバギングの進化版であり、「ブートストラップサンプリング」に加えて「特徴量のランダム選択」を行うことで、モデルの多様性をさらに高めている、と理解しておきましょう!
【G検定頻出!】バギング vs ブースティング どう違う?
バギングと並んでよく耳にするアンサンブル学習の手法に「ブースティング (Boosting)」があります。どちらも複数のモデルを組み合わせる点は同じですが、そのアプローチは大きく異なります。G検定でもこの違いは頻出ポイントです!
特性 | バギング (Bagging) | ブースティング (Boosting) |
学習方法 | 並列 (各モデルを独立・同時に学習) | 逐次 (モデルを順番に学習) |
モデル間の依存性 | 独立 (他のモデルの影響を受けない) | 依存 (前のモデルの間違いを次のモデルが学習) |
主な効果 | 分散 (Variance) の低減 (予測のばらつきを抑える) | バイアス (Bias) の低減 (予測のズレを修正する) |
データへの重み付け | なし (すべてのデータを平等に扱う) | あり (間違えたデータに重みを付けて学習) |
過学習耐性 | 比較的高い | 注意が必要 (学習しすぎると過学習しやすい) |
計算効率 | 並列処理が可能 | 基本的に逐次処理が必要 |
代表的なアルゴリズム | ランダムフォレスト, ExtraTrees | AdaBoost, Gradient Boosting, XGBoost, LightGBM |
イメージ | 民主的 (みんなの意見を平等に集約) | エリート養成 (間違いを反省して賢くなる) |
バギングは、たくさんの独立した専門家(モデル)に同じ問題を解いてもらい、最後にみんなの意見をまとめる(多数決や平均)イメージです。個々の専門家の得意不得意を平均化することで、全体として安定した結論を出します。予測のばらつき(分散)を抑えるのが得意です。
ブースティングは、まず最初のモデルが問題を解き、そのモデルが間違えた部分を次のモデルが重点的に学習し、さらにその間違いを次のモデルが…というように、モデルが順番に前のモデルの弱点を補っていくイメージです。弱いモデルを段階的に強化していくことで、非常に精度の高いモデルを目指します。予測の根本的なズレ(バイアス)を減らすのが得意です。
G検定ポイント: バギングは並列学習で分散を低減、ブースティングは逐次学習でバイアスを低減!このキーワードの組み合わせは必ず覚えておきましょう。
Pythonでバギングを体験してみよう!
理論だけでなく、実際にコードで動きを見てみると、さらに理解が深まります。ここでは、Pythonの機械学習ライブラリ scikit-learn を使って、バギングを簡単に実装する例をご紹介します。
Python
# 必要なライブラリをインポート
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier # ベースとなるモデル(決定木)
from sklearn.datasets import make_classification # サンプルデータを作成
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# サンプルデータを作成(分類問題)
# 20個の特徴量を持つ1000個のデータサンプルを生成
X, y = make_classification(n_samples=1000, n_features=20,
n_informative=15, n_redundant=5,
random_state=42)
# データを学習用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# バギング分類器を作成
# DecisionTreeClassifierをベースモデルとして使用
bagging_model = BaggingClassifier(
base_estimator=DecisionTreeClassifier(), # どんなモデルをたくさん作るか指定(他のモデルも可)
n_estimators=100, # 作成するモデルの数 (多い方が安定する傾向)
max_samples=0.8, # 1つのブートストラップサンプルで元のデータの何%を使うか (1.0なら全体)
bootstrap=True, # ブートストラップサンプリングを行うか (Trueが基本)
oob_score=True, # OOBスコアを計算するか (Trueにすると後で確認できる)
random_state=42, # 乱数のシード(再現性のため)
n_jobs=-1 # 使用するCPUコア数 (-1は利用可能な全コアを使用)
)
# モデルを学習させる
bagging_model.fit(X_train, y_train)
# テストデータで予測を行う
y_pred = bagging_model.predict(X_test)
# 精度を評価する
accuracy = accuracy_score(y_test, y_pred)
print(f”バギングモデルのテスト精度: {accuracy:.4f}”)
# OOBスコアを確認する (oob_score=Trueの場合)
if bagging_model.oob_score:
print(f”OOBスコア: {bagging_model.oob_score_:.4f}”)
# 参考:ベースの決定木単体の精度も見てみる
single_tree = DecisionTreeClassifier(random_state=42)
single_tree.fit(X_train, y_train)
single_accuracy = single_tree.score(X_test, y_test)
print(f”決定木単体のテスト精度: {single_accuracy:.4f}”)
このコードを実行すると、多くの場合、バギングを使ったモデルの方が、単体の決定木よりも高い精度を示すはずです。また、oob_score_ 属性で、別途テストデータを使わずに評価されたOOBスコアも確認できます。テスト精度と近い値になることが多いです。
base_estimator には、決定木以外にもSVMやロジスティック回帰など、他の様々なモデルを指定することも可能です。
まとめ:バギングをマスターしてG検定に臨もう!
今回は、アンサンブル学習の基本である「バギング」について、その仕組みからメリット・デメリット、そしてG検定で特に重要なポイントまで詳しく解説しました。
バギングの重要ポイントまとめ:
- アンサンブル学習の一種で、複数のモデルを組み合わせる手法。
- ブートストラップサンプリングで、元のデータから重複を許して複数の分身データセットを作る。
- 各分身データセットで独立にモデルを学習させる(並列処理可能)。
- 予測結果を集約(分類なら多数決、回帰なら平均)して最終予測とする。
- 主な効果は分散の低減であり、過学習を抑制し、モデルの安定性を向上させる。
- OOBエラーを使えば、学習に使わなかったデータでモデル性能を評価できる。
- ランダムフォレストは、バギングに特徴量のランダム選択を加えた進化版。
- ブースティングとは異なり、モデルを並列に学習させ、分散を低減するのが得意(ブースティングは逐次学習でバイアス低減)。
バギングの考え方をしっかり理解しておけば、ランダムフォレストや他のアンサンブル手法への理解も深まります。G検定合格に向けて、大きな一歩となるはずです!
コメント