Source code for nolearn.model
import numpy as np
from scipy import sparse
from sklearn.base import BaseEstimator
from sklearn.externals.joblib import delayed
from sklearn.externals.joblib import Parallel
[docs]class AbstractModel(object):
"""A small abstraction around :class:`~sklearn.pipeline.Pipeline`
objects.
Allows the convenient parametrization of the underlying pipeline
through :attr:`~AbstractModel.params`.
"""
default_params = dict()
def __init__(self, **kwargs):
"""
:param kwargs: Keyword arguments correspond to pipeline
parameters, and will override parameters in
:attr:`~AbstractModel.default_params`.
"""
params = self.default_params.copy()
params.update(kwargs)
self.params = params
def __call__(self):
"""
:rtype: :class:`~sklearn.pipeline.Pipeline`
"""
pipeline = self.pipeline
pipeline.set_params(**self.params)
return pipeline
@property
def pipeline(self): # pragma: no cover
raise NotImplementedError()
def _avgest_fit_est(est, i, X, y, verbose):
if verbose:
print "[AveragingEstimator] estimator_%s.fit() ..." % i
return est.fit(X, y)
def _avgest_predict_proba(est, i, X, verbose):
if verbose:
print "[AveragingEstimator] estimator_%s.predict_proba() ..." % i
return est.predict_proba(X)
[docs]class AveragingEstimator(BaseEstimator):
"""An estimator that wraps a list of other estimators and returns
their average for :meth:`fit`, :meth:`predict` and
:meth:`predict_proba`.
"""
def __init__(self, estimators, verbose=0, n_jobs=1):
"""
:param estimators: List of estimator objects.
"""
self.estimators = estimators
self.verbose = verbose
self.n_jobs = n_jobs
def fit(self, X, y):
result = Parallel(n_jobs=self.n_jobs, verbose=self.verbose)(
delayed(_avgest_fit_est)(est, i, X, y, self.verbose)
for i, est in enumerate(self.estimators))
self.estimators = result
return self
def predict(self, X):
return np.argmax(self.predict_proba(X), axis=1)
def predict_proba(self, X):
result = Parallel(n_jobs=self.n_jobs, verbose=self.verbose)(
delayed(_avgest_predict_proba)(est, i, X, self.verbose)
for i, est in enumerate(self.estimators))
for proba in result[1:]:
result[0] += proba
return result[0] / len(self.estimators)
[docs]class FeatureStacker(BaseEstimator):
"""Combine several transformer objects and yield their results in
a single, concatenated feature matrix.
"""
def __init__(self, estimators):
"""
:param estimators: A list of tuples of the form `(name, estimator)`
"""
self.estimators = estimators
def fit(self, X, y=None):
for name, trans in self.estimators:
trans.fit(X, y)
return self
def transform(self, X):
features = []
for name, estimator in self.estimators:
features.append(estimator.transform(X))
issparse = [sparse.issparse(f) for f in features]
if np.any(issparse):
features = sparse.hstack(features).tocsr()
else:
features = np.hstack(features)
return features
def get_params(self, deep=True):
if not deep:
return super(FeatureStacker, self).get_params(deep=False)
else:
out = dict(self.estimators)
for name, estimator in self.estimators:
for key, value in estimator.get_params(deep=True).items():
out['%s__%s' % (name, key)] = value
return out