Критерий 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 — к правому узлу.

Требования к поведению и валидации входов:

  1. Преобразуйте входы к одномерным массивам np.ndarray.
  2. Если длины массивов не совпадают, выбросьте ValueError("Длины labels и split_mask должны совпадать").
  3. Если labels содержит значения, отличные от 0 и 1, выбросьте ValueError("Метки должны принимать значения 0 или 1").
  4. Если хотя бы один из узлов оказывается пустым (то есть все значения split_mask равны True или все равны False), выбросьте ValueError("Оба узла должны быть непустыми").
  5. Рассчитайте:
  • — критерий неоднородности 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
РешениеPython

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

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

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