gut#🎜 🎜#无 |
| # 🎜 🎜#Bestimmter Baumklassifizierungsalgorithmus
1. Erstellen Sie einen Datensatz
Um die Verarbeitung zu erleichtern, werden die Simulationsdaten gemäß den folgenden Regeln in numerische Listendaten umgewandelt:
Alter: <30 wird ein Wert von 0 zugewiesen; 30-40 wird ein Wert von 1 zugewiesen; 40 wird ein Wert von 2 zugewiesen. Einkommen: Niedrig ist 0; Mittel ist 1; Hoch ist 2. Arbeitsnatur: Instabil ist 0. Stabil ist 1 : Schlecht ist 0; Gut ist 1
#创建数据集
def createdataset():
dataSet=[[0,2,0,0,'N'],
[0,2,0,1,'N'],
[1,2,0,0,'Y'],
[2,1,0,0,'Y'],
[2,0,1,0,'Y'],
[2,0,1,1,'N'],
[1,0,1,1,'Y'],
[0,1,0,0,'N'],
[0,0,1,0,'Y'],
[2,1,1,0,'Y'],
[0,1,1,1,'Y'],
[1,1,0,1,'Y'],
[1,2,1,0,'Y'],
[2,1,0,1,'N'],]
labels=['age','income','job','credit']
return dataSet,labels
Funktion aufrufen, verfügbare Daten:
ds1,lab = createdataset()
print(ds1)
print(lab)
[[0, 2, 0, 0, ‘N’], [0, 2, 0, 1, ‘N’ ], [1, 2, 0, 0, „Y“], [2, 1, 0, 0, „Y“], [2, 0, 1, 0, „Y“], [2, 0, 1, 1, „N“], [1, 0, 1, 1, „Y“], [0, 1, 0, 0, „N“], [0, 0, 1, 0 , „Y“], [2, 1, 1, 0, „Y“], [0, 1, 1, 1, „Y“], [1, 1, 0, 1, „Y“ ], [1, 2, 1, 0, ‘Y’], [2, 1, 0, 1, ‘N’]][‘Alter’, ‘Einkommen’, ‘Arbeitsplatz’, &lsquo ;credit’]
2. Datensatzinformationsentropie
Informationsentropie, auch bekannt als Shannon-Entropie, ist die Erwartung einer Zufallsvariablen. Misst den Grad der Unsicherheit von Informationen. Je größer die Entropie der Informationen ist, desto schwieriger ist es, die Informationen herauszufinden. Bei der Informationsverarbeitung geht es darum, die Informationen zu klären, bei denen es sich um den Prozess der Entropiereduzierung handelt.
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
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
Beispieldaten-Informationsentropie:
shan = calcShannonEnt(ds1)
print(shan)
0,9402859586706309
3. Informationsgewinn
Informationsgewinn: Wird verwendet, um den Beitrag von Attribut A bei der Reduzierung der Entropie des Beispielsatzes X zu messen. Je größer der Informationsgewinn ist, desto besser eignet es sich zur Klassifizierung von X. 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)
newEntroy = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet, i, value)
prop = len(subDataSet)/float(len(dataSet))
newEntroy += prop * calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntroy
if(infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature
Der obige Code implementiert den ID3-Entscheidungsbaum-Lernalgorithmus basierend auf dem Informationsentropiegewinn. Sein logisches Kernprinzip besteht darin: Wählen Sie nacheinander jedes Attribut im Attributsatz aus und teilen Sie den Stichprobensatz entsprechend dem Wert dieses Attributs in mehrere Teilmengen auf. Berechnen Sie die Informationsentropie dieser Teilmengen und die Differenz zwischen ihr und der Informationsentropie Die Stichprobe basiert auf dem Informationsentropiegewinn der Segmentierung anhand dieses Attributs. Finden Sie das Attribut, das dem größten Gewinn unter allen Gewinnen entspricht. Dies ist das Attribut, das zum Segmentieren des Stichprobensatzes verwendet wird.
Berechnen Sie das beste Split-Stichprobenattribut der Stichprobe. Das Ergebnis wird als Spalte 0 angezeigt, bei der es sich um das Altersattribut handelt:
col = chooseBestFeatureToSplit(ds1)
col
0
4 Erstellen Sie einen Entscheidungsbaum
def majorityCnt(classList):
classCount = {}
for vote in classList:
if vote not in classCount.keys():classCount[vote] = 0
classCount[vote] += 1
sortedClassCount = sorted(classList.iteritems(),key=operator.itemgetter(1),reverse=True)#利用operator操作键值排序字典
return sortedClassCount[0][0]
#创建树的函数
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:
subLabels = labels[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)
return myTree
majorityCntDie Funktion code> wird zur Verarbeitung der folgenden Situation verwendet: Der endgültige ideale Entscheidungsbaum sollte entlang des Entscheidungszweigs das unterste Ende erreichen und alle Stichproben sollten das gleiche Klassifizierungsergebnis haben. Bei realen Stichproben ist es jedoch unvermeidlich, dass alle Attribute konsistent sind, die Klassifizierungsergebnisse jedoch unterschiedlich sind. In diesem Fall passt <code>majorityCnt
die Klassifizierungsbezeichnungen solcher Stichproben an das Klassifizierungsergebnis mit den meisten Vorkommen an.
createTree
ist die Kernaufgabenfunktion. Sie ruft den ID3-Algorithmus zur Informationsentropieverstärkung auf, um alle Attribute nacheinander zu berechnen und zu verarbeiten, und generiert schließlich einen Entscheidungsbaum.
5. Erstellen Sie einen Entscheidungsbaum durch Instanziierung. N’ , 1: ‘Y’}},
1: ‘Y’,2: {‘Credit’: {0: ‘Y’, 1: ‘N’}}}}majorityCnt
函数用于处理一下情况:最终的理想决策树应该沿着决策分支到达最底端时,所有的样本应该都是相同的分类结果。但是真实样本中难免会出现所有属性一致但分类结果不一样的情况,此时majorityCnt
将这类样本的分类标签都调整为出现次数最多的那一个分类结果。
createTree
6. Testprobenklassifizierung 30
Ergebnis: YErgebnis1: N
Post-Informationen : Entscheidungsbaumcode zeichnen
Der folgende Code wird zum Zeichnen von Entscheidungsbaumgrafiken verwendet. Er konzentriert sich nicht auf den Entscheidungsbaumalgorithmus. Wenn Sie interessiert sind, können Sie ihn als Referenz verwenden