Дерево регрессии: лучший порог разбиения на Python

Постройте один узел дерева регрессии вручную. Для каждого порога вычислите средние в листьях и сумму квадратов ошибок, затем выберите лучшее разбиение.

Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».

Оптимальный порог разбиения в узле дерева регрессии

Что уже дано

Проверяющая система выполняет решение в среде Python 3.12 с библиотекой numpy. Никаких вспомогательных глобальных переменных или скрытых файлов в окружении перед запуском не создаётся. Проверяющие тесты напрямую импортируют и вызывают функцию find_best_split.

Что нужно сделать

Реализуйте функцию find_best_split(x, y, thresholds).

Функция принимает:

  • x: одномерный массив чисел (или числовую последовательность) длины — значения единственного числового признака;
  • y: одномерный массив чисел (или числовую последовательность) длины — целевые вещественные значения;
  • thresholds: последовательность вещественных чисел — список кандидатов на порог разбиения.

Разбиение для порога отправляет объекты со значением признака в левый лист, а объекты с — в правый лист. Гарантируется, что каждый рассматриваемый порог из thresholds даёт непустую левую и непустую правую часть.

Для каждого порога :

  1. Определите множества целевых ответов в левом () и правом () листьях.
  2. Вычислите средние значения ответов в каждом листе: и .
  3. Вычислите сумму квадратов отклонений (SSE) для каждого листа:
  4. Найдите суммарную ошибку разбиения: .

Среди всех кандидатов выберите порог с минимальным значением . Если у нескольких порогов ошибки разбиения совпадают, выберите наименьший из них по числовому значению.

Функция должна возвращать словарь dict[str, float] со следующими ключами:

  • "threshold": выбранный порог (float);
  • "left_mean": среднее значение целевой переменной в левом листе (float);
  • "right_mean": среднее значение целевой переменной в правом листе (float);
  • "sse": суммарная квадратичная ошибка обоих листьев (float).

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно. Проверяющая система вызывает функцию find_best_split(x, y, thresholds) напрямую.

Пример использования

result = find_best_split(
    x=[1.0, 2.0, 3.0, 4.0],
    y=[0.0, 0.0, 4.0, 4.0],
    thresholds=[1.5, 2.5],
)
print(result["threshold"], result["left_mean"], result["right_mean"], round(result["sse"], 4))

Результат:

2.5 0.0 4.0 0.0
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи