Lassen Sie uns aufschlüsseln, was hier vor sich geht.
Wir kehren zu unserem „potato_salad?” Beispiel. Die Variablen in der obigen Formel stellen Folgendes dar:
- T = Ziel, unser „mittlerer Westen?“ column
- A = die Variable(Spalte), die wir testen, „potato_salad?“
- v = jeder Wert in A, jeder Wert in der „potato_salad?“ spalte
- Zuerst berechnen wir die ursprüngliche Entropie für (T) vor dem Split , .918278
- Dann berechnen wir für jeden eindeutigen Wert (v) in der Variablen (A) die Anzahl der Zeilen, in denen (A) den Wert (v) annimmt, und dividieren ihn durch die Gesamtzahl der Zeilen. Für den „potato_salad?“ spalte wir erhalten 9/15 für den eindeutigen Wert von (1) und 6/15 für den eindeutigen Wert von (0).Als nächstes multiplizieren wir die Ergebnisse mit der Entropie der Zeilen, in denen (A) (v) ist. Für den linken Split( Split auf 1 für „potato_salad?“) wir bekommen 9/15 * .764204. Für die rechte Seite des Split ( Split auf 0 für „potato_salad?“) wir bekommen 6/15 * 1.
- Wir addieren alle diese Teilmenge Produkte zusammen, 9/14*.764204 + 6/15 = .8585224.
5. Wir subtrahieren dann von der Gesamtentropie Informationsgewinn zu erhalten, .918278 -.8585224 = .059754
Unser Informationsgewinn ist .059754. Was sagt uns das?
Hier ist eine alternative Erklärung. Wir finden die Entropie jedes Satzes nach dem Split, gewichten sie mit der Anzahl der Elemente in jedem Split und subtrahieren sie dann von der aktuellen Entropie. Wenn das Ergebnis positiv ist, haben wir die Entropie mit unserem Split gesenkt. Je höher das Ergebnis ist, desto mehr haben wir die Entropie gesenkt.
Wir enden mit .059754, was bedeutet, dass wir gewinnen .059754 bits von Informationen durch die Aufteilung unserer Datensatz auf der „potato_salad?“ variable/Spalte. Unser Informationsgewinn ist gering, aber es ist immer noch positiv, weil wir die Entropie auf der linken Seite der Spaltung gesenkt haben.
Jetzt müssen wir diesen Vorgang für jede Spalte wiederholen, die wir verwenden. Anstatt dies von Hand zu tun, schreiben wir etwas Python-Code.
Alles mit Python einwickeln
Nachdem wir den Informationsgewinn verstanden haben, müssen wir diesen Vorgang wiederholen, um die Variable / Spalte mit dem größten Informationsgewinn zu finden. Um dies zu tun, können wir ein paar einfache Funktionen in Python erstellen.
Importieren der Daten
Verwandeln wir unsere obige Tabelle mithilfe der Python Pandas-Bibliothek in einen Datenrahmen. Wir werden Pandas importieren und die Funktion read_csv () verwenden, um einen Datenrahmen mit dem Namen „midwest“ zu erstellen.
import pandas as pd
midwest = pd.read_csv('midwes.csv')
Eine Python-Funktion für die Entropie
Für diese Funktion benötigen wir die NumPy-Bibliothek, um die Funktion bincount() zu verwenden, und das math-Modul, um die Funktion log() zu verwenden.
import numpy
import math
Als nächstes definieren wir unsere Funktion mit einem Parameter. Das angegebene Argument ist die Reihe, Liste oder das NumPy-Array, in dem wir versuchen, die Entropie zu berechnen.
def calc_entropy(column):
Wir müssen den Prozentsatz jedes Falles in der Spalte finden. Wir können die numpy verwenden.bincount() Funktion für diese. Der Rückgabewert ist ein NumPy-Array, in dem die Anzahl der eindeutigen Werte aus der Spalte gespeichert wird, die als Argument übergeben wurde.
counts = numpy.bincount(column)
Wir speichern die Wahrscheinlichkeiten jedes eindeutigen Werts, indem wir das Array „counts“ durch die Länge der Spalte dividieren.
probabilities = counts / len(column)
Wir können dann eine Variable namens „entropy“ initialisieren und auf 0 setzen.
entropy = 0
Als nächstes können wir eine „for-Schleife“ verwenden, um jede Wahrscheinlichkeit in unserem Wahrscheinlichkeitsarray zu durchlaufen und sie mit dem Logarithmus zur Basis 2 der Wahrscheinlichkeit zu multiplizieren.log() -Funktion. Fügen Sie dann jeden Fall zu unserer gespeicherten Entropievariablen hinzu. *stellen Sie sicher, dass Ihre Wahrscheinlichkeit größer als 0 ist, andernfalls gibt log(0) undefined
for prob in probabilities:
if prob > 0:
endtropy += prob * math.log(prob,2)
Schließlich geben wir unsere negierte Entropievariable zurück.
return -entropy
Jetzt alle zusammen:
Großartig! Jetzt können wir eine Funktion zur Berechnung des Informationsgewinns erstellen.
Eine Python-Funktion zur Informationsgewinnung
Wir müssen eine Funktion definieren, die drei Parameter hat, einen für den gesamten Datensatz, einen für den Namen der Spalte, in die wir aufteilen möchten, und einen für den Namen unserer Zielspalte.
def calc_information_gain(data, split_name, target_name):
Als nächstes können wir die Entropiefunktion von früher verwenden, um die ursprüngliche Entropie unserer Zielspalte zu berechnen.
orginal_entropy = calc_entropy(data)
Jetzt müssen wir unsere Spalte aufteilen.
*In diesem Beispiel verwenden wir nur die Variablen/Spalten mit zwei eindeutigen. Wenn Sie eine Variable / Spalte wie „Alter“ aufteilen möchten, gibt es mehrere Möglichkeiten, dies zu tun. Eine Möglichkeit besteht darin, jeden eindeutigen Wert aufzuteilen. Eine andere Möglichkeit besteht darin, die Berechnung des Informationsgewinns zu vereinfachen und die Aufteilung zu vereinfachen, indem nicht für jeden eindeutigen Wert aufgeteilt wird. Stattdessen wird der Median für die Variable / coumn gefunden, auf die aufgeteilt wird. Alle Zeilen, in denen der Wert der Variablen unter dem Median liegt, werden in den linken Zweig und die restlichen Zeilen in den rechten Zweig verschoben. Um den Informationsgewinn zu berechnen, müssen wir nur Entropien für zwei Teilmengen berechnen. Wir werden diese Methode nicht durchgehen, aber sobald die Aufteilung des Medians durchgeführt ist, sind die restlichen Schritte dieselben wie unten beschrieben.
Da die Spalten, mit denen wir arbeiten, nur zwei eindeutige Werte haben, werden wir eine linke und eine rechte Aufteilung vornehmen.
Wir beginnen mit den Pandas.Serie.unique(), um uns ein Array der eindeutigen Werte in der Spalte
values = data.unique()
Als nächstes erstellen wir eine linke und rechte Aufteilung mit „values“.
left_split = data == values]
right_split = data == values]
Jetzt können wir eine Variable initiieren, um von unserer ursprünglichen Entropie zu subtrahieren.
to_subtract = 0
Dann durchlaufen wir jede von unserem Split erstellte Teilmenge, berechnen die Wahrscheinlichkeit der Teilmenge und addieren dann das Produkt aus der Wahrscheinlichkeit und der Entropie der Zielspalte der Teilmenge.
for subset in :
prob = (subset.shape / data.shape)
to_subtract += prob * calc_entropy(subset)
Schließlich können wir die Differenz von to_subract zurückgeben, die von der ursprünglichen Entropie subtrahiert wird.
return original_entropy - to_subtract
Die gesamte Funktion ist unten.
Eine Python-Funktion für den höchsten Informationsgewinn
Unsere letzte Funktion wird eine sein, die den Variablen- / Spaltennamen mit dem höchsten Informationsgewinn zurückgibt.
Wie bereits erwähnt, verwenden wir für dieses Beispiel nur die Spalten mit zwei eindeutigen Werten. Wir speichern diese Spaltennamen in einer Liste, um sie in der Funktion zu verwenden. Um zu dem Punkt zu gelangen, werden wir dies für dieses Beispiel hart codieren, aber in einem großen Datensatz ist es am besten, Code zu schreiben, um diese Liste dynamisch basierend auf den Kriterien zu erstellen, die wir zur Auswahl der Spalten verwenden.
columns =
Lassen Sie uns den letzten Schritt in eine Funktion einschließen, damit wir ihn nach Bedarf wiederverwenden können. Es wird einen Parameter haben, die Liste der Spalten, für die wir den höchsten Informationsgewinn finden möchten.
def highest_info_gain(columns):
Wir initialisieren ein leeres Wörterbuch, um unsere Informationsgewinne zu speichern.
information_gains = {}
Und dann können wir die Liste der Spalten durchlaufen und das Ergebnis in unserem information_gains-Wörterbuch speichern.
for col in columns:
information_gain = calc_information_gain(midwest, col, 'midwest?)
information_gains = information_gain
Schließlich können wir den Schlüssel mit dem höchsten Wert in unserem Wörterbuch zurückgeben.
return max(information_gains, key=information_gains.get)
Jetzt alle zusammen:
Sobald wir unsere letzte Funktion ausführen
print(highest_info_gain(midwest, columns, 'midwest?'))
//sushi
Wir sehen die Variable / Spalte mit dem höchsten Informationsgewinn ist ‘sushi‘?’.
Wir können unten eine Aufteilung auf Sushi visualisieren: