Понимание энтропии Шеннона набора данных

Я читаю Machine Learning In Action и просматриваю главу о дереве решений. Я понимаю, что деревья решений построены таким образом, что разделение набора данных дает вам возможность структурировать свои ветви и листья. Это дает вам более вероятную информацию в верхней части дерева и ограничивает количество решений, которые вам нужно принять.

В книге показана функция, определяющая энтропию Шеннона набора данных:

def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet: #the the number of unique elements and their occurance
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * log(prob,2) #log base 2
    return shannonEnt

Где набор входных данных представляет собой массив массивов, где каждый массив представляет собой потенциальную классифицируемую функцию:

dataSet = [[1, 1, 'yes'],
    [1, 1, 'yes'],
    [1, 0, 'no'],
    [0, 1, 'no'],
    [0, 1, 'no']]

Я не понимаю, почему функция энтропии Шеннона в этой книге всегда смотрит только на последний элемент в массиве функций? Похоже, он рассчитывает только энтропию для элементов «да» или «нет», а не энтропию каких-либо других функций?

введите описание изображения здесь

Для меня это не имеет смысла, потому что энтропия для этого набора данных

dataSet = [[1, 1, 'yes'],
    [1, 'asdfasdf', 'yes'],
    [1900, 0, 'no'],
    [0, 1, 'no'],
    ['ddd', 1, 'no']]

То же, что и приведенная выше энтропия, хотя и содержит гораздо более разнообразные данные.

Не следует ли подсчитывать и другие элементы функции, чтобы получить общую энтропию набора данных, или я неправильно понимаю, что должен делать расчет энтропии?

Если кому-то интересно, полный исходный код книги (отсюда и этот код) можно найти здесь в папке Chapter03.


person devshorts    schedule 19.05.2013    source источник


Ответы (1)


Потенциальная двусмысленность здесь заключается в том, что набор данных, который вы просматриваете, содержит как функции, так и переменную результата, причем переменная результата находится в последнем столбце. Проблема, которую вы пытаетесь решить: «Помогают ли функции 1 и 2 мне предсказать результат»?

Другой способ заявить об этом: если я разделю свои данные в соответствии с функцией 1, получу ли я более точную информацию о Результате?

В этом случае без разделения переменная результата будет [да, да, нет, нет, нет]. Если я разделю на Feature 1, я получу 2 группы: Feature 1 = 0 -> Результат [нет, нет] Feature 1 = 1 -> Ouctome - [да, да, нет]

Идея здесь в том, чтобы увидеть, лучше ли вам с этим сплитом. Изначально у вас была определенная информация, описанная энтропией Шеннона [да, да, нет, нет, нет]. После разделения у вас есть две группы с «лучшей информацией» для группы, где Feature 1 = 0: в этом случае вы знаете, что Результат - нет, и что измеряется энтропией [нет, нет].

Другими словами, подход состоит в том, чтобы выяснить, есть ли из имеющихся у вас функций одна, которая, если она используется, увеличивает вашу информацию о том, что вас волнует, то есть переменная результата. Построение дерева будет жадно выбирать объект с наибольшим объемом информации на каждом шаге, а затем смотреть, стоит ли разделять полученные группы еще дальше.

person Mathias    schedule 19.05.2013