Source code for fedot.core.operations.evaluation.classification

import warnings
from typing import Optional

from fedot.core.data.data import InputData, OutputData
from fedot.core.operations.evaluation.evaluation_interfaces import EvaluationStrategy, SkLearnEvaluationStrategy
from fedot.core.operations.evaluation.operation_implementations.data_operations.decompose \
    import DecomposerClassImplementation
from fedot.core.operations.evaluation.operation_implementations.data_operations.sklearn_filters \
    import IsolationForestClassImplementation
from fedot.core.operations.evaluation.operation_implementations.data_operations.sklearn_imbalanced_class import \
    ResampleImplementation
from fedot.core.operations.evaluation.operation_implementations. \
    data_operations.sklearn_selectors import LinearClassFSImplementation, NonLinearClassFSImplementation
from fedot.core.operations.evaluation.operation_implementations.models. \
    discriminant_analysis import LDAImplementation, QDAImplementation
from fedot.core.operations.evaluation.operation_implementations.models. \
    keras import FedotCNNImplementation
from fedot.core.operations.evaluation.operation_implementations.models.knn import FedotKnnClassImplementation
from fedot.core.operations.evaluation.operation_implementations.models.svc import FedotSVCImplementation
from fedot.core.operations.operation_parameters import OperationParameters
from fedot.utilities.random import ImplementationRandomStateHandler

warnings.filterwarnings("ignore", category=UserWarning)


[docs]class SkLearnClassificationStrategy(SkLearnEvaluationStrategy): """ Strategy for applying classification algorithms from Sklearn library """
[docs] def predict(self, trained_operation, predict_data: InputData) -> OutputData: """ Predict method for classification task for predict stage :param trained_operation: model object :param predict_data: data used for prediction :return: prediction target """ prediction = self._sklearn_compatible_prediction(trained_operation=trained_operation, features=predict_data.features) converted = self._convert_to_output(prediction, predict_data) return converted
[docs]class FedotClassificationStrategy(EvaluationStrategy): _operations_by_types = { 'lda': LDAImplementation, 'qda': QDAImplementation, 'svc': FedotSVCImplementation, 'cnn': FedotCNNImplementation, 'knn': FedotKnnClassImplementation } def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): self.operation_impl = self._convert_to_operation(operation_type) super().__init__(operation_type, params)
[docs] def fit(self, train_data: InputData): """ This method is used for operation training with the data provided :param InputData train_data: data used for operation training :return: trained data operation """ warnings.filterwarnings("ignore", category=RuntimeWarning) operation_implementation = self.operation_impl(self.params_for_fit) with ImplementationRandomStateHandler(implementation=operation_implementation): operation_implementation.fit(train_data) return operation_implementation
[docs] def predict(self, trained_operation, predict_data: InputData) -> OutputData: """ Predict method for classification task for predict stage :param trained_operation: model object :param predict_data: data used for prediction :return: prediction target """ n_classes = len(trained_operation.classes_) if self.output_mode == 'labels': prediction = trained_operation.predict(predict_data) elif self.output_mode in ['probs', 'full_probs', 'default']: prediction = trained_operation.predict_proba(predict_data) if n_classes < 2: raise ValueError('Data set contain only 1 target class. Please reformat your data.') elif n_classes == 2 and self.output_mode != 'full_probs' and len(prediction.shape) > 1: prediction = prediction[:, 1] else: raise ValueError(f'Output model {self.output_mode} is not supported') # Convert prediction to output (if it is required) converted = self._convert_to_output(prediction, predict_data) return converted
[docs]class FedotClassificationPreprocessingStrategy(EvaluationStrategy): """ Strategy for applying custom algorithms from FEDOT to preprocess data for classification task """ _operations_by_types = { 'rfe_lin_class': LinearClassFSImplementation, 'rfe_non_lin_class': NonLinearClassFSImplementation, 'class_decompose': DecomposerClassImplementation, 'resample': ResampleImplementation, 'isolation_forest_class': IsolationForestClassImplementation } def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): super().__init__(operation_type, params) self.operation_impl = self._convert_to_operation(operation_type)
[docs] def fit(self, train_data: InputData): """ This method is used for operation training with the data provided :param InputData train_data: data used for operation training :return: trained data operation """ warnings.filterwarnings("ignore", category=RuntimeWarning) operation_implementation = self.operation_impl(self.params_for_fit) with ImplementationRandomStateHandler(implementation=operation_implementation): operation_implementation.fit(train_data) return operation_implementation
[docs] def predict(self, trained_operation, predict_data: InputData) -> OutputData: """ Transform data for predict stage :param trained_operation: model object :param predict_data: data used for prediction :return: prediction target """ prediction = trained_operation.transform(predict_data) converted = self._convert_to_output(prediction, predict_data) return converted
[docs] def predict_for_fit(self, trained_operation, predict_data: InputData) -> OutputData: """ Transform data for fit stage :param trained_operation: model object :param predict_data: data used for prediction :return: prediction target """ prediction = trained_operation.transform_for_fit(predict_data) converted = self._convert_to_output(prediction, predict_data) return converted