import math
from typing import Dict
from sklearn.dummy import DummyRegressor
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.linear_model import (BayesianRidge, ElasticNet, Lasso,
LinearRegression, Ridge, SGDRegressor)
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.neural_network import MLPRegressor
from sklearn.svm import SVR, LinearSVR
from sklearn.tree import DecisionTreeRegressor
from xgboost import XGBRegressor, XGBRFRegressor
from ._models import _EasyModel
[docs]class EasyRegressor(_EasyModel):
"""
Fit regressor models in
- _DEFAULT_REGRESSORS (if include_defaults=True)
- models_dict (if models_dict != None)
Parameters
----------
models_dict : Dictionary of additional models
Can hold:
- classes: models_dict = {'LinearRegression': LinearRegression}
- objects: models_dict = {'LinearRegression': LinearRegression()}
(Default value = None)
include_defaults : boolean
Include _DEFAULT_REGRESSORS in trained models\n
(Default value = True)
"""
_DEFAULT_REGRESSORS = {
'DummyRegressor': DummyRegressor,
'LinearRegressor': LinearRegression,
'LassoRegressor': Lasso,
'RidgeRegressor': Ridge,
'BayesianRidgeRegressor': BayesianRidge,
'ElasticNetRegressor': ElasticNet,
'SGDRegressor': SGDRegressor,
'DecisionTreeRegressor': DecisionTreeRegressor,
'GaussianProcessRegressor': GaussianProcessRegressor,
'SupportVectorRegressor': SVR,
'LinearSVR': LinearSVR,
'XGBRegressor': XGBRegressor,
'XGBRFRegressor': XGBRFRegressor,
'MLPRegressor': MLPRegressor
}
_METRICS = {
"Mean Absolute Error": mean_absolute_error,
"Mean Squared Error": mean_squared_error,
"Root Mean Squared Error": lambda X, y: math.sqrt(mean_squared_error(X, y)),
"R2 Score": r2_score
}
def __init__(self, models_dict: Dict = None,
include_defaults: bool = True):
super().__init__(self._DEFAULT_REGRESSORS, models_dict,
include_defaults=include_defaults)
[docs] def fit(self, X, y):
"""
Fit regressors in self._models on features X with targets y\n
Calls method fit for each model in self._models
Parameters
----------
X : array of features
y : array of targets
Returns
-------
None
"""
super().fit(X, y)
[docs] def predict(self, X):
"""
Make predictions for features in X\n
Call predict method for each model in self._models
Parameters
----------
X : array of features
Returns
-------
preds: Dict
Dictionary with same keys in self._models and predictions for each
model of features in X
"""
return super().predict(X)
[docs] def score(self, X, y, as_df=True, sort=True):
"""
Calculate score for each model in self._models\n
Calls score method for each model in self._models\n
Return mean accuracy for each model on the given data and labels
Parameters
----------
X : array of features
y : array of targets
as_df : boolean
- if True: return results in pd.DataFrame
- if False: return results in dictionary
(Default value = True)
sort: boolean
- if True: returns results sorted in discending order by score
- if False: returns results in the original order of models
(Default value = True)
Returns
-------
results: Dict (as_df=False) or pd.Dataframe (as_df=True)
"""
return super().score(X, y, as_df=as_df, sort=sort)
[docs] def evaluate(self, X, y, as_df=True, model_first=True, from_preds=False):
"""
Returns models results on each of the metrics in self._METRICS
dictionary
Parameters
----------
X : array of features
y : array of targets
as_df : boolean
- if True: return results in pd.DataFrame
- if False: return results in dictionary
(Default value = True)
model_first : boolean
- if True: returns models at axis=0 (rows), results at axis=1 (columns)
- if False: returns models at axis=1 (columns), results at axis=0 (rows)
(Default value = True)
from_preds : boolean
- if True: make preditions then calacuate metrics (X holds input features)
- if False: calcualte metrics from predictions (X holds predictions)
(Default value = True)
Returns
-------
results: Dict (as_df=False) or pd.Dataframe (as_df=True)
"""
return super().evaluate(X, y, as_df=as_df, model_first=model_first,
from_preds=from_preds)
[docs] def get_model(self, model_key):
"""
Get specific model from self._models
Parameters
----------
model_key : the key for model in self._models
Returns
-------
model object corrseponding to key if key exist
None if key does not exist
"""
return self._models.get(model_key, None)