Heim > Backend-Entwicklung > Python-Tutorial > So implementieren Sie einen Entscheidungsbaumklassifizierungsalgorithmus in Python

So implementieren Sie einen Entscheidungsbaumklassifizierungsalgorithmus in Python

WBOY
Freigeben: 2023-05-26 19:43:46
nach vorne
1261 Leute haben es durchsucht

Vorabinformation

1. Entscheidungsbaum

Umgeschriebene Sätze: Beim überwachten Lernen ist ein häufig verwendeter Klassifizierungsalgorithmus der Entscheidungsbaum, der auf einer Reihe von Stichproben basiert. Jede Stichprobe enthält eine Reihe von Attributen und entsprechende Klassifizierungsergebnisse. Mithilfe dieser Beispiele zum Lernen kann der Algorithmus einen Entscheidungsbaum generieren, der neue Daten korrekt klassifizieren kann Daten darüber, ob ein bestimmtes Produkt gekauft werden soll, lauten wie folgt: Einkommensbereich

Berufsnatur

Bonität

Kaufentscheidung #🎜 🎜#02# 🎜🎜#无码OkayNein0330- 40HochInstabilSchlechtist#🎜🎜 #>40mittelinstabilschlecht ist 05>40niedrig Stabil Schlechtist06>40#🎜 🎜#niedrig#🎜🎜 #stabilgutnein 0730 -40niedrigstabilgutist#🎜 🎜#<30Schlechtist10>40#🎜 🎜#mittel#🎜 🎜#11#🎜 🎜 #stabil ist # 🎜🎜#无码好# 🎜🎜#ist# 🎜🎜#stabil#🎜🎜 ## 🎜🎜#arm#🎜🎜 ## 🎜🎜#IS#🎜🎜 ## 🎜🎜 ## 🎜🎜###14#🎜🎜 ## 🎜🎜#& gt; 40 mittelinstabilgut# 🎜 🎜#

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,&#39;N&#39;],
            [0,2,0,1,&#39;N&#39;],
            [1,2,0,0,&#39;Y&#39;],
            [2,1,0,0,&#39;Y&#39;],
            [2,0,1,0,&#39;Y&#39;],
            [2,0,1,1,&#39;N&#39;],
            [1,0,1,1,&#39;Y&#39;],
            [0,1,0,0,&#39;N&#39;],
            [0,0,1,0,&#39;Y&#39;],
            [2,1,1,0,&#39;Y&#39;],
            [0,1,1,1,&#39;Y&#39;],
            [1,1,0,1,&#39;Y&#39;],
            [1,2,1,0,&#39;Y&#39;],
            [2,1,0,1,&#39;N&#39;],]
    labels=[&#39;age&#39;,&#39;income&#39;,&#39;job&#39;,&#39;credit&#39;]
    return dataSet,labels
Nach dem Login kopieren

Funktion aufrufen, verfügbare Daten:

ds1,lab = createdataset()
print(ds1)
print(lab)
Nach dem Login kopieren

[[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
Nach dem Login kopieren

Beispieldaten-Informationsentropie:
shan = calcShannonEnt(ds1)
print(shan)
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren
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: Y

Ergebnis1: 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

01 <30HochInstabilSchlecht# 🎜🎜## 🎜🎜#Nein
<30
04# 🎜🎜#
08#🎜🎜 ## 🎜🎜#& lt; 30#🎜🎜 ## 🎜🎜#Medium#🎜🎜 ## 🎜🎜#instabil#🎜🎜 ## 🎜🎜#Poor#🎜🎜 ## 🎜🎜 #Nein 09
NiedrigStabil#🎜 🎜#
stabil schlecht ist<30 mittel
gut# 🎜🎜##🎜 🎜# 12 30-40 mittel
13 30- 40 Hoch
#🎜 🎜#无

Das obige ist der detaillierte Inhalt vonSo implementieren Sie einen Entscheidungsbaumklassifizierungsalgorithmus in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage