-
Notifications
You must be signed in to change notification settings - Fork 88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
1182-fix #1215
Conversation
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #1215 +/- ##
==========================================
- Coverage 79.27% 79.16% -0.12%
==========================================
Files 145 145
Lines 10048 9937 -111
==========================================
- Hits 7966 7867 -99
+ Misses 2082 2070 -12 ☔ View full report in Codecov by Sentry. |
Проверка проводилась только для синтетических данных и, как я понял, в этих данных были только численные признаки, так? |
Пайплайны строились из одной ноды, в которой находилась проверяемая операция? |
Данные только синтетические и только численные.
Да. Для временных рядов еще добавлялся |
Кмк, этого не достаточно. Например, с категориальными для RF потребуется преобразовать их в OHE и это увеличит время. А, например, для CatBoost этого не нужно делать, и по идеи он выполнится быстрее, но однако он в финальную выборку в классификацию даже не попал.
А есть ли смысл проверять тогда операции 'resample' и 'one_hot_encoding'? Кажется, они даже не срабатывают и сейчас показывают время пустого прохода через код. Первый возможно потому что класса сбалансированы, а для второго требуется категориальные признаки, чтобы он их начал преобразовывать. Также я бы разграничил все три задачи на три категории и сравнивал независимо. То есть, для задач TS не брал за эталон RF. |
Тест необходим для того, чтобы принципиально медленные алгоритмы не попали в
Согласен. Вообще, раз уж заходит про это речь, я бы убрал
В таком случае смысла нет. Пропустим их.
Зачем разграничивать задачи? А почему не стоит брать за эталон |
Тут скорее тесты будут релевантные к датасетам, которые полностью будут состоять из численных признаков. С категориальными возможна другая картина.
CatBoost не попал в таблицу "Операции, которые могут быть с пресетом
Хорошо.
Сравнение в общей таблицы сейчас общее же и кажется не учитывает разбиение по задачам, или я не прав? Можно также попробовать разграничить графики и использовать заместо
А все понял, неправильно прочитал, вы для них сравниваетесь с |
Так и задумывалось.
Ладно, пока оставим как есть.
Не учитывает, все модели тестируются в одной куче. |
Решенные задачи:
Измерение скорости различных операций после смены пресетов.
Операции, которые могут быть с пресетом
|
Название операции | Тэг fast_train |
Время обучения на 251 точке, мс | Время обучения на 10000 точек, мс |
---|---|---|---|
rf | 1 | 130 | 3569 |
rfr | 1 | 147 | 5583 |
arima | 0 | 164 | 3134 |
catboostreg | 0 | 1023 | 2803 |
gbr | 0 | 56 | 1089 |
lgbm | 0 | 18 | 197 |
lgbmreg | 0 | 14 | 158 |
mlp | 0 | 28 | 434 |
svr | 0 | 5 | 46 |
treg | 0 | 97 | 1454 |
xgboost | 0 | 32 | 139 |
xgbreg | 0 | 43 | 129 |
data_source_table | 0 | 3 | 27 |
data_source_ts | 0 | 0 | 0 |
fast_ica | 0 | 6 | 34 |
poly_features | 0 | 5 | 32 |
one_hot_encoding | 0 | 4 | 29 |
isolation_forest_reg | 0 | 149 | 381 |
isolation_forest_class | 0 | 156 | 404 |
rfe_lin_reg | 0 | 6 | 36 |
rfe_non_lin_reg | 0 | 5 | 122 |
rfe_lin_class | 0 | 7 | 40 |
rfe_non_lin_class | 0 | 6 | 146 |
exog_ts | 0 | 1 | 48 |
resample | 0 | 3 | 26 |
Код для тестирования скорости операций в IPython
На примере временных рядов и узла lagged
.
import numpy as np
import pandas as pd
from fedot.core.data.data import InputData
from fedot.core.pipelines.node import PipelineNode
from fedot.core.pipelines.pipeline import Pipeline
from fedot.core.repository.dataset_types import DataTypesEnum
from fedot.core.repository.tasks import Task, TaskTypesEnum, TsForecastingParams
def get_time(time):
return np.mean(time.all_runs) / time.loops
build_pipeline = lambda: Pipeline(PipelineNode('lagged'))
base_time = %timeit -o build_pipeline()
base_time = get_time(base_time)
results = dict()
for i in map(int, np.linspace(200, 20000, 5)):
results[i] = dict()
for j in map(int, np.linspace(10, 150, 5)):
data = InputData(idx=np.arange(i), features=np.arange(i), target=np.arange(i),
task=Task(TaskTypesEnum.ts_forecasting, TsForecastingParams(j)),
data_type=DataTypesEnum.ts)
res = %timeit -o build_pipeline().fit(data)
results[i][j] = get_time(res)
res = ((pd.DataFrame(results) - base_time) * 1000).round().astype(int)
print(res)
Код для профилирования в IPython
На примере временных рядов и узла ts_naive_average
.
import numpy as np
from fedot.core.data.data import InputData
from fedot.core.pipelines.node import PipelineNode
from fedot.core.pipelines.pipeline import Pipeline
from fedot.core.repository.dataset_types import DataTypesEnum
from fedot.core.repository.tasks import Task, TaskTypesEnum, TsForecastingParams
def main():
i = 20000
j = 10
data = InputData(idx=np.arange(i), features=np.arange(i), target=np.arange(i),
task=Task(TaskTypesEnum.ts_forecasting, TsForecastingParams(j)),
data_type=DataTypesEnum.ts)
Pipeline(PipelineNode('ts_naive_average')).fit(data)
import cProfile
cProfile.run('main()', filename=r'D:/profile.prof')
Код для построения графиков по результатам замеров
import matplotlib.pyplot as plt
def plot_operation_perfomance(operation_id: str,
data_lengths: Tuple[float],
perfomance_values: Tuple[float]) -> None:
"""
Temporary function for plotting perfomance values and their approximate function.
"""
coefficients = np.polyfit(data_lengths, perfomance_values, 2)
approx_data_lengths = np.linspace(data_lengths[0], data_lengths[-1], 1000)
approx_perfomance_values = np.poly1d(coefficients)(approx_data_lengths)
with plt.ion():
plt.scatter(data_lengths, perfomance_values, label='Perfomance values')
plt.plot(approx_data_lengths, approx_perfomance_values, label='Approximation')
plt.text(approx_data_lengths[-1], approx_perfomance_values[-1], operation_id, fontsize=4)
plt.pause(0.1)
# plt.savefig('test.pdf')
Test that checks the performance of all operations with synthetic data. Anything slower than Random Forest (
rf
andrfr
) is considered not fast enough for thefast_train
preset.Closes #1182