Изучение дерева решений - PullRequest
0 голосов
/ 20 марта 2019

Я хочу реализовать алгоритм обучения дерева решений.

Я довольно новичок в кодировании, поэтому знаю, что это не лучший код, но я просто хочу, чтобы он работал. К сожалению я получаю ошибку: e2 = b(pk2/(pk2 + nk2)) ZeroDivisionError: division by zero

Может кто-нибудь объяснить мне, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Предположим, что после некоторых расколов у вас осталось две записи с 3 признаками / атрибутами (последний столбец - метка истинности)

1 1 1 2 2 2 2 1

Теперь вы собираетесь выбрать следующую лучшую функцию для разделения, поэтому вы вызываете этот метод remainder(examples, attribute) как часть выбора, который внутренне вызывает nk1, pk1 = pk_nk(1, examples, attribute).

Значение, возвращаемое pk_nk для вышеупомянутых строк и объектов, будет 0, 0, что приведет к исключению деления на ноль для e1 = b(pk1/(pk1 + nk1)). Это действительный сценарий, основанный на том, как вы кодировали DT, и вы должны обрабатывать дело.

0 голосов
/ 20 марта 2019

(pk2 + nk2) в некоторой точке равно нулю. Если мы вернемся назад по вашему коду, мы увидим, что они назначены здесь:

nk2, pk2 = pk_nk(2, examples, attribute)

def pk_nk(path, examples, attribute):
    nk = 0
    pk = 0
    for ex in examples:
        if ex[attribute] == path and ex[7] == NO:
            nk += 1
        elif ex[attribute] == path and ex[7] == YES:
            pk += 1
    return nk, pk

Таким образом, для делителя равным нулю nk и pk должны оставаться равными нулю через функцию, то есть либо:

  • examples пусто или
  • ни в том случае, если условие / elif выполнено
...