English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом примере мы分享了 конкретный код реализации дерева решений на Python, который можно использовать для参考, подробности см. ниже
Преимущества и недостатки алгоритма:
Преимущества: невысокая сложность вычислений, легко понимаемые результаты, нечувствительность к отсутствию промежуточных значений, возможность обработки данных с несвязанными характеристиками
Недостатки: может возникнуть проблема чрезмерного соответствия
Применяемые типы данных: числовые и качественные
Алгоритмическая идея:
1. Общий подход к созданию дерева решений:
Дерево решений, по сути, похоже на структуру if-else, результатом которой является дерево, которое можно создавать от корня до листа, но здесь if-else не будет таким, как мы думаем, мы должны предложить метод, с помощью которого компьютер может получить нужное нам дерево решений. Основной момент этого метода заключается в том, как выбрать из множества характеристик те, которые имеют ценность, и выбрать их в лучшем порядке от корня до листа. После этого мы можем рекурсивно построить дерево решений
2. Информационная增益
Основной принцип разделения набора данных - это сделать неупорядоченные данные более упорядоченными. Поскольку это также касается проблемы упорядоченности и хаоса информации, естественно, подумать о энтропии информации. Здесь мы также используем энтропию информации (другой метод - гиниевая неопределенность). Формула следующая:
Требования, которые должны удовлетворять данные:
1 Данные должны состоять из списка элементов, и все элементы всех столбцов должны иметь одинаковую длину
2 Последний столбец данных или последний элемент каждого примера должен быть меткой класса текущего примера
Функция:
calcShannonEnt(dataSet)
Вычисление энтропии Шеннона набора данных, это делается в два шага:第一步 - вычисление частот,第二步 - вычисление энтропии Шеннона по формуле
splitDataSet(dataSet, aixs, value)
Разделение набора данных, все значения, удовлетворяющие X[aixs] == value, объединяются в одну группу, возвращается хорошо разделенный набор (не включая свойство aixs, так как оно не нужно)
chooseBestFeature(dataSet)
Выбор лучших свойств для разделения, идея очень проста: разделить каждый атрибут и посмотреть,哪个 лучше. Здесь используется множество для выбора уникальных элементов из списка, это быстрый метод
majorityCnt(classList)
Потому что мы рекурсивно строим дерево решений на основе затрат свойств, возможно, в конце свойства закончатся, но классификация все еще не завершена, в этом случае используется способ вычисления классификации узла большинством голосов
createTree(dataSet, labels)
Основываясь на рекурсивном строительстве décisionnel trees. Здесь label больше относится к именам классификационных характеристик, чтобы они выглядели лучше и для лучшего понимания.
#coding=utf-8 import operator from math import log import time def createDataSet(): dataSet=[[1,1,'yes'], [1,1,'yes'], [1,0,'no'], [0,1,'no'], [0,1,'no']] labels = ['no surfaceing','flippers'] return dataSet, labels #计算香农熵 def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCounts = {} for feaVec in dataSet: currentLabel = feaVec[-1] if currentLabel not in labelCounts: 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 def splitDataSet(dataSet, axis, value): retDataSet = [] for featVec in dataSet: if featVec[axis] == value: reducedFeatVec = featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec) return retDataSet def chooseBestFeatureToSplit(dataSet): numFeatures = len(dataSet[0]) - 1 #因为数据集的最后一项是标签 baseEntropy = calcShannonEnt(dataSet) bestInfoGain = 0.0 bestFeature = -1 for i in range(numFeatures): featList = [example[i] for example in dataSet] uniqueVals = set(featList) newEntropy = 0.0 for value in uniqueVals: subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet) / float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet) infoGain = baseEntropy - newEntropy if infoGain > bestInfoGain: bestInfoGain = infoGain bestFeature = i return bestFeature #因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类 #还是没有算完,这时候就会采用多数表决的方式计算节点分类 def majorityCnt(classList): classCount = {} for vote in classList: if vote not in classCount.keys(): classCount[vote] = 0 classCount[vote] += 1 return max(classCount) def createTree(dataSet, labels): classList = [example[-1] for example in dataSet] if classList.count(classList[0]) == len(classList): #类别相同则停止划分 return classList[0] if len(dataSet[0]) == 1: #所有特征已经用完 return majorityCnt(classList) bestFeat = chooseBestFeatureToSplit(dataSet) bestFeatLabel = labels[bestFeat] myTree = {bestFeatLabel:{}} del(labels[bestFeat]) featValues = [example[bestFeat] for example in dataSet] uniqueVals = set(featValues) for value in uniqueVals: myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) return myTree def main(): data,label = createDataSet() t1 = time.clock() myTree = createTree(data,label) t2 = time.clock() print myTree print 'execute for ',t2-t1 if __name__=='__main__': main()
Вот весь контент этой статьи, надеюсь, он поможет вам в изучении, также希望大家多多支持呐喊教程。
Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Содержимое предоставлено пользователями Интернета, самостоятельно загруженным, сайт не имеет права собственности, не был отредактирован вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @), чтобы сообщить о нарушении, и предоставьте соответствующие доказательства. Если факт будет подтвержден, сайт немедленно удалят涉嫌侵权的内容.