Source code for simpleml.models.classifiers.sklearn.ensemble

'''
Wrapper module around `sklearn.ensemble`
'''

[docs]__author__ = 'Elisha Yadgaran'
from .base_sklearn_classifier import SklearnClassifier from simpleml.models.classifiers.external_models import ClassificationExternalModelMixin from sklearn.ensemble import AdaBoostClassifier, BaggingClassifier, ExtraTreesClassifier,\ GradientBoostingClassifier, RandomForestClassifier, VotingClassifier import logging
[docs]LOGGER = logging.getLogger(__name__)
''' AdaBoost Classifier ''' # TODO: experiment with try excepts on different estimator types (feature_importances_, coefficients, ...)
[docs]class WrappedSklearnAdaBoostClassifier(AdaBoostClassifier, ClassificationExternalModelMixin): # Boosted classifier doesnt have an easy way to aggregate feature metadata pass
[docs]class SklearnAdaBoostClassifier(SklearnClassifier):
[docs] def _create_external_model(self, **kwargs): return WrappedSklearnAdaBoostClassifier(**kwargs)
''' Bagging Classfier '''
[docs]class WrappedSklearnBaggingClassifier(BaggingClassifier, ClassificationExternalModelMixin): # Bagging classifier doesnt have an easy way to aggregate feature metadata pass
[docs]class SklearnBaggingClassifier(SklearnClassifier):
[docs] def _create_external_model(self, **kwargs): return WrappedSklearnBaggingClassifier(**kwargs)
''' Extra Trees Classifier '''
[docs]class WrappedSklearnExtraTreesClassifier(ExtraTreesClassifier, ClassificationExternalModelMixin):
[docs] def get_feature_metadata(self, features, **kwargs): feature_importances = self.feature_importances_.squeeze() if features is None or len(features) < len(feature_importances): LOGGER.warning('Fewer feature names than features passed, defaulting to numbered list') features = range(len(feature_importances)) return dict(zip(features, feature_importances))
[docs]class SklearnExtraTreesClassifier(SklearnClassifier):
[docs] def _create_external_model(self, **kwargs): return WrappedSklearnExtraTreesClassifier(**kwargs)
''' Gradient Boosting Classifier '''
[docs]class WrappedSklearnGradientBoostingClassifier(GradientBoostingClassifier, ClassificationExternalModelMixin):
[docs] def get_feature_metadata(self, features, **kwargs): feature_importances = self.feature_importances_.squeeze() if features is None or len(features) < len(feature_importances): LOGGER.warning('Fewer feature names than features passed, defaulting to numbered list') features = range(len(feature_importances)) return dict(zip(features, feature_importances))
[docs]class SklearnGradientBoostingClassifier(SklearnClassifier):
[docs] def _create_external_model(self, **kwargs): return WrappedSklearnGradientBoostingClassifier(**kwargs)
''' Random Forest Classifier '''
[docs]class WrappedSklearnRandomForestClassifier(RandomForestClassifier, ClassificationExternalModelMixin):
[docs] def get_feature_metadata(self, features, **kwargs): feature_importances = self.feature_importances_.squeeze() if features is None or len(features) < len(feature_importances): LOGGER.warning('Fewer feature names than features passed, defaulting to numbered list') features = range(len(feature_importances)) return dict(zip(features, feature_importances))
[docs]class SklearnRandomForestClassifier(SklearnClassifier):
[docs] def _create_external_model(self, **kwargs): return WrappedSklearnRandomForestClassifier(**kwargs)
''' Voting Classifier '''
[docs]class WrappedSklearnVotingClassifier(VotingClassifier, ClassificationExternalModelMixin): # Voting classifier doesnt have an easy way to aggregate feature metadata pass
[docs]class SklearnVotingClassifier(SklearnClassifier):
[docs] def _create_external_model(self, **kwargs): return WrappedSklearnVotingClassifier(**kwargs)