English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lernen der Klassifikationsalgorithmen für Entscheidungsbaume in Python

Ab diesem Kapitel beginnen wir mit der offiziellen Algorithmus-Lernen.

Zunächst lernen wir den klassischen und effektiven Klassifikationsalgorithmus: Entscheidungsbaum-Klassifikationsalgorithmus.

1、Entscheidungsbaum-Algorithmus

Der Entscheidungsbaum klassifiziert die Attribute der Beispiele mit einem Baumstruktur, ist die intuitivste Klassifizierungs-algorithmus und kann auch für die Regression verwendet werden. Allerdings hat er Schwierigkeiten mit einigen speziellen logischen Klassifikationen. Typisch wie XOR-Logik, ist der Entscheidungsbaum nicht gut darin, solche Probleme zu lösen.
Der Aufbau eines Entscheidungsbaums ist nicht einzigartig. Es ist bedauerlich, dass der Aufbau des besten Entscheidungsbaums zu einem NP-Problem gehört. Daher ist es der Schwerpunkt der Forschung, wie man einen guten Entscheidungsbaum aufbaut.
J. Ross Quinlan in1975vorgeschlagen, das Konzept der Informationendichte in den Aufbau des Entscheidungsbaums einzuführen, das ist der berühmte ID3Algorithmus. Später hat C4.5, C5.0, CART usw. sind Verbesserungen dieser Methode.

Die Entropie ist das "Unordnung, Chaos"-Niveau. Der Umgang mit diesem Konzept kann verwirrend sein. Um schnell zu erfahren, wie man Attribute mit Informationendichten-Gewinn zerteilt, kann man den Artikel dieses Bruders referenzieren: Python-Maschinenlernen: Entscheidungsbaum-Algorithmus

Wenn es noch nicht verstanden ist, siehe den folgenden Beispiel.

Angenommen, man möchte einen Entscheidungsbaum zur automatischen Auswahl guter Äpfel erstellen, um es einfach zu halten, lass ihn nur die folgenden lernen:4Beispiele:
Beispiel  Rot  Groß  Guter Apfel 
0         1        1         1 
1         1        0         1 
2         0        1         0 
3         0  0  0 

Beispiel enthält2Attribute, A0 bedeutet, ob es ein roter Apfel ist. A1bedeutet, ob es ein großer Apfel ist.

Daher beträgt die Informationendichte dieses Beispiels vor der Klassifizierung S = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1.

Die Informationendichte beträgt1dargestellt, dass sich der aktuelle Zustand am chaotischsten und am ungeordnetesten darstellt.

In diesem Beispiel ist dies nur2Attribute. Daher gibt es natürlicherweise nur2Entscheidungsbaum, wie im folgenden Diagramm gezeigt:

Es ist offensichtlich, dass der linke Entscheidungsbaum, der A0 (rot) als Zerlegungsgrundlage verwendet, besser ist als der rechte A1Als Entscheidungsbaum auf der Grundlage der Zerlegung (Größe).
Das ist natürlich eine intuitive Erkenntnis. Eine quantitative Untersuchung erfordert die Berechnung des Informationendichten-Gewinns jeder Zerlegungssituation.
Zuerst wird A0 als Zerlegungsgrundlage gewählt, die Informationendichte der Unter Knoten wird wie folgt berechnet:
0,1Die Blattknoten haben2positive Beispiele, 0 negative Beispiele. Die Informationendichte beträgt: e1 = -(2/2 * log(2/2) + 0/2 * log(0/2)) = 0。
2,3Die Blattknoten haben 0 positive Beispiele,2negative Beispiele. Die Informationengravitation beträgt: e2 = -(0/2 * log(0/2) + 2/2 * log(2/2)) = 0。

Daher wird die Informationendichte nach der A0-Zerlegung als Gewichtung der Informationendichten der Unter Knoten gewählt: E = e1*2/4 + e2*2/4 = 0。
wählen A0 zur Aufteilung die Informationengravitation G(S, A0) = S - E = 1 - 0 = 1.

Tatsächlich stellen die Blätter eines Entscheidungsbaums dar, dass alle Proben bereits derselben Kategorie angehören, daher beträgt die Informationengravitation sicherlich 0.

Gleichermaßen, wenn man zuerst A1als Aufteilung, die Informationengravitation jeder Unternode wie folgt berechnet wird:
0,2Unternode gibt es1positive Beispiele,1negative Beispiele. Die Informationengravitation beträgt: e1 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1.
1,3Unternode gibt es1positive Beispiele,1negative Beispiele. Die Informationengravitation beträgt: e2 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1.
Daher wählen wir A1Die Informationengravitation nach der Aufteilung ist die Gewichtung der Informationengravitation jeder Unternode: E = e1*2/4 + e2*2/4 = 1. Das bedeutet, dass es keinen Unterschied macht, ob man aufteilt oder nicht!
wählen A1Informationengewinnung G(S, A)1)=S - E = 1 - 1 = 0.
Daher müssen wir vor jeder Aufteilung nur diejenige Aufteilung berechnen, die die größte Informationengewinnung bringt.

2、Datensatz

Zur Vereinfachung und Verständnis verwenden wir wie folgt einen äußerst einfachen Testdatensatz:
1.5 50 dünn 
1.5 60 fett 
1.6 40 dünn 
1.6 60 fett 
1.7 60 dünn 
1.7 80 fett 
1.8 60 dünn 
1.8 90 fett 
1.9 70 dünn 
1.9 80 fett 

Diese Daten umfassen insgesamt10Proben, jede Probe hat2Attribute, davon Körpergröße und Gewicht, und die dritte Spalte ist die Kategorietag, die "fett" oder "dünn" darstellt. Diese Daten werden in1.txt.

Unsere Aufgabe ist es, einen Entscheidungsbaum-Klassifikator zu trainieren, der die Körpergröße und das Gewicht als Eingaben nimmt und dem Klassifikator ermöglicht, zu bestimmen, ob eine Person fett oder schlank ist.
(Die Daten sind eine subjektive Annahme des Autors und haben eine gewisse Logik, aber ignorieren Sie bitte ihre Rationalität)

Entscheidungsbaume sind für die Zweige der binären Logik 'ja/nein' sehr natürlich. Was tun wir aber, wenn in diesem Datensatz Körpergröße und Gewicht kontinuierliche Werte sind?

Obwohl es etwas umständlich ist, ist dies kein Problem. Es genügt, die Punkte zu finden, an denen die kontinuierlichen Werte in verschiedene Intervalle unterteilt werden, und es wird zu einem binären Logikproblem.
Die Aufgabe des Entscheidungsbaums in diesem Beispiel ist es, einige Schwellenwerte in der Körpergröße und dem Gewicht zu finden, um die Proben entsprechend der Logik 'größer oder kleiner als diese Schwellenwerte' zu klassifizieren und den Entscheidungsbaum von oben nach unten aufzubauen.

Die Implementierung mit den Maschinenlernbibliotheken von Python ist ziemlich einfach und elegant.

3、Python-Implementierung

Python-Code zur Implementierung:

# -*- coding: utf-8 -*- 
import numpy as np 
import scipy as sp 
von sklearn import tree 
von sklearn.metrics import precision_recall_curve 
von sklearn.metrics import classification_report 
von sklearn.cross_validation import train_test_split 
''' Datenlesung ''' 
data  = [] 
labels = [] 
mit open("data\\1.txt) als ifile: 
    for line in ifile: 
      tokens = line.strip().split(' ') 
      data.append([float(tk) for tk in tokens[:-1]) 
      labels.append(tokens[-1]) 
x = np.array(data) 
labels = np.array(labels) 
y = np.zeros(labels.shape) 
''''' 标签转换为0/1 ''' 
y[labels=='fat']=1 
''''' 拆分训练数据与测试数据 ''' 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2) 
''''' 使用信息熵作为划分标准,对决策树进行训练 ''' 
clf = tree.DecisionTreeClassifier(criterion='entropy') 
print(clf) 
clf.fit(x_train, y_train) 
''''' 把决策树结构写入文件 ''' 
with open("tree.dot", 'w') as f: 
  f = tree.export_graphviz(clf, out_file=f) 
''''' 系数反映每个特征的影响力。越大表示该特征在分类中起到的作用越大 ''' 
print(clf.feature_importances_) 
'''''测试结果的打印''' 
answer = clf.predict(x_train) 
print(x_train) 
print(answer) 
print(y_train) 
print(np.mean( answer == y_train)) 
'''''准确率与召回率''' 
precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train)) 
answer = clf.predict_proba(x)[:,1] 
print(classification_report(y, answer, target_names = ['thin', 'fat'])) 

Die Ausgabeergebnisse sind ähnlich wie folgt:
[ 0.2488562  0.7511438]
array([[  1.6,  60. ],
       [  1.7,  60. ],
       [  1.9,  80. ],
       [  1.5,  50. ],
       [  1.6,  40. ],
       [  1.7,  80. ],
       [  1.8,  90. ],
       [  1.5,  60. ])
array([ 1, 0.,  1, 0., 0.,  1,  1,  1.])
array([ 1, 0.,  1, 0., 0.,  1,  1,  1.])
1.0
             precision    recall  f1-score   support
       thin       0.83      1.00      0.91         5
        fat        1.00      0.80      0.89         5
avg / total       1.00      1.00      1.00         8
array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1. 0., 0.])
array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1, 0.,  1.])

zu sehen, die Genauigkeit der getesteten trainierten Daten ist100%. Aber wenn alle Daten am Ende getestet werden, erscheinen1Testproben wurden falsch klassifiziert.
Es wird gezeigt, dass das Decision Tree in diesem Beispiel die Regeln des Trainingsdatensatzes gut absorbiert, aber die Vorhersage etwas schlecht ist.
Hier gibt es3Es sollte erwähnt werden, dass dies in der zukünftigen maschinellen Lernung verwendet wird.

1und die Trennung der Trainingsdaten und Testdaten.

Dies wird getan, um die Křížová validace zu erleichtern. Die Křížová validace dient dazu, die Stabilität des Klassifiers vollständig zu testen.
Im Code2bedeutet, zufällig ausgewählt20% der Daten als Test verwendet. Der Rest80% für das Training des Entscheidungsbaums verwendet.
Das bedeutet10Proben zufällig ausgewählt8Trainings. Da der Datensatz in diesem Artikel klein ist, ist das Ziel, zu sehen, dass aufgrund der zufälligen Auswahl der Trainingsdaten jedes Mal ein anderes Entscheidungsbaum gebaut wird.

2und verschiedene Einflussfaktoren der Merkmale.

Die verschiedenen Merkmale der Proben haben sehr unterschiedliche Einflussgewichte. Es ist auch sehr wichtig, nach der Klassifikation zu sehen, wie stark jeder Proben die Klassifikation beeinflusst.
In diesem Beispiel ist das Gewicht des Körperlängen25hat, Gewicht75zu sehen, die Bedeutung des Gewichts ist weit überlegen zu der des Körperlängen. Für die Beurteilung von Fett und Schlankheit ist dies sehr logisch.

3und Accuracy und Recall.

Dies2Einige Werte sind ein wichtiger Maßstab für die Genauigkeit der Klassifikation. Zum Beispiel wird am Ende alle10Einige Beispiele, die in den Klassenifier getestet wurden:
Testergebnisse: array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1. 0., 0.])
Echte Ergebnisse: array([ 0.,  1, 0.,  1, 0.,  1, 0.,  1, 0.,  1.])
hat, Accuracy83. Weil der Klassenifier6Ein thin, davon waren5Ein thin, davon waren5/6=0.83.
hat, Recall-Rate1.00. Weil es im Datensatz5Ein thin, während der Klassenifier alle korrekt klassifizierte (obwohl ein fat in thin geteilt wurde!), Recall-Rate5/5=1.
hat, Accuracy1.00. Mehr ist nicht erforderlich.
hat, Recall-Rate80. Weil es im Datensatz5Ein fat, während der Klassenifier nur4Ein (hat ein fat in thin geteilt! ), Recall-Rate4/5=0.80.
Oft, insbesondere in Fällen mit höherer Datenklassifizierungsdiffizilität, sind Genauigkeit und Rückrufquote oft im Widerspruch zueinander. Sie müssen möglicherweise nach Ihrem Bedarf den besten Kompromisspunkt finden.
Zum Beispiel, in diesem Beispiel ist Ihr Ziel, so viele wahre Fette wie möglich zu finden (Genauigkeit), oder so viele Fette wie möglich zu finden (Rückrufquote).

Der Code schreibt auch die Struktur des Entscheidungsbaums in tree.dot hinein. Öffnen Sie diese Datei, um den Entscheidungsbaum leicht zu zeichnen, und Sie können auch mehr Klassifikationsinformationen des Entscheidungsbaums sehen.
Der tree.dot dieses Artikels sieht so aus:

digraph Tree { 
0 [label = "X[1] <= 55.0000\nentropy = 0.954434002925\nsamples = 8", shape = "box"] ; 
1 [label = "entropy = 0.0000\nsamples = 2\nvalue = [ 2. 0.]", shape = "box"] ; 
0 -> 1 ; 
2 [label = "X[1] <= 70.0000\nentropy = 0.650022421648\nsamples = 6", shape = "box"] ; 
0 -> 2 ; 
3 [label = "X[0] <= 1.6500\nentropy = 0.918295834054\nsamples = 3", shape = "box"] ; 
2 -> 3 ; 
4 [label = "entropy = 0.0000\nsamples = 2\nvalue = [ 0. 2]. shape = "box"] ; 
3 -> 4 ; 
5 [label = "entropy = 0.0000\nsamples = 1\nvalue = [ 1. 0.]", shape = "box"] ; 
3 -> 5 ; 
6 [label = "entropy = 0.0000\nsamples = 3\nvalue = [ 0. 3]. shape = "box"] ; 
2 -> 6 ; 
} 

Basierend auf dieser Information sollte der Entscheidungsbaum so aussehen:

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die呐喊教程 mehr unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig und selbstständig hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @ beim Senden einer E-Mail zur Meldung von Missbrauch und stellen Sie relevante Beweise zur Verfügung. Sobald nachgewiesen wird, dass der Inhalt urheberrechtlich geschützt ist, wird diese Website den fraglichen urheberrechtlich geschützten Inhalt sofort löschen.)

Empfohlen für Sie