Дерево решений состоит из узлов двух типов:
1.
Внутренний узел — содержит номер признака (
feature_index) для разделения.
Если значение признака = 0, идём в левое поддерево.
Если значение признака = 1, идём в правое поддерево.
2.
Лист — содержит предсказание (
prediction), которое возвращается как ответ.
Пример дерева:
[feature_index 0]
/ \
значение=0 значение=1
/ \
[feature_index 1] лист(1)
/ \
лист(0) лист(1)
Для примера [0, 1, 0]:
- Корень:
feature_index=0, значение признака 0 равно 0 → идём налево
- Узел:
feature_index=1, значение признака 1 равно 1 → идём направо
- Лист:
prediction=1 → ответ 1
Реализуй класс
TreeNode с тремя методами:
1.
__init__(self, feature_index=None, left=None, right=None, prediction=None)
Сохраняет все параметры как атрибуты объекта.
2.
is_leaf(self)
Возвращает
True, если узел является листом (у него есть prediction).
Возвращает
False, если узел внутренний.
3.
predict_one(self, sample)
Делает предсказание для одного примера.
- Если узел — лист, возвращает
prediction
- Иначе смотрит на
sample[feature_index]:
- если 0 → рекурсивно вызывает predict_one у левого поддерева
- если 1 → рекурсивно вызывает predict_one у правого поддерева
Примеры использования:
Пример 1
# Создание листа
leaf = TreeNode(prediction=1)
leaf.is_leaf() # True
leaf.predict_one([0, 1, 0]) # 1
Пример 2
# Создание дерева глубины 1
tree = TreeNode(
feature_index=0,
left=TreeNode(prediction=0),
right=TreeNode(prediction=1)
)
tree.is_leaf() # False
tree.predict_one([0, 1, 0]) # 0 (sample[0]=0 → налево)
tree.predict_one([1, 0, 0]) # 1 (sample[0]=1 → направо)