Дерево регрессии: лучший порог разбиения на Python
Постройте один узел дерева регрессии вручную. Для каждого порога вычислите средние в листьях и сумму квадратов ошибок, затем выберите лучшее разбиение.
Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».
Оптимальный порог разбиения в узле дерева регрессии
Что уже дано
Проверяющая система выполняет решение в среде Python 3.12 с библиотекой numpy. Никаких вспомогательных глобальных переменных или скрытых файлов в окружении перед запуском не создаётся. Проверяющие тесты напрямую импортируют и вызывают функцию find_best_split.
Что нужно сделать
Реализуйте функцию find_best_split(x, y, thresholds).
Функция принимает:
x: одномерный массив чисел (или числовую последовательность) длины — значения единственного числового признака;y: одномерный массив чисел (или числовую последовательность) длины — целевые вещественные значения;thresholds: последовательность вещественных чисел — список кандидатов на порог разбиения.
Разбиение для порога отправляет объекты со значением признака в левый лист, а объекты с — в правый лист. Гарантируется, что каждый рассматриваемый порог из thresholds даёт непустую левую и непустую правую часть.
Для каждого порога :
- Определите множества целевых ответов в левом () и правом () листьях.
- Вычислите средние значения ответов в каждом листе: и .
- Вычислите сумму квадратов отклонений (SSE) для каждого листа:
- Найдите суммарную ошибку разбиения: .
Среди всех кандидатов выберите порог с минимальным значением . Если у нескольких порогов ошибки разбиения совпадают, выберите наименьший из них по числовому значению.
Функция должна возвращать словарь 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
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
