実際にscikit-learn
は、このような機能を提供しますが、実装するのは少し難しいかもしれません。以下は、3つのモデルの上に構築された平均的なリグレッサーの完全な実例です。まず、必要なすべてのパッケージをインポートしましょう。
from sklearn.base import TransformerMixin
from sklearn.datasets import make_regression
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import LinearRegression, Ridge
次に、3つのリグレッサモデルをトランスフォーマーに変換する必要があります。これにより、以下を使用して、それらの予測を単一の特徴ベクトルにマージできますFeatureUnion
。
class RidgeTransformer(Ridge, TransformerMixin):
def transform(self, X, *_):
return self.predict(X)
class RandomForestTransformer(RandomForestRegressor, TransformerMixin):
def transform(self, X, *_):
return self.predict(X)
class KNeighborsTransformer(KNeighborsRegressor, TransformerMixin):
def transform(self, X, *_):
return self.predict(X)
それでは、フランケンシュタインモデルのビルダー関数を定義しましょう。
def build_model():
ridge_transformer = Pipeline(steps=[
('scaler', StandardScaler()),
('poly_feats', PolynomialFeatures()),
('ridge', RidgeTransformer())
])
pred_union = FeatureUnion(
transformer_list=[
('ridge', ridge_transformer),
('rand_forest', RandomForestTransformer()),
('knn', KNeighborsTransformer())
],
n_jobs=2
)
model = Pipeline(steps=[
('pred_union', pred_union),
('lin_regr', LinearRegression())
])
return model
最後に、モデルを適合させましょう:
print('Build and fit a model...')
model = build_model()
X, y = make_regression(n_features=10, n_targets=2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model.fit(X_train, y_train)
score = model.score(X_test, y_test)
print('Done. Score:', score)
出力:
Build and fit a model...
Done. Score: 0.9600413867438636
なぜこのように物事を複雑にするのですか?さて、このアプローチによりscikit-learn
、GridSearchCV
やなどの標準モジュールを使用してモデルハイパーパラメーターを最適化できますRandomizedSearchCV
。また、事前に訓練されたモデルをディスクから簡単に保存およびロードできるようになりました。