__all__ = ["MLClassificationExperiments"]
from ._main import Experiments
from .utils import classification_space
from ai4water.utils.utils import dateandtime_now
from ai4water.backend import catboost, xgboost, lightgbm
[docs]class MLClassificationExperiments(Experiments):
"""Runs classification models for comparison, with or without
optimization of hyperparameters. It compares around 30 classification
algorithms from sklearn, xgboost, catboost and lightgbm.
Examples
--------
>>> from ai4water.datasets import MtropicsLaos
>>> from ai4water.experiments import MLClassificationExperiments
>>> data = MtropicsLaos().make_classification(lookback_steps=2)
>>> inputs = data.columns.tolist()[0:-1]
>>> outputs = data.columns.tolist()[-1:]
>>> exp = MLClassificationExperiments(input_features=inputs,
>>> output_features=outputs)
>>> exp.fit(data=data, include=["CatBoostClassifier", "LGBMClassifier",
>>> 'RandomForestClassifier', 'XGBClassifier'])
>>> exp.compare_errors('accuracy', data=data)
"""
[docs] def __init__(
self,
param_space=None,
x0=None,
cases=None,
exp_name='MLClassificationExperiments',
num_samples=5,
monitor = None,
**model_kws
):
"""
Parameters
----------
param_space : list, optional
x0 : list, optional
cases : dict, optional
exp_name : str, optional
name of experiment
num_samples : int, optional
monitor : list/str, optional
**model_kws :
keyword arguments for :py:class:`ai4water.Model` class
"""
self.param_space = param_space
self.x0 = x0
self.spaces = classification_space(num_samples=num_samples,)
if exp_name == "MLClassificationExperiments":
exp_name = f"{exp_name}_{dateandtime_now()}"
super().__init__(
cases=cases,
exp_name=exp_name,
num_samples=num_samples,
monitor=monitor,
**model_kws
)
if catboost is None:
self.models.remove('model_CatBoostClassifier')
if lightgbm is None:
self.models.remove('model_LGBMClassifier')
if xgboost is None:
self.models.remove('model_XGBRFClassifier')
self.models.remove('model_XGBClassifier')
@property
def tpot_estimator(self):
try:
from tpot import TPOTClassifier
except (ModuleNotFoundError, ImportError):
TPOTClassifier = None
return TPOTClassifier
@property
def mode(self):
return "classification"
@property
def category(self):
return "ML"
def metric_kws(self, metric_name:str=None):
kws = {
'precision': {'average': 'macro'},
'recall': {'average': 'macro'},
'f1_score': {'average': 'macro'},
}
return kws.get(metric_name, {})
def model_AdaBoostClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html
self.path = "sklearn.ensemble.AdaBoostClassifier"
self.param_space = self.spaces["AdaBoostClassifier"]["param_space"]
self.x0 = self.spaces["AdaBoostClassifier"]["x0"]
return {'model': {'AdaBoostClassifier': kwargs}}
def model_BaggingClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html
self.path = "sklearn.ensemble.BaggingClassifier"
self.param_space = self.spaces["BaggingClassifier"]["param_space"]
self.x0 = self.spaces["BaggingClassifier"]["x0"]
return {'model': {'BaggingClassifier': kwargs}}
def model_BernoulliNB(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html
self.path = "sklearn.naive_bayes.BernoulliNB"
self.param_space = self.spaces["BernoulliNB"]["param_space"]
self.x0 = self.spaces["BernoulliNB"]["x0"]
return {'model': {'BernoulliNB': kwargs}}
def model_CalibratedClassifierCV(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.calibration.CalibratedClassifierCV.html
self.path = "sklearn.calibration.CalibratedClassifierCV"
self.param_space = self.spaces["CalibratedClassifierCV"]["param_space"]
self.x0 = self.spaces["CalibratedClassifierCV"]["x0"]
return {'model': {'CalibratedClassifierCV': kwargs}}
# def model_CheckingClassifier(self, **kwargs):
# return
def model_DecisionTreeClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
self.path = "sklearn.tree.DecisionTreeClassifier"
self.param_space = self.spaces["DecisionTreeClassifier"]["param_space"]
self.x0 = self.spaces["DecisionTreeClassifier"]["x0"]
return {'model': {'DecisionTreeClassifier': kwargs}}
def model_DummyClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html
self.path = "sklearn.dummy.DummyClassifier"
self.param_space = self.spaces["DummyClassifier"]["param_space"]
self.x0 = self.spaces["DummyClassifier"]["x0"]
return {'model': {'DummyClassifier': kwargs}}
def model_ExtraTreeClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.tree.ExtraTreeClassifier.html
self.path = "sklearn.tree.ExtraTreeClassifier"
self.param_space = self.spaces["ExtraTreeClassifier"]["param_space"]
self.x0 = self.spaces["ExtraTreeClassifier"]["x0"]
return {'model': {'ExtraTreeClassifier': kwargs}}
def model_ExtraTreesClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html
self.path = "sklearn.ensemble.ExtraTreesClassifier"
self.param_space = self.spaces["ExtraTreesClassifier"]["param_space"]
self.x0 = self.spaces["ExtraTreesClassifier"]["x0"]
return {'model': {'ExtraTreesClassifier': kwargs}}
def model_GaussianProcessClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html
self.path = "sklearn.gaussian_process.GaussianProcessClassifier"
self.param_space = self.spaces["GaussianProcessClassifier"]["param_space"]
self.x0 = self.spaces["GaussianProcessClassifier"]["x0"]
return {'model': {'GaussianProcessClassifier': kwargs}}
def model_GradientBoostingClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.tree.ExtraTreeClassifier.html
self.path = "sklearn.ensemble.GradientBoostingClassifier"
self.param_space = self.spaces["GradientBoostingClassifier"]["param_space"]
self.x0 = self.spaces["GradientBoostingClassifier"]["x0"]
return {'model': {'GradientBoostingClassifier': kwargs}}
def model_HistGradientBoostingClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html
self.path = "sklearn.ensemble.HistGradientBoostingClassifier"
self.param_space = self.spaces["HistGradientBoostingClassifier"]["param_space"]
self.x0 = self.spaces["HistGradientBoostingClassifier"]["x0"]
return {'model': {'HistGradientBoostingClassifier': kwargs}}
def model_KNeighborsClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
self.path = "sklearn.neighbors.KNeighborsClassifier"
self.param_space = self.spaces["KNeighborsClassifier"]["param_space"]
self.x0 = self.spaces["KNeighborsClassifier"]["x0"]
return {'model': {'KNeighborsClassifier': kwargs}}
def model_LabelPropagation(self, **kwargs):
## https://scikit-learn.org/stable/modules/generated/sklearn.semi_supervised.LabelPropagation.html
self.path = "sklearn.semi_supervised.LabelPropagation"
self.param_space = self.spaces["LabelPropagation"]["param_space"]
self.x0 = self.spaces["LabelPropagation"]["x0"]
return {'model': {'LabelPropagation': kwargs}}
def model_LabelSpreading(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.semi_supervised.LabelSpreading.html
self.path = "sklearn.semi_supervised.LabelSpreading"
self.param_space = self.spaces["LabelSpreading"]["param_space"]
self.x0 = self.spaces["LabelSpreading"]["x0"]
return {'model': {'LabelSpreading': kwargs}}
def model_LGBMClassifier(self, **kwargs):
# https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html
self.path = "lightgbm.LGBMClassifier"
self.param_space = self.spaces["LGBMClassifier"]["param_space"]
self.x0 = self.spaces["LGBMClassifier"]["x0"]
return {'model': {'LGBMClassifier': kwargs}}
def model_LinearDiscriminantAnalysis(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html
self.path = "sklearn.discriminant_analysis.LinearDiscriminantAnalysis"
self.param_space = self.spaces["LinearDiscriminantAnalysis"]["param_space"]
self.x0 = self.spaces["LinearDiscriminantAnalysis"]["x0"]
return {'model': {'LinearDiscriminantAnalysis': kwargs}}
def model_LinearSVC(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html
self.path = "sklearn.svm.LinearSVC"
self.param_space = self.spaces["LinearSVC"]["param_space"]
self.x0 = self.spaces["LinearSVC"]["x0"]
return {'model': {'LinearSVC': kwargs}}
def model_LogisticRegression(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
self.path = "sklearn.linear_model.LogisticRegression"
self.param_space = self.spaces["LogisticRegression"]["param_space"]
self.x0 = self.spaces["LogisticRegression"]["x0"]
return {'model': {'LogisticRegression': kwargs}}
def model_MLPClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
self.path = "sklearn.neural_network.MLPClassifier"
self.param_space = self.spaces["MLPClassifier"]["param_space"]
self.x0 = self.spaces["MLPClassifier"]["x0"]
return {'model': {'MLPClassifier': kwargs}}
def model_NearestCentroid(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.NearestCentroid.html
self.path = "sklearn.neighbors.NearestCentroid"
self.param_space = self.spaces["NearestCentroid"]["param_space"]
self.x0 = self.spaces["NearestCentroid"]["x0"]
return {'model': {'NearestCentroid': kwargs}}
def model_NuSVC(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.svm.NuSVC.html
self.path = "sklearn.svm.NuSVC"
self.param_space = self.spaces["NuSVC"]["param_space"]
self.x0 = self.spaces["NuSVC"]["x0"]
return {'model': {'NuSVC': kwargs}}
def model_PassiveAggressiveClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.PassiveAggressiveClassifier.html
self.path = "sklearn.linear_model.PassiveAggressiveClassifier"
self.param_space = self.spaces["PassiveAggressiveClassifier"]["param_space"]
self.x0 = self.spaces["PassiveAggressiveClassifier"]["x0"]
return {'model': {'PassiveAggressiveClassifier': kwargs}}
def model_Perceptron(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html
self.path = "sklearn.linear_model.Perceptron"
self.param_space = self.spaces["Perceptron"]["param_space"]
self.x0 = self.spaces["Perceptron"]["x0"]
return {'model': {'Perceptron': kwargs}}
def model_QuadraticDiscriminantAnalysis(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis.html
self.path = "sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis"
self.param_space = self.spaces["QuadraticDiscriminantAnalysis"]["param_space"]
self.x0 = self.spaces["QuadraticDiscriminantAnalysis"]["x0"]
return {'model': {'QuadraticDiscriminantAnalysis': kwargs}}
# def model_RadiusNeighborsClassifier(self, **kwargs):
# # https://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis.html
#
# self.path = "sklearn.neighbors.RadiusNeighborsClassifier"
# self.param_space = self.spaces["RadiusNeighborsClassifier"]["param_space"]
# self.x0 = self.spaces["RadiusNeighborsClassifier"]["x0"]
#
# return {'model': {'RadiusNeighborsClassifier': kwargs}}
def model_RandomForestClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
self.path = "sklearn.ensemble.RandomForestClassifier"
self.param_space = self.spaces["RandomForestClassifier"]["param_space"]
self.x0 = self.spaces["RandomForestClassifier"]["x0"]
return {'model': {'RandomForestClassifier': kwargs}}
def model_RidgeClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeClassifier.html
self.path = "sklearn.linear_model.RidgeClassifier"
self.param_space = self.spaces["RidgeClassifier"]["param_space"]
self.x0 = self.spaces["RidgeClassifierCV"]["x0"]
return {'model': {'RidgeClassifier': kwargs}}
def model_RidgeClassifierCV(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeClassifierCV.html
self.path = "sklearn.linear_model.RidgeClassifierCV"
self.param_space = self.spaces["RidgeClassifierCV"]["param_space"]
self.x0 = self.spaces["RidgeClassifierCV"]["x0"]
return {'model': {'RidgeClassifierCV': kwargs}}
def model_SGDClassifier(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html
self.path = "sklearn.linear_model.SGDClassifier"
self.param_space = self.spaces["SGDClassifier"]["param_space"]
self.x0 = self.spaces["SGDClassifier"]["x0"]
return {'model': {'SGDClassifier': kwargs}}
def model_SVC(self, **kwargs):
# https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
self.path = "sklearn.svm.SVC"
self.param_space = self.spaces["SVC"]["param_space"]
self.x0 = self.spaces["SVC"]["x0"]
return {'model': {'SVC': kwargs}}
def model_XGBClassifier(self, **kwargs):
# https://xgboost.readthedocs.io/en/latest/python/python_api.html
self.path = "xgboost.XGBClassifier"
self.param_space = self.spaces["XGBClassifier"]["param_space"]
self.x0 = self.spaces["XGBClassifier"]["x0"]
return {'model': {'XGBClassifier': kwargs}}
def model_XGBRFClassifier(self, **kwargs):
# https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.XGBRFClassifier
self.path = "xgboost.XGBRFClassifier"
self.param_space = self.spaces["XGBRFClassifier"]["param_space"]
self.x0 = self.spaces["XGBRFClassifier"]["x0"]
return {'model': {'XGBRFClassifier': kwargs}}
def model_CatBoostClassifier(self, **suggestions):
# https://catboost.ai/en/docs/concepts/python-reference_catboostclassifier
self.path = "catboost.CatBoostClassifier"
self.param_space = self.spaces["CatBoostClassifier"]["param_space"]
self.x0 = self.spaces["CatBoostClassifier"]["x0"]
return {'model': {'CatBoostClassifier': suggestions}}