При классификации данных, как определить, какой результат лучше между результатом классификации алгоритма A и результатом классификации алгоритма B?
Можно использовать «энтропию Шеннона». Его формула выглядит следующим образом:
Чем больше рассчитанное значение H, тем менее точна классификация. Реализация на Python выглядит следующим образом:
from math import log
# 结果数值越大,说明数据集约杂乱(有其他分类混进来)
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
# 创建一个字典,记录各个类型的出现的次数,dataset的最后一列是类型
for featVec in dataSet:
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)
return shannonEnt
Где featVec[-1] должен взять последнее значение. Предположим, мы используем какой-то алгоритм для классификации следующих пяти частей данных в одну категорию, очевидно, что «да» и «нет» смешаны вместе, но мы также должны «оценить» эту классификацию, а именно энтропию Шеннона. Обратите внимание, что последний столбец набора данных представляет тип данных.
Формула расчета энтропии Шеннона не имеет ничего общего с «0» и «1» в первых двух столбцах набора данных. Простой расчет: «да» составляет 40%, «нет» — 60%, что в формуле равно p(xi). Затем выполните вычисление log2 и сложите их отрицательные значения вместе.
Результат расчета данных приведенного выше рисунка: 0,9709505944546686.
Если данные:
Результат расчета: 0,7219280948873623
Чем меньше значение, тем лучше результат классификации.
Если данные:
Результат расчета: 1,5219280948873621.
Чем больше значение, тем неточнее классификация, то есть используемый алгоритм классификации не эффективен.
Конечно, самые совершенные данные:
Результат расчета периода должен быть меньше всех предыдущих результатов, это: 0.0