Voting Regressor - 複数モデルを組み合わせて予測精度を向上するアンサンブル学習
いまさらながらVoting Regressorのアンサンブル学習をChatGPTに教えてもらった。Kaggleで公開されている高スコアのコードの多くがアンサンブル学習を利用している。いままで主にLightGBMを使っていたが、様々なモデルの特性も理解して、課題に応じた組み合わせが必要なんだろう。
アンサンブル学習の基本
アンサンブル学習は、複数のモデルを組み合わせることで、それぞれのモデルの予測の不確実性やバイアス、バリアンスを低減し、全体としての予測精度を向上させる手法です。個々のモデルが苦手とするパターンやデータの特性を補完し合うことで、単一モデルよりも優れた性能が期待されます。
バイアス(予測の誤差):モデルが実際のデータの真の関係性からどれだけ偏っているかを示します。高いバイアスを持つモデルは、データの本質的なパターンを捉えられず、一般化能力が低い傾向にあります。
バリアンス(ばらつき誤差):モデルの予測が訓練データの変化に対してどれだけ敏感に反応するかを示します。高いバリアンスを持つモデルは、訓練データに対して過度に最適化され、新しいデータに対する予測が不安定になりがちです。
Voting Regressorについて
Voting Regressorは、複数の回帰モデルの予測を統合する手法で、各モデルが出力する数値予測を平均化することで最終的な予測を行います。この方法は、異なるタイプのモデルを組み合わせる際に特に有効です。
単純平均化:すべてのモデルの予測値に同等の重みを与える手法です。これは、各モデルが同程度に信頼できると考えられる場合や、特定のモデルに偏りを持たせたくない場合に適しています。
重み付き平均化:各モデルの予測に異なる重みを設定する手法です。これにより、過去の性能に基づいて、より正確な予測を行うモデルに大きな影響力を与えることができます。重みは手動で設定することも、交差検証を通じて自動的に最適化することも可能です。
サンプルコードと結果
カリフォルニアの住宅価格データセットを使用してVoting Regressorを実装した例を以下に示します。この例では、線形回帰と決定木を組み合わせ、各モデルの重みは既定値が weights=[1, 1] ですが、それぞれ異なる重みを指定することもできます。
3つ以上のモデルを組み合わせることも可能ですが、異なるアルゴリズムのモデルを選択し、それらの組み合わせが予測精度にどのように影響するかを適切に評価することが重要です。このアプローチにより、各モデルの強みを活かし、全体としての性能向上が期待できます。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import VotingRegressor
from sklearn.metrics import mean_squared_error
from sklearn.datasets import fetch_california_housing
# データセットの読み込み
housing = fetch_california_housing()
X = housing.data
y = housing.target
# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 異なる種類の回帰モデル
model1 = LinearRegression()
model2 = DecisionTreeRegressor(random_state=42)
# VotingRegressorの設定(重みを明示的に既定値[1, 1]で設定)
voting_regressor = VotingRegressor(estimators=[
('lr', model1),
('dt', model2)
], weights=[1, 1]) # 既定の重みを明示的に設定
# モデルの訓練
model1.fit(X_train, y_train)
model2.fit(X_train, y_train)
voting_regressor.fit(X_train, y_train)
# 予測値の計算とMSEの評価
y_pred_lr = model1.predict(X_test)
y_pred_dt = model2.predict(X_test)
y_pred_voting = voting_regressor.predict(X_test)
mse_lr = mean_squared_error(y_test, y_pred_lr)
mse_dt = mean_squared_error(y_test, y_pred_dt)
mse_voting = mean_squared_error(y_test, y_pred_voting)
# 結果の表示
print("Linear Regression MSE:", mse_lr)
print("Decision Tree MSE:", mse_dt)
print("Voting Regressor MSE:", mse_voting)
実行結果:
Linear Regression MSE: 0.5558915986952422
Decision Tree MSE: 0.495235205629094
Voting Regressor MSE: 0.3835886357139298
実行結果を見ると、Voting Regressorが他の個別モデルよりも優れた予測性能を発揮していることが確認できます。異なるアプローチを持つ複数のモデルの予測の強みを組み合わせることで、予測精度を高めることが可能です。これにより、Voting Regressorは、さまざまな問題に対して効果的な解決策を提供することができます。
この記事が気に入ったらサポートをしてみませんか?