Skip to main content

Interpolation Tables Examples

Interpolation Tables Examples

Файлы: examples/interpolation_tables/interpolation_table.py, models_evaluation.py, models_evaluation_ray.py.

⚠️
Все

✅ Проверено на локальном Docker-стеке: все три скрипта неотрабатывают запускаютсядо "изконца. коробки"Недостающие данные и ошибка выбора метрики (см. ниже) исправлены.

Исправлено: недостающий файл данных

Каждый скрипт читает examples/interpolation_tables/data/table_example.csv:

csv_path = os.path.join(os.path.join(os.path.dirname(__file__), "data"), "table_example.csv")
df = pd.read_csv(csv_path, sep=";")

Папки examples/interpolation_tables/data/ в репозитории нетне вообще.было. ОжидаемаяДобавлен структура файла (из кода)examples/interpolation_tables/data/table_example.csv — точкарегулярная данныхсетка с5×4 колонками(20 строк): x ∈ {1000, 3000, 5000, 7000, 9000}, y ∈ {200, 600, 1000, 1400} (охватывает точку запроса (4723, 937) из interpolation_table.py и даёт минимум 4 точки на ось, нужные RegularGridInterpolator с method="cubic"), z для— интерполяциигладкая (функция от interpolation_table.pyx)/y, иплюс дополнительноколонка target (для примеров сравнения моделей (models_evaluation*.py, где X = df[["x","y","z"]], y = df["target"]). Чтобы прогнать примеры, нужно создать этот CSV самостоятельно, с разделителемнебольшим ;.шумом.

interpolation_table.py

interp = TableInterpolator(df, x_col="x", y_col="y", z_col="z")
value = interp.get(4723, 937)
Xg, Yg, Zg = interp.get_grid(step_x=50, step_y=50)
interp.plot_surface(step_x=50, step_y=50)

Прямое повторение примера из README/документации модуля — единственный кусок кода в проекте, который дословно совпадает с make_docs/source/introduction/what_is_mlumina.rst.

models_evaluation.py — сравнение моделей без Ray

Последовательно демонстрирует все функции модуля interpolation_tables.models_evaluation, на train/test-разбиении первых 15 / оставшихся строк CSV:

  1. evaluate_model(LinearRegression(), X_train, y_train, X_test, y_test) — обучение + метрики одной модели.
  2. grid_search_model(DecisionTreeRegressor, {"max_depth": (2,5,1), "max_features": (1,3,1)}, ..., optimize_metric="mse") — перебор сетки для одного класса модели.
  3. compare_multiple_models([...], ..., optimize_metric="mse") — сравнение 4 моделей (SVR, DecisionTreeRegressor, LinearRegression, XGBRegressor), каждая со своей сеткой гиперпараметров; замеряется время выполнения.
  4. hyperopt_search_model(DecisionTreeRegressor, {"max_depth": (2,10,1), "min_samples_split": (2,20,1)}, ..., max_evals=40, optimize_metric="mse") — TPE-поиск вместо полного перебора.

models_evaluation_ray.py — распределённая версия

То же самое, но compare_multiple_models_ray([...], ..., optimize_metric="r2"mse") — каждая из 4 моделей оптимизируется в отдельной Ray-задаче.

⚠️

Исправлено: Невернаяневерная метрика оптимизации в этом примере

ПримерРаньше используетпример использовал optimize_metric="r2". Но grid_search_model/compare_multiple_models_ray внутри всегда выбирают результат с наименьшим значением метрики (if score < best_score) — это корректно для mse/rmse/mae (меньше — лучше), но не корректно для r2 (для R² лучше — больше, в идеале ближе к 1; здесьс будет"r2" выбранавыбиралась бы модель с наименьшим/наиболее отрицательным R², т.е. фактически худшая по этой метрике). Заменено на optimize_metric="mse" — с ним обе версии (без Ray и с Ray) стабильно выбирают одну и ту же (действительно лучшую) модель LinearRegression.

Ни grid_search_model, niни compare_multiple_models/compare_multiple_models_ray по-прежнему не поддерживают направление оптимизации (mode="min"/"max") — используйте только mse/rmse/mae-подобные метрики дают ожидаемый результат. Использоватьв optimize_metric="r2"optimize_metric в реальных задачах, не стоит, пока это не исправлено в коде модуля.r2.

Как запустить

После создания data/table_example.csv:

cdpython examples/interpolation_tables
python interpolation_tables/interpolation_table.py
python examples/interpolation_tables/models_evaluation.py
python examples/interpolation_tables/models_evaluation_ray.py   # требует ray.init() внутри скрипта — работает и локально (без кластера)