Source code for hypernets.tabular.ensemble.stacking

# -*- coding:utf-8 -*-
__author__ = 'yangjian'
"""

"""
from sklearn.linear_model import LogisticRegression, LinearRegression

from .base_ensemble import BaseEnsemble


[docs]class StackingEnsemble(BaseEnsemble): def __init__(self, task, estimators, need_fit=False, n_folds=5, method='soft', meta_model=None, fit_kwargs=None): super(StackingEnsemble, self).__init__(task, estimators, need_fit, n_folds, method) if meta_model is None: if task == 'regression': self.meta_model = LinearRegression() else: self.meta_model = LogisticRegression() else: self.meta_model = meta_model self.fit_kwargs = fit_kwargs if fit_kwargs is not None else {}
[docs] def fit_predictions(self, predictions, y_true): X = self.__predictions2X(predictions) self.meta_model.fit(X, y_true, **self.fit_kwargs)
def __predictions2X(self, predictions): X = predictions if len(X.shape) == 3: if self.task == 'binary': X = X[:, :, -1] elif self.task == 'multiclass': np = self.np X = np.argmax(X, axis=2) else: raise ValueError( f"The shape of `predictions` and the `task` don't match. shape:{predictions.shape}, task:{self.task}") return X
[docs] def predictions2predict(self, predictions): assert self.meta_model is not None X = self.__predictions2X(predictions) pred = self.meta_model.predict(X) if self.task == 'binary': np = self.np pred = np.clip(pred, 0, 1) return pred
[docs] def predictions2predict_proba(self, predictions): assert self.meta_model is not None X = self.__predictions2X(predictions) if hasattr(self.meta_model, 'predict_proba'): pred = self.meta_model.predict_proba(X) else: pred = self.meta_model.predict(X) if self.task == 'binary': np = self.np pred = np.clip(pred, 0, 1) return pred