English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo comparte el código específico de implementación del árbol de decisiones en python para que todos lo puedan referir, el contenido específico es el siguiente
Ventajas y desventajas del algoritmo:
Ventajas: el complejidad de cálculo no es alto, los resultados son fáciles de entender, no es sensible a la falta de valores intermedios, y puede manejar datos de características no relacionados
Desventajas: puede producir problemas de sobreajuste
Tipos de datos aplicables: numéricos y nominales
Idea del algoritmo:
1.La idea general de la construcción del árbol de decisiones:
El árbol de decisiones es básicamente como if-La estructura de else es la misma, y su resultado es que generes un árbol que puedas seleccionar y juzgar desde la raíz hasta la hoja, pero aquí el if-else no puede ser lo que creemos que configuramos, lo que debemos hacer es proporcionar un método para que la computadora pueda obtener el árbol de decisiones que necesitamos mediante este método. El punto clave de este método está en cómo seleccionar características valiosas de entre tantas características y seleccionarlas en el mejor orden desde la raíz hasta la hoja. Una vez completado esto, también podemos construir recursivamente un árbol de decisiones
2.Ganancia de información
El principio más importante de dividir el conjunto de datos es hacer que los datos desordenados se vuelvan más ordenados. Dado que esto también implica problemas de orden y desorden de la información, naturalmente, se debe pensar en la entropía de la información. Aquí también calculamos la entropía de la información (otra方法是Gini impureza). La fórmula es la siguiente:
Requisitos que deben cumplir los datos:
1 Los datos deben estar formados por una lista de elementos de lista, y todos los elementos de las columnas deben tener la misma longitud de datos
2 La última columna de los datos o el último elemento de cada ejemplo debe ser la etiqueta de categoría del ejemplo actual
Función:
calcShannonEnt(dataSet)
Calcular la entropía de Shannon del conjunto de datos, en dos pasos: primero calcular la frecuencia, segundo calcular la entropía de Shannon según la fórmula
splitDataSet(dataSet, aixs, value)
Dividir el conjunto de datos, agrupar todos los valores que satisfacen X[aixs] == value y devolver un conjunto dividido (sin incluir la propiedad aixs utilizada para dividir, ya que no se necesita)
chooseBestFeature(dataSet)
Elegir las mejores propiedades para la división, la idea es muy sencilla: dividir cada propiedad y ver cuál es la mejor. Aquí se utiliza un conjunto para seleccionar elementos únicos de la lista, que es un método muy rápido
majorityCnt(classList)
因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类还是没有算完,这时候就会采用多数表决的方式计算节点分类
createTree(dataSet, labels)
基于递归构建决策树。这里的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 -= * 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 += * 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:#Todas las características han sido utilizadas 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: subLabels = labels[:]#Para no cambiar el contenido original de la lista, se ha copiado myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet," ",subLabels)) (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()
Este es el contenido completo del artículo, espero que sea útil para su aprendizaje y que todos los demás lo apoyen a gritar tutorial.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado una edición humana y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de violación de derechos de autor, por favor envíe un correo electrónico a: notice#w3Aviso: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha realizado una edición humana y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de violación de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio eliminará inmediatamente el contenido sospechoso de violación de derechos.