From 8370a28075618c2cea7516bce8e48e0055d5555e Mon Sep 17 00:00:00 2001 From: v1docq Date: Mon, 18 Sep 2023 17:04:05 +0300 Subject: [PATCH] add example with basic clf pipeline. minor refactoring --- .../ts_classification_basic.py | 41 +++++++++ .../ts_regression_example.py | 2 +- .../architecture/preprocessing/InputData.py | 86 ------------------- .../architecture/settings/task_factory.py | 2 +- .../models/quantile/quantile_extractor.py | 1 + 5 files changed, 44 insertions(+), 88 deletions(-) create mode 100644 examples/time_series_classification/ts_classification_basic.py delete mode 100644 fedot_ind/core/architecture/preprocessing/InputData.py diff --git a/examples/time_series_classification/ts_classification_basic.py b/examples/time_series_classification/ts_classification_basic.py new file mode 100644 index 000000000..9000dc2d4 --- /dev/null +++ b/examples/time_series_classification/ts_classification_basic.py @@ -0,0 +1,41 @@ +import numpy as np +from fedot.core.pipelines.pipeline_builder import PipelineBuilder +from examples.fedot.fedot_ex import init_input_data +from fedot_ind.core.architecture.preprocessing.DatasetLoader import DataLoader +from fedot_ind.core.repository.initializer_industrial_models import IndustrialModels +from sklearn.metrics import f1_score, roc_auc_score + +model_dict = {'basic_quantile': PipelineBuilder().add_node('quantile_extractor', + params={'window_size': 10, + 'window_mode': True}).add_node('rf'), + 'basic_topological': PipelineBuilder().add_node('topological_extractor', + params={'window_size': 10}).add_node('rf'), + 'basic_recurrence': PipelineBuilder ().add_node('recurrence_extractor').add_node('rf'), + 'advanced_quantile': PipelineBuilder().add_node('fourier_basis').add_node('quantile_extractor', + params={'window_size': 10, + 'window_mode': True}).add_node( + 'rf'), + 'advanced_topological': PipelineBuilder().add_node('eigen_basis').add_node('topological_extractor', + params={ + 'window_size': 10}).add_node( + 'rf'), + 'advanced_reccurence': PipelineBuilder().add_node('wavelet_basis').add_node( + 'recurrence_extractor').add_node( + 'rf') + } +metric_dict = {} +train_data, test_data = DataLoader(dataset_name='Ham').load_data() + +with IndustrialModels(): + for model in model_dict.keys(): + pipeline = model_dict[model].build() + input_data = init_input_data(train_data[0], train_data[1]) + val_data = init_input_data(test_data[0], test_data[1]) + pipeline.fit(input_data) + features = pipeline.predict(val_data).predict + if len(np.unique(test_data[1])) > 2: + metric = f1_score(test_data[1], features, average='weighted') + else: + metric = roc_auc_score(test_data[1], features, average='weighted') + metric_dict.update({model: metric}) + print(metric_dict) \ No newline at end of file diff --git a/examples/time_series_regression/ts_regression_example.py b/examples/time_series_regression/ts_regression_example.py index 818664a97..77f33c5ac 100644 --- a/examples/time_series_regression/ts_regression_example.py +++ b/examples/time_series_regression/ts_regression_example.py @@ -2,7 +2,7 @@ from fedot_ind.core.architecture.preprocessing.DatasetLoader import DataLoader if __name__ == "__main__": - dataset_name = 'LiveFuelMoistureContent' + dataset_name = 'ApplianceEnergy' industrial = FedotIndustrial(task='ts_regression', dataset=dataset_name, strategy='quantile', diff --git a/fedot_ind/core/architecture/preprocessing/InputData.py b/fedot_ind/core/architecture/preprocessing/InputData.py deleted file mode 100644 index d14280bd7..000000000 --- a/fedot_ind/core/architecture/preprocessing/InputData.py +++ /dev/null @@ -1,86 +0,0 @@ -import numpy as np -from matplotlib import pyplot as plt - - -class DataProjection: - """ - A class to project data into a different basis. - - Attributes: - data (np.array): An array of data to be projected. - """ - - def __init__(self, data): - """ - The constructor for the DataProjection class. - - Parameters: - data (np.array): An array of data to be projected. - """ - self.data = data - - def project_data(self, basis): - """ - Projects the data into a different basis. - - Parameters: - basis (np.array): The basis to project the data into. - - Returns: - np.array: The projected data. - """ - return np.dot(self.data, basis) - - def visualize_data(self): - """ - Visualizes the data. - """ - plt.scatter(self.data[:, 0], self.data[:, 1]) - plt.show() - - def visualize_projection(self, basis): - """ - Visualizes the data projected into a different basis. - - Parameters: - basis (np.array): The basis to project the data into. - """ - projected_data = self.project_data(basis) - plt.scatter(projected_data[:, 0], projected_data[:, 1]) - plt.show() - - def __add__(self, other): - """ - Adds two DataProjection classes together. - - Parameters: - other (DataProjection): The other DataProjection class to add. - - Returns: - DataProjection: The combined DataProjection classes. - """ - return DataProjection(self.data + other.data) - - def __sub__(self, other): - """ - Subtracts two DataProjection classes. - - Parameters: - other (DataProjection): The other DataProjection class to subtract. - - Returns: - DataProjection: The subtracted DataProjection classes. - """ - return DataProjection(self.data - other.data) - - def __mul__(self, other): - """ - Multiplies two DataProjection classes. - - Parameters: - other (DataProjection): The other DataProjection class to multiply. - - Returns: - DataProjection: The multiplied DataProjection classes. - """ - return DataProjection(self.data * other.data) diff --git a/fedot_ind/core/architecture/settings/task_factory.py b/fedot_ind/core/architecture/settings/task_factory.py index b72a82f5f..e11b43c35 100644 --- a/fedot_ind/core/architecture/settings/task_factory.py +++ b/fedot_ind/core/architecture/settings/task_factory.py @@ -19,7 +19,7 @@ class TaskEnum(Enum): ts_classification = dict(fedot_preset=TimeSeriesClassifierPreset, nn=TimeSeriesClassifierNN, default=TimeSeriesClassifier) - + ts_forecasting = (TimeSeriesForecasingWithDecomposition,) ts_regression = (TimeSeriesRegression,) anomaly_detection = (TimeSeriesAnomalyDetectionPreset,) image_classification = (CVExperimenter,) diff --git a/fedot_ind/core/models/quantile/quantile_extractor.py b/fedot_ind/core/models/quantile/quantile_extractor.py index 3e075c787..c80c3a11f 100644 --- a/fedot_ind/core/models/quantile/quantile_extractor.py +++ b/fedot_ind/core/models/quantile/quantile_extractor.py @@ -99,6 +99,7 @@ def generate_features_from_ts(self, window_length: int = None) -> InputData: ts = np.nan_to_num(ts) + ts = ts.flatten() if len(ts.shape) == 1: aggregation_df = self.extract_stats_features(ts)