Я читаю 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.