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.
Zum Verständnis des Entscheidungsbaums habe ich mich auf Folgendes bezogen.
** 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
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.
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 **.
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.
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.
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.
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.
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.
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).
Im Folgenden erstellen wir mithilfe der Bibliothek ein Modell des Entscheidungsbaums.
scikit-learn 0.21.3
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.
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.
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
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