Критерий Gini: расчёт разбиения дерева на Python
Посчитайте неоднородность родительского узла и двух дочерних, затем оцените выигрыш от разбиения. Взвесьте дочерние узлы по числу объектов — простое среднее здесь может дать другой ответ.
Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».
Расчёт неоднородности Gini и взвешенного сплита
Что уже дано
Проверяющая система выполняет решение в среде Python 3.12 с библиотекой numpy. Никаких вспомогательных глобальных переменных, файлов или классов перед запуском решения не создаётся. Проверяющие тесты напрямую импортируют и вызывают функцию compute_split_gini.
Что нужно сделать
Реализуйте функцию compute_split_gini(labels, split_mask).
Функция принимает:
labels: одномерный массив или последовательность бинарных меток классов (значения строго0или1) длины ;split_mask: одномерный булев массив или последовательностьboolтой же длины , гдеTrueозначает отнесение объекта к левому узлу, аFalse— к правому узлу.
Требования к поведению и валидации входов:
- Преобразуйте входы к одномерным массивам
np.ndarray. - Если длины массивов не совпадают, выбросьте
ValueError("Длины labels и split_mask должны совпадать"). - Если
labelsсодержит значения, отличные от0и1, выбросьтеValueError("Метки должны принимать значения 0 или 1"). - Если хотя бы один из узлов оказывается пустым (то есть все значения
split_maskравныTrueили все равныFalse), выбросьтеValueError("Оба узла должны быть непустыми"). - Рассчитайте:
- — критерий неоднородности Gini родительского узла: ;
- и — критерии Gini для каждого дочернего узла по долям классов внутри соответствующего узла;
- — взвешенный Gini разбиения: ;
- — выигрыш от разбиения (уменьшение неоднородности): .
Функция должна возвращать словарь dict[str, float] со строго следующими ключами:
"parent_gini": значение типаfloat;"weighted_child_gini": значение типаfloat;"gini_gain": значение типаfloat.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. Проверяющая система вызывает функцию compute_split_gini(labels, split_mask) с аргументами различных типов (списки, массивы numpy) и сверяет структуру и числовые значения возвращённого словаря, а также реакцию на некорректные входные данные.
Пример использования
import numpy as np
labels = [0, 0, 1, 1]
mask = [True, True, False, False]
res = compute_split_gini(labels, mask)
print(res["parent_gini"], res["weighted_child_gini"], res["gini_gain"])
Результат:
0.5 0.0 0.5
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
