Академический Документы
Профессиональный Документы
Культура Документы
ФЕДЕРАЦИИ
УТВЕРЖДАЮ
Научный руководитель ИЦ СИИП
Университета ИТМО
_____________ А. В. Бухановский
___ ___________ 2022 г.
ЛИСТ УТВЕРЖДЕНИЯ
По
дп
RU.СНАБ.00843-01 33 01-ЛУ
.и
да
т
а
Представители
Организации-разработчика
Ин
в. Руководитель разработки
№
ду
бл
. ___________ А. В. Калюжная
Вз ____ ____________ 2022 г.
ам
.и
нв Нормоконтролер
.
№ ___________ А. В. Киреева
По ____ ____________ 2022 г.
дп
.и
да
т
а
Ин
в.
№
по
дл
. 2022
G
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ
ФЕДЕРАЦИИ
УТВЕРЖДЕН
RU.СНАБ.00843-01 33 01-ЛУ
RU.СНАБ.00843-01 33 01
По
дп ЛИСТОВ 47
.и
да
т
а
Ин
в.
№
ду
бл
.
Вз
ам
.и
нв
.
№
По
дп
.и
да
т
а
Ин
в.
№
по
дл 2022
.
G
2
RU.СНАБ.00843-01 33 01
АННОТАЦИЯ
Документ содержит руководство программиста для использования фреймворка
автоматического машинного обучения FEDOT.Industrial, предназначенного для решения
промышленных задач.
В число задач, решаемых фреймворком, входят классификация, поиск аномалий и
предсказательное моделирование на данных пространственно-временных полей.
FEDOT.Industrial разработан в рамках выполнения пункта 3.2 плана деятельности ИЦ
СИИП по Соглашению с АНО «Аналитический центр при Правительстве Российской
Федерации» № 70–2021–00141 (ИГК 000000D730321P5Q0002).
3
RU.СНАБ.00843-01 33 01
СОДЕРЖАНИЕ
1 НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ ПРОГРАММЫ..........................................4
2 ОПИСАНИЕ ПРИКЛАДНЫХ ЗАДАЧ...................................................................................5
2.1 Классы решаемых задач................................................................................................5
2.2 Примеры решения задач...............................................................................................5
2.2.1 Классификация временных рядов............................................................................5
2.2.2 Детектирование аномалий........................................................................................8
2.2.3 Автоматическое предсказательное моделирование на данных
пространственно-временных полей...................................................................................10
3 ХАРАКТЕРИСТИКА ПРОГРАММЫ..................................................................................15
3.1 Классификация временных рядов..............................................................................15
3.2 Поиск аномалий во временных рядах.......................................................................17
3.3 Автоматическое предсказательное моделирование на данных пространственно-
временных полей.....................................................................................................................21
4 ОБРАЩЕНИЕ К ПРОГРАММЕ............................................................................................25
4.1.1 Классификация временных рядов..........................................................................25
4.1.2 Детектирование аномалий......................................................................................26
4.1.3 Автоматическое предсказательное моделирование на данных
пространственно-временных полей...................................................................................27
4.2 Базовые функции.........................................................................................................28
4.2.1 Классификация временных рядов..........................................................................28
4.2.2 Детектирование аномалий..........................................................................................29
4.2.3 Автоматическое предсказательное моделирование на данных
пространственно-временных полей...................................................................................29
5 ПРОВЕРКА ПРОГРАММЫ..................................................................................................31
5.1 Классификация временных рядов..............................................................................31
5.2 Поиск аномалий во временных рядах.......................................................................35
5.3 Автоматическое предсказательное моделирование на данных пространственно-
временных полей.....................................................................................................................37
6 ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ................................................................................43
7 СООБЩЕНИЯ.........................................................................................................................44
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ..................................................................45
ЛИСТ РЕГИСТРАЦИИ ИЗМЕНЕНИЙ.....................................................................................46
4
RU.СНАБ.00843-01 33 01
1 НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ ПРОГРАММЫ
if __name__ == '__main__':
config = {'feature_generator': ['quantile'],
'datasets_list': ['Earthquakes'],
'use_cache': False,
'error_correction': False,
'launches': 3,
'timeout': 15}
ExperimentHelper = Industrial()
ExperimentHelper.run_experiment(config)
Итогом запуска кода для анализа результатов станет файл с расширение csv,
содержащий данные о выполненных расчётах в виде таблицы Таблица 3.
Таблица 3 – Пример результатов эксперимента
detector = ThresholdZonesDetector(0.5)
detector.load_data(file_object)
detector.run_operation()
file_object = detector.return_new_data()
9
RU.СНАБ.00843-01 33 01
На рисунке Рисунок 2 приведён результат работы данного детектора. Детектор
разбивает временной ряд на отдельные зоны путем обрезания значений ряда по границе,
значение которой определяется адаптивно, согласно заданному процентному значению.
file_object = FileObject()
file_object.time_series_data = data_dict
detector = AngleBasedDetector(300)
detector.load_data(file_object)
detector.run_operation()
file_object = detector.return_new_data()
Детектор преобразует несколько временных рядов в один при помощи окна,
которое двигается по временному ряду. Внутри каждого окна совокупность рядов
разбивается на массив векторов, длина которого равна длине окна. Каждый вектор
состоит из соответствующих значений каждого временного ряда в данной точке.
После этого находится максимальное векторное расстояние между последним
вектором в окне и остальными векторами. Результат работы детектора приведён на
рисунке Рисунок 3.
10
RU.СНАБ.00843-01 33 01
dataset_path = 'your_path'
energy_thresholds = [
0.1, 0.3, 0.5, 0.7, 0.9,
0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99,
0.992, 0.994, 0.996, 0.998, 0.999,
0.9999, 1
]
exp_params = {
'dataset_name': 'Land-Use_Scene_Classification',
'train_dataset': train_dataset,
'val_dataset': val_dataset,
'num_classes': 21,
'dataloader_params': {'batch_size': 32, 'num_workers': 4},
'model': 'ResNet18',
'model_params': {},
'models_saving_path': 'models',
'optimizer': torch.optim.Adam,
'optimizer_params': {},
'target_loss': torch.nn.CrossEntropyLoss,
'loss_params': {},
'metric': 'f1',
'summary_path': 'runs',
'summary_per_class': True,
'gpu': True
}
optimizations = {
'none': [{}],
'SVD': [
{
'decomposing_mode': 'spatial',
'orthogonal_loss_factor': 10,
'hoer_loss_factor': 0.001,
'energy_thresholds': energy_thresholds,
'finetuning_epochs': 1
},
{
'decomposing_mode': 'channel',
'orthogonal_loss_factor': 10,
'hoer_loss_factor': 0.001,
'energy_thresholds': energy_thresholds,
'finetuning_epochs': 1
},
{
'decomposing_mode': 'spatial',
'orthogonal_loss_factor': 100,
'hoer_loss_factor': 0.001,
'energy_thresholds': energy_thresholds,
'finetuning_epochs': 1
},
{
'decomposing_mode': 'channel',
'orthogonal_loss_factor': 100,
'hoer_loss_factor': 0.001,
13
RU.СНАБ.00843-01 33 01
'energy_thresholds': energy_thresholds,
'finetuning_epochs': 1
},
],
'SFP': [
{
'pruning_ratio': 0.5,
'finetuning_epochs': 1
},
{
'pruning_ratio': 0.7,
'finetuning_epochs': 1
},
{
'pruning_ratio': 0.8,
'finetuning_epochs': 1
},
{
'pruning_ratio': 0.9,
'finetuning_epochs': 1
},
]
}
experimenter = ClassificationExperimenter(
structure_optimization='SFP',
structure_optimization_params={
'pruning_ratio': 0.5,
'finetuning_epochs': 10
},
weights='models/Land-Use_Scene_Classification/ResNet18/trained_model.sd.pt',
prefix='without_training_',
**exp_params
)
experimenter.structure_optimization.optimize_during_training()
experimenter.structure_optimization.final_optimize()
experimenter = ClassificationExperimenter(
structure_optimization='SVD',
structure_optimization_params={
'decomposing_mode': 'channel',
'orthogonal_loss_factor': 10,
'hoer_loss_factor': 0,
'energy_thresholds': energy_thresholds,
'finetuning_epochs': 3
},
weights='models/Land-Use_Scene_Classification/ResNet18/trained_model.sd.pt',
prefix='without_training_',
**exp_params
)
experimenter.structure_optimization.final_optimize()
Собранные в одну таблицу результаты моделирования представлены в
таблице Таблица 4.
Таблица 4 – Результаты эксперимента
# Ансамблирование аггрегированием
ensemble_algorithm: ‘AGG_voting’
'window_spectral':
{
'window_sizes': {
'ItalyPowerDemand': [3, 6, 9],
'Earthquakes': [48],
' Lightning7': [100]
},
},
}
Имя датасета
Параметр
Earthquakes ItalyPowerDemand Lightning7
Бинарная Бинарная Многоклассовая
Тип задачи
классификация классификация класификация
Метрика roc-auc roc-auc f1
Значение метрики
при длине окна 0,543 0,916 0,580
10% от длины ряда
Значение метрики
при длине окна 0,544 0,976 0,521
20% от длины ряда
Значение метрики
при длине окна 0,455 0,535 0,580
30% от длины ряда
А Б
в
Рисунок 7 – Влияние времени композирования модели на сложность конечного
пайплайна: (а) 15 минут, (б) 5 минут, (в) 1 минута
3.1.2. Поиск аномалий во временных рядах
visualizer_of_ts = DataVisualizatorNew(list_1)
list_2 = ["all_ts",
"additional_transformed_average_absolute_deviation",
"predictions"]
visualizer_of_results = DataVisualizatorNew(list_2)
Результат
SOTA SOTA Базовая Генератор
Датасет FEDOT
результат алгоритм модель признаков
Industrial
Chinatown 0,993 ROCKET 0,896 0,995 Spectral
Earthquakes 0,693 ProximityForest 0,509 0,740 Quantile
HIVE-COTE Window
Ham 0,686 0,600 0,724
v1.0 Quantile
Результат
SOTA SOTA Базовая Генератор
Датасет FEDOT
результат алгоритм модель признаков
Industrial
HIVE-COTE Window
ACSF1 0,846 0,733 0,849
v1.0 Quantile
Window
DistalPhalanxTW 0,530 ResNet 0,590 0,660
Quantile
(а) (б)
(в)
Рисунок 11 – Визуализация результатов эксперимента:
(а) точность обучения, (б) точность валидации, (а) F1 метрика
а б
Рисунок 12 – Метрики моделей SFP и SVD: синее – базовая модель, синее – результат
обрезки, оранжевое – результат тонкой настройки
4. ОБРАЩЕНИЕ К ПРОГРАММЕ
4.1. Точки входа в программу
25
RU.СНАБ.00843-01 33 01
4.1.1. Классификация временных рядов
Продолжение таблицы 7
save_results() dataset_name – наименование
набора данных;
Метод для сохранения modelling_results – словарь с
26
RU.СНАБ.00843-01 33 01
результатов моделирования результатами экспериментов.
ts_data – набор временных рядов.
ExperimentRunner В зависимости от типа генератора
дополнительными аргументами
get_features()
Абстракный класс могут быть:
Метод, отвечающий за
описывающий
извлечение признаков из массива
интерфейс каждого dataset_name – имя набора
данных временного ряда
из генераторов данных;
признаков: window_length – длина окна;
target – целевая переменная.
RecurrenceRunner extract_features()
SignalRunner features – набор временных
SSARunner Метод-обертка для метода рядов;
StatsRunner извлечения признаков dataset_name – имя набора
TopologicalRunner get_features() с кэшированием данных.
результатов в pickle-файл
Продолжение таблицы 9
model_params – словарь с параметрами
модели;
optimizer тип оптимизатора модели;
optimizer_params – параметры
28
RU.СНАБ.00843-01 33 01
оптимизатора;
target_loss – функция потерь;
loss_params – параметры функции потерь;
structure_optimization – структурный
оптимизатор;
structure_optimization_params – параметры
структурного оптимизатора;
prefix – префикс к имени эксперимента;
4.2. Базовые функции
4.2.1. Классификация временных рядов
if __name__ == '__main__':
config = dict(feature_generator=['topological', 'wavelet'],
datasets_list=['UMD', 'Lightning7'],
use_cache=True,
error_correction=False,
launches=3,
timeout=10)
ExperimentHelper = Industrial()
ExperimentHelper.run_experiment(config_name)
if __name__ == '__main__':
parser = ResultsParser()
results_table = parser.run()
results_table.to_csv(‘experiment_results.csv’, index=False)
29
RU.СНАБ.00843-01 33 01
4.2.2. Детектирование аномалий
detector = ThresholdZonesDetector(0.5)
detector.load_data(file_object)
detector.run_operation()
file_object = detector.return_new_data()
experimenter = ClassificationExperimenter(
structure_optimization='SFP',
structure_optimization_params={
'pruning_ratio': 0.5,
'finetuning_epochs': 10
},
weights='models/Land-Use_Scene_Classification/ResNet18/trained_model.sd.pt',
prefix='without_training_',
**exp_params
)
experimenter.fit(100)
experementer.predict(path_to_folder)
31
RU.СНАБ.00843-01 33 01
5. ПРОВЕРКА ПРОГРАММЫ
@pytest.fixture()
def basic_config_API():
config_path = 'tests/data/config/Config_Classification.yaml'
return config_path
@pytest.fixture()
def basic_API_class():
ExperimentHelper = Industrial()
return ExperimentHelper
def load_data(dataset_name):
train_data, test_data, n_classes =
32
RU.СНАБ.00843-01 33 01
Industrial().reader.read(dataset_name=dataset_name)
return train_data, test_data, n_classes
def test_API_code_scenario(basic_API_class):
train_data, test_data, n_classes = load_data('Lightning7')
IndustrialModel, train_feats =
basic_API_class.fit(model_name='quantile',
task_type='ts_classification',
model_params={'problem': 'classification',
'seed': 42,
'timeout': 1,
'max_depth': 3,
'max_arity': 1,
'cv_folds': 2,
'logging_level': 20,
'n_jobs': 2},
feature_generator_params={'window_mode': False},
train_features=train_data[0],
train_target=train_data[1])
metrics = basic_API_class.get_metrics(target=test_data[1],
prediction_label=labels,
prediction_proba=probs)
assert IndustrialModel is not None
assert basic_API_class.fitted_model is not None
assert basic_API_class.train_features is not None
assert type(train_feats) is np.ndarray
assert type(test_feats) is np.ndarray
assert type(probs) is np.ndarray
assert type(labels) is np.ndarray
assert type(metrics) is dict
33
RU.СНАБ.00843-01 33 01
def test_API_config_scenario(basic_API_class, basic_config_API):
basic_API_class.run_experiment(basic_config_API)
_ = 1
assert basic_API_class is not None
@pytest.fixture()
def basic_metric_data_clf():
target_label = np.array([1, 2, 3, 4])
test_label = np.array([1, 1, 2, 4])
test_proba = np.array([[0.8, 0.1, 0.05, 0.05],
[0.8, 0.1, 0.05, 0.05],
[0.1, 0.8, 0.05, 0.05],
[0.05, 0.1, 0.05, 0.8]])
@pytest.fixture()
def basic_metric_data_reg():
test_label = np.array([1.1, 2.2, 3.3, 4.4])
target_label = np.array([10, 0.1, 2.3, 4.1])
def test_pareto_metric():
basic_multiopt_metric = np.array([[1.0, 0.7],
[0.9, 0.8],
[0.1, 0.3]])
pareto_front =
ParetoMetrics().pareto_metric_list(costs=basic_multiopt_metric)
assert pareto_front is not None
def test_basic_clf_metric(basic_metric_data_clf):
clf_metric_dict = {'roc_auc': ROCAUC,
'f1': F1,
'precision': Precision,
'accuracy': Accuracy,
'logloss': Logloss}
34
RU.СНАБ.00843-01 33 01
result_metric = []
for metric_name in clf_metric_dict.keys():
chosen_metric = clf_metric_dict[metric_name]
score = chosen_metric(target=basic_metric_data_clf[2],
predicted_labels=basic_metric_data_clf[1],
predicted_probs=basic_metric_data_clf[0]).metric()
score = round(score, 3)
assert score is not None
result_metric.append(score)
assert len(result_metric) > 1
def test_basic_regression_metric(basic_metric_data_reg):
reg_metric_dict = dict(rmse=RMSE,
r2=R2, mae=MAE, mse=MSE, mape=MAPE)
result_metric = []
for metric_name in reg_metric_dict.keys():
chosen_metric = reg_metric_dict[metric_name]
score = chosen_metric(target=basic_metric_data_reg[1],
predicted_labels=basic_metric_data_reg[0]).metric()
score = round(score, 3)
assert score is not None
result_metric.append(score)
assert len(result_metric) > 1
def test_SVD_loss():
reg_metric_dict = dict(rmse=RMSE,
r2=R2, mae=MAE, mse=MSE, mape=MAPE)
result_metric = []
for metric_name in reg_metric_dict.keys():
chosen_metric = reg_metric_dict[metric_name]
score = chosen_metric(target=basic_metric_data_reg[1],
predicted_labels=basic_metric_data_reg[0]).metric()
score = round(score, 3)
assert score is not None
result_metric.append(score)
assert len(result_metric) > 1
@pytest.fixture()
def feature_generators_list():
return [StatsRunner, SSARunner, SignalRunner, RecurrenceRunner,
TopologicalRunner]
@pytest.fixture()
def window_feature_generators_list():
return [StatsRunner, SSARunner]
def test_get_features(feature_generators_list):
for feature_generator in feature_generators_list:
model = feature_generator()
TestModule = ModelTestingModule(model=model)
train_feats_earthquakes, test_feats_earthquakes =
TestModule.extract_from_binary(dataset_name='Earthquakes')
train_feats_lightning7, test_feats_lightning7 =
TestModule.extract_from_multi_class(dataset_name='Lightning7')
assert train_feats_lightning7 is not None
assert test_feats_lightning7 is not None
def test_get_features_window_mode(window_feature_generators_list):
for feature_generator in window_feature_generators_list:
model = feature_generator(window_mode=True)
TestModule = ModelTestingModule(model=model)
train_feats_earthquakes, test_feats_earthquakes =
TestModule.extract_from_binary(dataset_name='Earthquakes')
train_feats_lightning7, test_feats_lightning7 =
TestModule.extract_from_multi_class(dataset_name='Lightning7')
assert train_feats_lightning7 is not None
assert test_feats_lightning7 is not None
x0 = 6 * np.ones(1000) + np.random.rand(1000) * 1
x1 = 3 * np.ones(1000) + np.random.rand(1000) * 2
x2 = 7 * np.ones(1000) + np.random.rand(1000) * 1.5
y = np.vstack([x0, x1, x2])
y += np.random.rand(x.size)
return x, y
detector = ThresholdZonesDetector(0.5)
detector.load_data(file_object)
detector.run_operation()
new_object = detector.return_new_data()
def test_WindowSizeSelection(basic_periodic_data):
finder = WindowSizeSelection(
time_series=basic_periodic_data)
result = finder.runner_wss()
assert type(result[0]) is int and type(result[1]) is list
assert result[0] != 0
def test_classification_experimenter(get_test_classification_dataset):
exp_params, tmp_path = get_test_classification_dataset
experimenter = ClassificationExperimenter(
**exp_params,
structure_optimization='none',
structure_optimization_params={}
)
experimenter.fit(1)
assert os.path.exists(tmp_path.joinpath(
'models/Agricultural/ResNet18/trained.sd.pt'))
classification_predict(experimenter)
39
RU.СНАБ.00843-01 33 01
Тестирование основных методов базового класса и оптимизатора структуры
(листинг Листинг 35) – кейс 1.
Входные данные: тестовый датасет с тремя классами, запуск с SFP оптимизацией.
Проверка: корректность работы основных методов классификационного
экспериментатора и оптимизатора структуры.
Ожидаемый результат: сохранена обученная модель, сохранена обрезанная модель,
сохранена дообученная модель, предсказания производятся для каждого изображения из
тестовой паки, предсказания модели с помощью метода predict соответствуют одному из
трёх классов, предсказания модели с помощью метода predict_proba содержат вектора из
трёх элементов.
Листинг 35 – Тестирование основных методов и оптимизатора структуры (кейс 1)
def test_sfp_classification_experimenter(get_test_classification_dataset):
exp_params, tmp_path = get_test_classification_dataset
experimenter = ClassificationExperimenter(
**exp_params,
structure_optimization='SFP',
structure_optimization_params=SFP_PARAMS
)
experimenter.fit(1)
root = tmp_path.joinpath('models/Agricultural/ResNet18_SFP_P-0.50/')
assert os.path.exists(root.joinpath('trained.sd.pt'))
assert os.path.exists(root.joinpath('fine-tuning.sd.pt'))
assert os.path.exists(root.joinpath('pruned.model.pt'))
assert os.path.exists(root.joinpath('fine-tuned.model.pt'))
classification_predict(experimenter)
def test_fasterrcnn_experimenter(get_test_detection_dataset):
exp_params, tmp_path = get_test_detection_dataset
experimenter = FasterRCNNExperimenter(
**exp_params,
structure_optimization='none',
structure_optimization_params={}
)
experimenter.fit(1)
assert
os.path.exists(tmp_path.joinpath('runs/ALET10/FasterR-CNN/ResNet50'))
detection_predict(experimenter)
Способ
Наименование Структура
Обозначение вывода Ограничения
данных данных
данных
Предсказательная Объект класса JSON-
𝑓:𝑥→[1,…,𝐾]f:x→[1,…,K] Нет
модель Pipeline файл
Результаты CSV-
𝑃P Массив Нет
моделирования файл
45
RU.СНАБ.00843-01 33 01
7. СООБЩЕНИЯ
Сообщение Расшифровка
Start experiment Начало эксперимента
Start launch Х Начало запуска №Х
Start training Начало обучения модели
Start prediction Получение предсказаний
Saving results Сохранение результатов
Ensemble features extraction Начало извлечения признаков при использовании
started метода ансамблирования генераторов
Number of TS to be processed: X Количество временных рядов для обработки: Х
Time spent on feature extraction – Количество времени, затраченного на извлечение
X sec признаков – Х сек
Х features extraction started Начало извлечения признаков типа Х
Generate features for windows
Начало извлечения признаков при длине окна Х
length – Х
Window length X was chosen Решение алгоритма о выборе окна длиной Х
Сигнал о завершении процесса извлечения признаков и
Feature generation finished. TS
указатель на количество обработанных временных
processed: X
рядов
Validate model for wavelet – X Выполнение валидации модели для вейвлета типа Х
Generate features for wavelet – X Извлечение признаков для вейвлета типа Х
X wavelet was chosen Вейвлет типа Х был выбран
Started boosting Начало работы модели коррекции ошибок
Boosting process is finished Окончание работы модели коррекции ошибок
End of experiment Завершение эксперимента
Сообщение, сопровождающееся выводом полученных
Metrics at datasets
метрик
Type of ML task Сообщение о типе решаемой задачи
Fitting model Сообщение о старке обучения модели
Experiment setup Сообщение с краткой информацией о постановке задачи
Baseline model fitted Сигнал о том, что базовая модель обучена
Cannot save pipeline X Сообщение о проблеме при сохранении пайплайна
Сообщение о том, что загруженный из удалённого
Loaded data is of unknown format
источника формат данных не поддерживается
Ошибка при распаковке загруженных из удалённого
Error while unpacking data
источников данных
46
RU.СНАБ.00843-01 33 01
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Dau H. A. [и др.]. The UCR time series archive / H. A. Dau, A. Bagnall, K. Kamgar, C. C. M.
Yeh, Y. Zhu, S. Gharghabi, C. A. Ratanamahatana, E. Keogh, 2019. 1293–1305 c.
47
RU.СНАБ.00843-01 33 01