AutoML【TPOT】スタッキング関数「StackingEstimator」(回帰問題編)

AutoML【TPOT】スタッキング関数「StackingEstimator」(回帰問題編)

スタッキングは機械学習のアンサンブル学習の一つです。複数の学習器の出力を特徴量とし、さらに別の学習器で予測する方法です。

TPOTスタッキングは、指定のアルゴリズムで予測した結果とそのアルゴリズムに入力した特徴量を組み合わせて新しい特徴量を生成し、その特徴量を使い別の学習器で予測します。

そのための変換器が、StackingEstimatorです。

TPOTStackingEstimatorを使うには、入力の特徴量と予測器の両方を用意する必要があります。分類問題回帰問題で少し挙動が異なるので別々に説明します。

今回は「回帰問題でのStackingEstimatorの挙動」について説明します。

分類問題についてはこちら(第15回:AutoML【TPOT】スタッキング関数「StackingEstimator」(分類問題編))です。

利用データ

カリフォルニアの住宅価格のデータセットfetch_california_housing)を使います。

データの内容は「第4回:AutoML【TPOT】で回帰問題を解く」を見てください。

予測器ランダムフォレストsklearn.ensemple.RandomForestRegression)を使います。

全体の流れ

 

個々の説明

ライブラリーの読み込み

まずはモジュールやパッケージを読み込みます。

以下、コードです。

from tpot.builtins import StackingEstimator
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
  • StackingEstimator … 前回と同様、TPOT特有のスタッキング処理をするモジュールです
  • fetch_california_housing … 例として使うカリフォルニアの住宅価格のデータです
  • RandomForestRegressor … StackingEstimatorで使う予測器(回帰器)です

 

データの読み込みと確認

次にデータを読み込みます。

以下、コードです。

data = fetch_california_housing(as_frame=True)
X = data.data   # 特徴量をXに格納
y = data.target # 目的変数をyに格納

 

as_frame=Trueは、データをpandasのデータフレーム形式で読み込むという意味です。

特徴量fetch_california_housingdataをキーとして取り出すことができ、目的変数fetch_california_housingtargetをキーとして取り出すことができます。

 

StackingEstimatorを変換したときの結果を見やすいように、特徴量を3列だけに絞って話しを進めます。

以下、コードです。

X = X.iloc[:,:3]  # 3列抽出

 

データX,yの中身を見てみます。見やすいように最初の10行だけ表示させています。

以下、データXを見るコードです。

print(X.head(10)) # Xの中身を10行だけ表示

 

以下、実行結果です。

 

特徴量MedInc, HouseAge, AveRooms3列あることがわかります。

以下、データyを見るコードです。

print(y.head(10)) # yの中身を10行だけ表示

 

以下、実行結果です。

 

予測器(回帰器)の設定と学習、その結果の確認

StackingEstimatorに入力する予測器(回帰器)のランダムフォレストを設定します。

以下、コードです。

regr = RandomForestRegressor(random_state=42)

 

random_stateパラメータ(乱数のシード)に値を設定して、予測の実行結果が変わらないようにしておきます。

さらに、print文で設定内容を確認します。

以下、コードです。

print(regr) # 設定内容の確認

 

以下、実行結果です。

 

学習した回帰器regr)に特徴量Xを入力して予測します。

以下、コードです。

regr.fit(X,y)

 

予測結果y_predictに格納します。

以下、コードです。

y_predict = regr.predict(X)

 

特徴量X予測結果の中身を見てみましょう。わかりやすいように最初の10行だけ表示します。

以下、コードです。

print('▼元の特徴量X')
print(X.head(10))
print('\n▼予測結果y_predict')
print(y_predict[:10])

 

以下、実行結果です。

 

StackingEstimatorの設定と学習、その結果の確認

それではStackingEstimatorを作りましょう。

estimatorパラメータで使いたい予測器(回帰器)を設定します。今回用意したregr(RandomForestRegressor)を使います。

以下、コードです。

stacking_estimator = StackingEstimator(estimator=regr)

 

print文で設定内容を確認できます。

以下、コードです。

print(stacking_estimator)

 

以下、実行結果です。

 

予測器としてRandomForestRegressorを使っており、予測器の設定random_state=42が引き継がれているということがわかります。

 

StackingEstimatorは学習させる必要があります。引数として特徴量と目的変数を指定して、学習します。

以下、コードです。

stacking_estimator.fit(X,y)

 

以下、実行結果です。

 

学習済みのStackingEstimatorを使って特徴量を変換できます。

変換したい特徴量引数に指定します。今回は学習に使った特徴量と同じものを使います。

以下、コードです。

X_transformed = stacking_estimator.transform(X)

 

さらに、変換した結果print文で表示します。見やすいように10行だけ表示させます。

以下、コードです。

print(X_transformed[:10])

 

以下、実行結果です。

 

実行結果を説明する前に、StackingEstimatorの仕組みを説明します。

  • StackingEstimatorで使うestimator(今回はRandomForestRegression)を、引数で与えた特徴量Xyで学習する。
  • 学習済みのestimatorで、特徴量Xから予測する。
  • 引数で与えた特徴量Xと予測結果を結合して出力し、新たな特徴量とする。

変換された特徴量は次のようになります。

 

実際に元の特徴量と予測結果を結合したものと同じになっています。それぞれ値が一致することを確認してみてください。

ソースコードの全体像

# ライブラリーの読み込み
from tpot.builtins import StackingEstimator
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor

# データの読み込みと確認
## データの読み込み
data = fetch_california_housing(as_frame=True)
X = data.data   # 特徴量をXに格納
y = data.target # 目的変数をyに格納

## データの中を見る
X = X.iloc[:,:3]  # 3列抽出
print(X.head(10)) # Xの中身を10行だけ表示
print(y.head(10)) # yの中身を10行だけ表示

# 予測器(回帰器)の設定と学習、その結果の確認
## 予測器(回帰器)の設定
regr = RandomForestRegressor(random_state=42)

## 予測器(回帰器)の設定を見る
print(regr) # 設定内容の確認

## 予測器(回帰器)の学習
regr.fit(X,y)

## 予測器(回帰器)を使った予測
y_predict = regr.predict(X)

## 予測結果
print('▼元の特徴量X')
print(X.head(10))
print('\n▼予測結果y_predict')
print(y_predict[:10])

# StackingEstimatorの設定と学習、その結果の確認
## StackingEstimatorの設定
stacking_estimator = StackingEstimator(estimator=regr)

## StackingEstimatorの設定を見る
print(stacking_estimator)

## StackingEstimatorの学習
stacking_estimator.fit(X,y)

## StackingEstimatorによる特徴量の生成
X_transformed = stacking_estimator.transform(X)

## StackingEstimatorが生成した特徴量を見る
print(X_transformed[:10])

 

次回

TPOTには、いくつかバリエーションがあります。今までお話ししていたのは通常版TPOTです。他にも簡易版TPOTや、スパース推定版TPOTなどがあります。TPOT configurationsで設定します。

次回は、「TPOT configurations」について説明します。