[PYTHON] Verstehen Sie den Entscheidungsbaum und klassifizieren Sie Dokumente

Einführung

Dieses Mal habe ich den Entscheidungsbaum des Algorithmus für maschinelles Lernen zusammengefasst. Um das Entwicklungssystem des Entscheidungsbaums wie Random Forest und XGBoost zu verstehen, möchte ich die Grundlagen genau verstehen.

Referenz

Zum Verständnis des Entscheidungsbaums habe ich mich auf Folgendes bezogen.

Entscheidungsbaum

Umriss des Entscheidungsbaums

** Der Entscheidungsbaum ist ein Algorithmus, der nach dem "Blatt" sucht, das der Bedingung am besten entspricht, indem der Zweig gemäß der Bedingung von der "Wurzel" verfolgt wird. ** Erstellen Sie einen bedingten Ausdruck, der aus erklärenden Variablen als Knoten auf der Grundlage der Trainingsdaten besteht, und erstellen Sie automatisch ein Modell, das das Vorhersageergebnis im Teil "Blatt" ableiten kann. Es ist möglich, sowohl Klassifizierungsprobleme als auch Regressionsprobleme zu behandeln, und sie werden als ** Regressionsbäume ** bzw. ** Klassifizierungsbäume ** bezeichnet.

Die Vor- und Nachteile sind wie folgt, aber ich denke, dass der Vorteil von ** leicht zu interpretieren ** der Grund für die Verwendung des Entscheidungsbaums am meisten ist.

verdienen

** Fehler **

――Es handelt sich nicht um eine Methode mit hoher Klassifizierungsleistung

Bild des Entscheidungsbaums

Lassen Sie uns den entscheidenden Baumalgorithmus für den Iris-Datensatz von sklearn einfach trainieren und den entscheidenden Baum zeichnen.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

iris = load_iris()

X = iris.data[:,2:]
y = iris.target

tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_clf.fit(X, y)

from graphviz import Source
from sklearn.tree import export_graphviz

export_graphviz(
        tree_clf,
        out_file=os.path.join("iris_tree.dot"),
        feature_names=iris.feature_names[2:],
        class_names=iris.target_names,
        rounded=True,
        filled=True
    )

Folgendes wird in der Befehlszeile ausgeführt (um die Punktdatei in PNG zu konvertieren)

$ dot -Tpng iris_tree.dot -o iris_tree.png

Dann kann der folgende Entscheidungsbaum ausgegeben werden. Es verzweigt sich abhängig davon, ob die Bedingung erfüllt ist (wahr oder falsch), und die farbigen Knoten werden als "Blätter" verwendet, um das endgültige Vorhersageergebnis abzuleiten.

iris_tree.png

Lernen und Verunreinigung von Entscheidungsbäumen

Es gibt ** Verunreinigung ** als Index, um zu sehen, ob jeder Knoten des Entscheidungsbaums erfolgreich eine bedingte Verzweigung erstellen kann. Darüber hinaus gibt es zwei Methoden zur Messung der ** Verunreinigung **: ** GINI-Unreinheit ** und ** Entropie **.

GINI-Verunreinigungen

Unter der Annahme, dass $ n $ die Anzahl der in den Daten enthaltenen Klassen und $ p_ {i} $ die Wahrscheinlichkeit ist, dass die Daten die Klasse $ i $ sind, kann die Gini-Unreinheit durch die folgende Formel ausgedrückt werden.


Gini(p) = \sum_{i=1}^{n} p_{i}(1-p_{i}) = 1-\sum_{i=1}^{n} p_{i}^2

Es ist schwer zu verstehen, ob es sich nur um eine Formel handelt. Schauen wir uns also ein konkretes Beispiel an. Überprüfen Sie erneut den grünen Knotenteil des zuvor dargestellten Entscheidungsbaums. Der Wert von ** Werten ** gibt hier an, wie viele Daten in jeder Klasse in diesem bedingten Zweig klassifiziert werden können, und der Wert von ** Klasse ** bestimmt diese Klassifizierung zum Zeitpunkt dieses bedingten Zweigs. , Repräsentiert das.

iris_tree.png

Wenn Sie die * Werte * des grünen Knotens überprüfen, ist dies [0, 49, 5]. Dies bedeutet, dass 0 Daten auf Setosa, 49 Daten auf Versicle und 5 Daten auf Virginia in diesem bedingten Zweig festgelegt sind. Es bedeutet, dass es in klassifiziert ist. Da der Wert von * class * diesmal versicle ist, ist es am besten **, dass alle als versicle klassifiziert werden. Mit anderen Worten, alles andere, was als ** Verunreinigungen ** klassifiziert ist, kann als ** Verunreinigungen ** bezeichnet werden. Der Determinantenbaum verwendet daher einen Index namens ** unrein **, um ihn quantitativ zu messen.

Berechnen wir die Gini-Unreinheit dieses speziellen Beispiels.


1 - (\dfrac{49}{50})^2 - (\dfrac{5}{50})^2 \approx 0.168

Ich konnte die Gini-Unreinheit berechnen. Sie können sehen, dass es mit dem Wert von * gini * im grünen Knoten übereinstimmt.

Entropie

Es ist auch möglich, Entpy als Indikator für die Reinheit zu verwenden. Entropie ist ein Konzept, das ** Unordnung ** ausdrückt, basierend auf der Idee der Informationstheorie. Das Bild ist, dass wenn die Entropie groß ist, ** chaotisch = hohe Reinheit **. Die Erklärung des Entropiekonzepts finden Sie in Vorheriger Artikel. Bitte beziehen Sie sich auch darauf.

Die Entropie wird durch die folgende Formel ausgedrückt.


H(p) = -\sum_{i=1}^{n} p_{i}log_{2}(p_{i})

Berechnen wir die Entpy des grünen Knotens wie im Fall von Gini unrein.


-(\dfrac{49}{50})log_{2}(\dfrac{49}{50}) - (\dfrac{5}{50})log_{2}(\dfrac{5}{50}) \approx 0.445

Selbst auf sklearn ist es möglich, mit dem Training mit Unreinheit als Entropie fortzufahren, indem Kriterium = 'Entropie' als Argument beim Training eines Modells angegeben wird. Im Entscheidungsbaum unten sehen Sie, dass * Entropie * anstelle von * Gini * enthalten ist.

iris_tree.png

Grundsätzlich scheint es keinen großen Unterschied in den Lernergebnissen zwischen der Verwendung von ** Gini Impure ** und ** Entropy ** zu geben, aber die Verwendung von Gini Impure ist etwas besser. Es scheint, dass die Berechnungsgeschwindigkeit schnell ist.

CART-Trainingsalgorithmus

Es gibt mehrere Algorithmen im Entscheidungsbaum, aber dieses Mal werde ich den grundlegendsten WARENKORB (Klassifizierungs- und Regressionsbaum) vorstellen. Der sklearn-Algorithmus verwendet CART. CART ist ein Algorithmus, der auf jedem Knoten nur bedingte Zweige mit zwei Auswahlmöglichkeiten (Ja oder Nein) erstellt und Verzweigungen erstellt, damit die unten gezeigte Kostenfunktion minimiert wird.

Bedenken Sie, dass ein Merkmal $ k $ ist und die Daten mit dem Schwellenwert $ t_ {k} $ für dieses $ k $ in zwei Teile geteilt werden. Zu diesem Zeitpunkt können die optimalen $ k $ und $ t_ {t} $ erhalten werden, indem die folgende Verlustfunktion minimiert wird.


L(k, t_{t}) = \dfrac{n_{right}}{n}Gini_{right} + \dfrac{n_{left}}{n}Gini_{left}

Die Bedeutung der obigen Formel ist der gewichtete Durchschnitt der Anzahl unreiner Daten des Knotens nach der linken und rechten Teilung, und der optimale Schwellenwert kann durch Minimieren dieser gesucht werden.

Baumparameter bestimmen

Der Entscheidungsbaum erzeugt weiterhin tiefe Verzweigungen zur ** Linie **, wo die Reinheit nicht abnimmt, selbst wenn sie weiter geteilt wird. Da der Entscheidungsbaum jedoch die Eigenschaft hat, sich leicht an die angegebenen Trainingsdaten anzupassen, kann das Erzeugen von Verzweigungen in beliebiger Tiefe leicht zu Übertraining führen.

Geben Sie als Gegenmaßnahme Parameter an, die die Form des Entscheidungsbaums einschränken. Typische Beispiele sind Parameter, die die Tiefe des Baums begrenzen ("max_depth" für sklearn) und die Untergrenze der Anzahl der zum Teilen eines Knotens erforderlichen Stichproben ("min_sample_leaf" für sklearn).

Dokumentklassifizierung anhand des Entscheidungsbaums

Erstellen eines Entscheidungsbaummodells mit sklearn

Im Folgenden erstellen wir mithilfe der Bibliothek ein Modell des Entscheidungsbaums.

Bibliothek verwendet

scikit-learn 0.21.3

Datensatz

Mit sklearn können Sie ganz einfach ein Modell eines Entscheidungsbaums erstellen. Dieses Mal verwenden wir "Livedoor News Corpus" für den Datensatz. Einzelheiten zum Datensatz und zur Methode der morphologischen Analyse finden Sie unter Veröffentlicht im zuvor veröffentlichten Artikel. Ich werde.

Im Fall von Japanisch ist eine Vorverarbeitung erforderlich, bei der Sätze in morphologische Elemente zerlegt werden. Nachdem alle Sätze in morphologische Elemente zerlegt wurden, werden sie in den folgenden Datenrahmen verschoben.

スクリーンショット 2020-01-13 21.07.38.png

Die Spalte ganz rechts ist die morphologische Analyse aller Sätze und durch Leerzeichen halber Breite getrennt. Verwenden Sie diese Option, um ein Modell des Entscheidungsbaums zu erstellen.

Modelllernen

Erstellen Sie mit sklearn ein Modell des Entscheidungsbaums. Nachfolgend finden Sie die wichtigsten Parameter zum Erstellen eines Modells.

Parametername Bedeutung der Parameter
criterion {“gini”, “entropy”}Ob Gini-Reinheit oder Entropie als Indikator für Reinheit verwendet werden soll
max_depth Maximaler Wert, wie viel Tiefe des Entscheidungsbaums zulässig ist(Wenn nicht festgelegt, kann möglicherweise ein sehr komplizierter Entscheidungsbaum erstellt werden, der sich auf die Generalisierungsleistung auswirkt.)
min_samples_split Beim Aufteilen des KnotensMindestanzahl der erforderlichen Proben(Wenn der Mindestwert klein ist, kann ein Modell erstellt werden, das sich fein teilt und mit der Generalisierungsleistung zusammenhängt.)
min_samples_leaf Mindestanzahl von Proben, die mindestens im Blatt verbleiben sollten(Ähnlich wie oben kann, wenn der Mindestwert klein ist, ein Modell erstellt werden, das sich fein teilt, was mit der Generalisierungsleistung zusammenhängt.)

Dieses Mal wird der Vektor nach dem Konvertieren des Satzes in das Bag-of-Word-Format (Zählen, wie viele Wörter jedes Wort in jedem Satz enthält, und Vektorisieren) auf den Entscheidungsbaum angewendet. Ich werde versuchen, it-bezogene Artikel mit dem Namen "it-life-hack" und sportbezogene Artikel mit dem Namen "sport-watch" zu klassifizieren.


import pandas as pd
import pickle

#Es wird angenommen, dass der Datenrahmen nach der morphologischen Zersetzung bereits gebeizt wurde.
with open('df_wakati.pickle', 'rb') as f:
    df = pickle.load(f)

#Überprüfen Sie, ob Sie diesmal zwei Arten von Artikeln klassifizieren können
ddf = df[(df[1]=='sports-watch') | (df[1]=='it-life-hack')].reset_index(drop = True)

#Setze Sätze mit der Bibliothek von sklearn ein-of-In das Wortformat konvertieren
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(token_pattern="(?u)\\b\\w+\\b")
X = vectorizer.fit_transform(ddf[3])

#Artikeltyp in numerischen Wert konvertieren
def convert(x):
    if x == 'it-life-hack':
        return 0
    elif x == 'sports-watch':
        return 1

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

iris = load_iris()

X = X
y = ddf[1].apply(lambda x : convert(x))

#Separate Trainingsdaten und Bewertungsdaten
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=42)

#Modell lernen
tree_clf = DecisionTreeClassifier(criterion = 'gini', max_depth=4, min_samples_leaf = 10,random_state=42)
tree_clf.fit(X_train, y_train)

#Geben Sie das Ergebnis für die Auswertungsdaten aus
print(tree_clf.score(X_test, y_test))

Der als Genauigkeit ausgegebene Wert ist hier. Die Genauigkeit ist besser als Sie sich vorstellen können. Es scheint einen deutlichen Unterschied zwischen den in it-bezogenen Artikeln und sportbezogenen Artikeln verwendeten Wörtern zu geben.

0.9529190207156308

Lassen Sie uns nun das diesmal erstellte Modell visualisieren.

from graphviz import Source
from sklearn.tree import export_graphviz
import os

export_graphviz(
        tree_clf,
        out_file=os.path.join("text_classification.dot"),
        feature_names=vectorizer.get_feature_names(),
        class_names=['it-life-hack', 'sports-watch'],
        rounded=True,
        filled=True
    )

Das Folgende wird als Befehl ausgeführt

$ dot -Tpng text_classification.dot -o text_classification.png

iris_tree.png

Sie können sehen, dass irgendwie überzeugende Merkmale wie "Produkt" und "Spieler" als Bedingungen für die Aufteilung der Knoten übernommen werden. Es ist ein großer Vorteil, dass der Inhalt keine Black Box ist.

Next Ich möchte Random Forest, Adaboost, Xgboost, lightGBM usw., die die Entwicklungssysteme des Entscheidungsbaums sind, Schritt für Schritt untersuchen.

Recommended Posts

Verstehen Sie den Entscheidungsbaum und klassifizieren Sie Dokumente
Entscheidungsbaum und zufälliger Wald
Der Versuch, Segmentbäume Schritt für Schritt zu implementieren und zu verstehen (Python)
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
Ich habe versucht, den entscheidenden Baum (CART) zu verstehen, um ihn sorgfältig zu klassifizieren
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (5. Information Entropy)
Entscheidungsbaum (Klassifikation)
Verstehen Sie den TensorFlow-Namespace und die gemeinsam genutzten Mastervariablen
Die Entscheidung von scikit-learn Wie man ein Holzmodell visualisiert
Verstehen Sie die Exponentialverteilung sorgfältig und zeichnen Sie in Python
Visualisieren Sie Daten und erfassen Sie gleichzeitig die Korrelation
Zeichnen und verstehen Sie die multivariate Normalverteilung in Python
Verstehe die Poisson-Distribution sorgfältig und zeichne in Python
Erstellen Sie mit Python einen Entscheidungsbaum aus 0 und verstehen Sie ihn (3. Datenanalysebibliothek Pandas Edition)
Verstehen Sie das Strategiemuster, indem Sie JavaScript und Java-Code vergleichen
Verstehen Sie den Unterschied zwischen der kumulativen Zuordnung zu Variablen und der kumulativen Zuordnung zu Objekten
Verstehen Sie das Decorator-Muster, indem Sie JavaScript und Java-Code vergleichen
Verstehen Sie das Statusmuster, indem Sie JavaScript und Java-Code vergleichen
"Tiefe Kopie" und "flache Kopie", um mit dem kleinsten Beispiel zu verstehen
Verstehen Sie das zusammengesetzte Muster, indem Sie JavaScript und Java-Code vergleichen