Bamba news

エクストラツリー(ExtraTrees)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】この記事では、機械学習のアルゴリズムであるエクストラツリー(ExtraTrees)について、その仕組みからPythonによる実装方法までを丁寧に解説します。ランダムフォレストとの違いも理解しながら、実践的なスキルを身につけましょう。


はじめに

この記事では、機械学習のアルゴリズムの一つである「エクストラツリー(Extra-Trees)」について、実践的な使い方を解説します。エクストラツリーは、予測精度の高さから様々な場面で利用される強力な手法です。

「アルゴリズム」と聞くと難しく感じるかもしれませんが、この記事では複雑な数式は使わず、基本的な考え方とPythonでの実装方法に焦点を当てて、一つひとつ丁寧に解説していきます。

入門編、活用例編に続く今回は「実践編」として、実際にコードを書きながらエクストラツリーを動かしてみましょう。

記事の最後に、環境構築なしでスマホからでも即実行可能なGoogle Colabノートブックをご用意しています。


エクストラツリーとは?

エクストラツリーは、英語では「Extremely Randomized Trees」と表記されます。日本語に訳すと「極めてランダム化された木々」となり、その名の通り「ランダム性」を大きく取り入れたアルゴリズムです。

機械学習には、「決定木」という基本的なアルゴリズムがあります。これは、データをある条件で次々と分割していくことで、最終的な予測を行う、木のような構造(ツリー構造)を持つモデルです。

エクストラツリーは、この決定木をたくさん集めて、それぞれの予測結果を統合することで、より精度の高い予測を目指すアンサンブル学習という手法の一種です。特に、有名な「ランダムフォレスト」と非常に似た考え方に基づいています。

ランダムフォレストとの違い

エクストラツリーを理解する上で、ランダムフォレストとの違いを知ることが重要です。どちらも複数の決定木を組み合わせる点は同じですが、木の作り方に違いがあります。

ランダムフォレストでは、データを分割する際に、いくつかの候補の中から「最も良い分割」を選びます。

一方、エクストラツリーは、分割の候補を完全にランダムに選びます。この「極端なランダム性」が、エクストラツリーの最大の特徴です。この違いにより、以下のような傾向が生まれます。

  • 計算速度: 最適な分割を探す手間がない分、エクストラツリーの方がランダムフォレストよりも学習が速い傾向があります。
  • 過学習の抑制: ランダム性が高いため、個々の木が訓練データに特化しすぎる(過学習する)のを防ぐ効果がより強いと言われています。

どちらの手法が優れているかは一概には言えず、扱うデータによって最適な手法は異なります。


エクストラツリーの実装(分類編)

それでは、実際にPythonのライブラリであるscikit-learnを使って、エクストラツリーを動かしてみましょう。まずは、データをカテゴリーに分ける「分類」問題を解いてみます。

ここでは、アヤメという花のデータを分類する有名なサンプルデータセットを使います。花のがくの長さや幅、花びらの長さや幅から、どの品種('setosa', 'versicolor', 'virginica')に属するかを予測します。

1. 必要なライブラリの準備

まず、必要なライブラリを読み込みます。

# データの読み込みや操作に必要なライブラリ
import pandas as pd
# 数値計算のためのライブラリ
import numpy as np

# scikit-learnから必要な機能を読み込む
from sklearn.datasets import load_iris # アヤメのデータセット
from sklearn.model_selection import train_test_split # データを訓練用とテスト用に分ける
from sklearn.ensemble import ExtraTreesClassifier # エクストラツリー(分類用)
from sklearn.metrics import accuracy_score # 精度を評価するための指標

2. データの準備

次に、アヤメのデータセットを読み込み、訓練用とテスト用に分割します。モデルの性能を正しく評価するために、学習に使ったデータとは別のデータでテストすることが重要です。

# アヤメのデータセットを読み込む
iris = load_iris()
X = iris.data # 特徴量(がくの長さ、幅など)
y = iris.target # 目的変数(アヤメの品種)

# データを訓練用とテスト用に分割する (訓練:70%, テスト:30%)
# random_stateを固定することで、毎回同じように分割される
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

print(f"訓練データ数: {len(X_train)}")
print(f"テストデータ数: {len(X_test)}")

3. モデルの構築と学習

いよいよエクストラツリーのモデルを構築し、訓練用データを使って学習させます。ExtraTreesClassifierのインスタンスを作成し、fitメソッドで学習を実行します。

重要なパラメータの一つに n_estimators があります。これは、いくつの決定木を作るかを指定するもので、基本的には多いほど性能が安定しますが、その分計算時間も増えます。

# エクストラツリー分類器のインスタンスを作成
# n_estimators: 決定木の数
# random_state: 結果を再現可能にするための乱数シード
et_classifier = ExtraTreesClassifier(n_estimators=100, random_state=42)

# 訓練データを使ってモデルを学習させる
et_classifier.fit(X_train, y_train)

print("モデルの学習が完了しました。")

4. 予測と評価

学習が完了したモデルを使って、テストデータの品種を予測し、その精度を評価します。predictメソッドで予測を行い、accuracy_scoreで正解率を計算します。

# テストデータを使って予測を行う
y_pred = et_classifier.predict(X_test)

# 予測結果と実際の値を比較して、正解率を計算する
accuracy = accuracy_score(y_test, y_pred)

print(f"モデルの正解率: {accuracy:.4f}")

# 実際の値と予測結果をいくつか表示してみる
print("\n--- 予測結果の比較 ---")
results = pd.DataFrame({'実際の品種': y_test, '予測された品種': y_pred})
print(results.head())

このコードを実行すると、モデルがどれくらいの精度でアヤメの品種を予測できたかがわかります。ほとんどの場合、非常に高い正解率が得られるはずです。


エクストラツリーの実装(回帰編)

次に、数値データを予測する「回帰」問題を解いてみましょう。ここでは、ボストンの住宅価格データセット(現在は倫理的な問題から利用が非推奨ですが、アルゴリズムの動作理解のための古典的な例として使用します)を使って、住宅価格を予測するモデルを作成します。

1. 必要なライブラリの準備

分類の時と同様に、必要なライブラリを準備します。回帰では、モデルとしてExtraTreesRegressor、評価指標として平均二乗誤差などを用います。

# データの読み込みや操作に必要なライブラリ
import pandas as pd
# 数値計算のためのライブラリ
import numpy as np

# scikit-learnから必要な機能を読み込む
from sklearn.datasets import fetch_california_housing # カリフォルニアの住宅価格データセット
from sklearn.model_selection import train_test_split # データを訓練用とテスト用に分ける
from sklearn.ensemble import ExtraTreesRegressor # エクストラツリー(回帰用)
from sklearn.metrics import mean_squared_error # 評価指標(平均二乗誤差)

2. データの準備

カリフォルニアの住宅価格データセットを読み込み、訓練用とテスト用に分割します。

# カリフォルニアの住宅価格データセットを読み込む
housing = fetch_california_housing()
X = housing.data # 特徴量(部屋数、築年数など)
y = housing.target # 目的変数(住宅価格)

# データを訓練用とテスト用に分割する (訓練:70%, テスト:30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

print(f"訓練データ数: {len(X_train)}")
print(f"テストデータ数: {len(X_test)}")

3. モデルの構築と学習

回帰用のエクストラツリーモデルであるExtraTreesRegressorを使って、モデルの構築と学習を行います。使い方は分類の時とほとんど同じです。

# エクストラツリー回帰器のインスタンスを作成
et_regressor = ExtraTreesRegressor(n_estimators=100, random_state=42)

# 訓練データを使ってモデルを学習させる
et_regressor.fit(X_train, y_train)

print("モデルの学習が完了しました。")

4. 予測と評価

学習済みモデルでテストデータの住宅価格を予測し、性能を評価します。回帰問題の評価指標としてよく使われる**平均二乗誤差(Mean Squared Error, MSE)**を計算します。これは、予測値と実際の値の差の二乗の平均で、値が小さいほど良いモデルであることを示します。

# テストデータを使って予測を行う
y_pred = et_regressor.predict(X_test)

# 平均二乗誤差を計算する
mse = mean_squared_error(y_test, y_pred)
# 平方根を取ってRMSEにすると、誤差の大きさが直感的に分かりやすくなる
rmse = np.sqrt(mse)

print(f"平均二乗誤差 (MSE): {mse:.4f}")
print(f"二乗平均平方根誤差 (RMSE): {rmse:.4f}")


# 実際の値と予測結果をいくつか表示してみる
print("\n--- 予測結果の比較 ---")
results = pd.DataFrame({'実際の価格': y_test, '予測された価格': y_pred})
print(results.head())

この結果から、モデルが平均的にどれくらいの誤差で住宅価格を予測できているかを確認できます。

特徴量の重要度

エクストラツリー(やランダムフォレスト)の便利な機能の一つに、どの特徴量が予測にどれだけ貢献したかを示す「特徴量の重要度」を算出できる点があります。これにより、モデルがどの情報に注目して予測を行っているのかを知る手がかりが得られます。

# 特徴量の重要度を取得
importances = et_regressor.feature_importances_
feature_names = housing.feature_names

# 重要度をデータフレームにまとめる
feature_importance_df = pd.DataFrame({'特徴量': feature_names, '重要度': importances})
feature_importance_df = feature_importance_df.sort_values(by='重要度', ascending=False)

print("\n--- 特徴量の重要度 ---")
print(feature_importance_df)

この結果を見ることで、例えば「部屋の数」や「所得水準」が住宅価格の予測に大きく影響している、といった分析が可能になります。


まとめ

今回は、エクストラツリー(ExtraTrees)について、その基本的な考え方から、scikit-learnを用いた分類・回帰の実装方法までを解説しました。

  • エクストラツリーは、決定木を多数組み合わせたアンサンブル学習の手法。
  • ランダムフォレストと似ているが、木の分割方法がよりランダムである点が特徴。
  • scikit-learnを使えば、ExtraTreesClassifierExtraTreesRegressorで簡単に実装できる。
  • 分類問題、回帰問題の両方に適用可能で、高い予測性能が期待できる。
  • どの特徴量が予測に重要かを可視化できるため、結果の解釈にも役立つ。

エクストラツリーは、そのシンプルさと性能の高さから、データ分析の現場で強力なツールとなります。この記事が、皆さんの実践的なスキル習得の一助となれば幸いです。


ゲームで学ぶ探索アルゴリズム実践入門~木探索とメタヒューリスティクス

探索技術とそれを支えるアルゴリズムにフォーカスを当て、ゲームAIを題材にその重要性と魅力を楽しく学ぶための入門書です。

▶ Amazonで見る

環境構築なし
実行できるファイルはこちら!

このボタンからGoogle Colabを開き、すぐにコードをお試しいただけます。

関連する記事

ガウス過程回帰を実装してみよう!わかりやすく解説

【スマホからでも実行可能】Pythonでガウス過程回帰を実装する方法を初心者向けにわかりやすく解説します。機械学習のモデル構築や不確実性の可視化に興味がある方必見です。

ベイズ最適化を実装してみよう!わかりやすく解説

【スマホからでも実行可能】ベイズ最適化の実装方法をPythonコード付きで徹底解説。機械学習のハイパーパラメータチューニングを効率化したい方必見。サンプルコードを動かしながら、実践的に学べます。

勾配ブースティング木(Gradient Boosted Trees)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】勾配ブースティング木は、機械学習の分野で非常に強力な予測モデルの一つです。この記事では、その仕組みとPythonによる具体的な実装方法を、初心者にも分かりやすく解説します。実際にコードを動かしながら、この強力なアルゴリズムを体験してみましょう。

ランダムフォレストを実装してみよう!わかりやすく解説

【スマホからでも実行可能】ランダムフォレストの実装方法をPythonコード付きで丁寧に解説。機械学習のアンサンブル学習を実際に動かして理解を深めましょう。初心者にもわかりやすい実践ガイドです。

決定木(Decision Tree)を実装してみよう!わかりやすく解説

【スマホからでも実行可能】決定木の実装方法をPythonコード付きでステップバイステップ解説。データの準備からモデル構築、可視化、評価、チューニングまで、実践的なスキルが身につきます。機械学習の基本である決定木をマスターしましょう。