Модель (DecisionTreeClassifier) ​​дает неверные результатыPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Модель (DecisionTreeClassifier) ​​дает неверные результаты

Сообщение Anonymous »

Я прохожу курс машинного обучения с заданием по реализации подходящего метода для DecisionTreeClassifier.
Вот мой код:

Код: Выделить всё

import numpy as np
import pandas as pd

class MyTreeClf:
def __init__(self, max_depth=5, min_samples_split=2, max_leafs=20):
self.max_depth = max_depth
self.min_samples_split = min_samples_split
self.max_leafs = max_leafs
self.tree = None
self.leafs_cnt = 0

def node_entropy(self, probs):
return -np.sum([p * np.log2(p) for p in probs if p > 0])

def node_ig(self, x_col, y, split_value):
left_mask = x_col  split_value

if len(x_col[left_mask]) == 0 or len(x_col[right_mask]) == 0:
return 0

left_probs = np.bincount(y[left_mask]) / len(y[left_mask])
right_probs = np.bincount(y[right_mask]) / len(y[right_mask])

entropy_after = len(y[left_mask]) / len(y) * self.node_entropy(left_probs) + len(y[right_mask]) / len(y) * self.node_entropy(right_probs)
entropy_before = self.node_entropy(np.bincount(y) / len(y))

return entropy_before - entropy_after

def get_best_split(self, X: pd.DataFrame, y: pd.Series):
best_col, best_split_value, best_ig = None, None, -np.inf

for col in X.columns:
sorted_unique_values = np.sort(X[col].unique())

for i in range(1, len(sorted_unique_values)):
split_value = (sorted_unique_values[i - 1] + sorted_unique_values[i]) / 2

ig = self.node_ig(X[col], y, split_value)

if ig > best_ig:
best_ig = ig
best_col = col
best_split_value = split_value

return best_col, best_split_value, best_ig

def fit(self, X: pd.DataFrame, y: pd.Series, depth=0):
if depth == 0:
self.tree = {}

best_col, best_split_value, best_ig = self.get_best_split(X, y)

if depth < self.max_depth and len(y) >= self.min_samples_split and self.leafs_cnt < self.max_leafs and best_col is not None:
left_mask = X[best_col]  best_split_value

self.tree[depth] = {'col': best_col, 'split': best_split_value, 'left': {}, 'right': {}}

self.fit(X[left_mask], y[left_mask], depth + 1)
self.fit(X[right_mask], y[right_mask], depth + 1)
else:
class_label = y.mode()[0]
self.tree[depth] = {'class': class_label}
self.leafs_cnt += 1
В методе fit, который использует X и y для построения дерева, необходимо подсчитать количество листьев.
Дерево строится как следует:
Корневой узел: начните с корневого узла и перебирайте каждый атрибут.
Процесс выбора порога:
Для каждого атрибута выберите уникальные значения и отсортируйте их.
Сформируйте список пороговых значений для разделения значений.
Для каждого порогового значения разделите набор данных на два подмножества (левое и правое).
/>Оцените прирост информации для каждого разделения.
Выберите атрибут и порог с наибольшим приростом информации и сохраните их в иерархической структуре.
Рекурсивное разделение:
Разделите набор данных на два подмножества.
Если подмножество можно разделить дальше, повторите процесс рекурсивно.
Если нет, объявите подмножество листом и сохраните вероятность для первого класса.
Ограничения:
Остановить разделение при выполнении одного из следующих условий:
Максимальная глубина дерева
Минимальное количество экземпляров в узле
Максимальное количество листьев
Даже когда ограничения достигнуты, дополните дерево, создав необходимые листья.
Количество листьев сохраняется в переменной Leafs_cnt. Метод ничего не возвращает.
Заранее благодарим и приносим извинения за слишком длинный текст.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ng-results
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • WxWidgets: Простая математическая формула дает неверные результаты?
    Anonymous » » в форуме C++
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Добавление времени с помощью strtotime дает неверные результаты при выходе за полночь.
    Anonymous » » в форуме Php
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Алгоритм двоичного сложения дает неверные результаты
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • TfidfVectorizer, похоже, дает неверные результаты
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Почему сортировка строк по длине дает неверные результаты?
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»