Let de ineenstorting wat hier gaande is.
We gaan terug naar onze ” potato_salad?” bijvoorbeeld. De variabelen in de bovenstaande formule vertegenwoordigen het volgende:
T = Target, onze ” midwest?”column
A = de variabele (kolom) die we testen,” potato_salad?”
v = elke waarde in A, elke waarde in de ” potato_salad?”column
eerst berekenen we de orginale entropie voor (T) voor de splitsing , .918278
vervolgens berekenen we voor elke unieke waarde (v) in variabele (A) het aantal rijen waarin (A) de waarde (v) aanneemt en delen we deze door het totale aantal rijen. Voor de ” potato_salad?”kolom krijgen we 9/15 voor de unieke waarde van (1) en 6/15 voor de unieke waarde van (0).
vervolgens vermenigvuldigen we de resultaten met de entropie van de rijen waar (A) (v) is. Voor de linker split (split op 1 Voor ” potato_salad?”) we krijgen 9/15 * .764204. Voor de rechterkant van de split (split op 0 voor ” potato_salad?”) we krijgen 6/15 * 1.
we voegen al deze subsetproducten bij elkaar, 9/14*.764204 + 6/15 = .8585224.
5. We trekken dan af van de totale entropie om informatie te krijgen, .918278 -.8585224 = .059754
onze informatiewinst is .059754. Wat zegt ons dat?
Hier is een alternatieve uitleg. We vinden de entropie van elke set na de splitsing, wegen het met het aantal items in elke splitsing, dan aftrekken van de huidige entropie. Als het resultaat positief is, hebben we de entropie verlaagd met onze splitsing. Hoe hoger het resultaat is, hoe meer we de entropie hebben verlaagd.
we eindigen met .059754, wat betekent dat we winnen .059754 bits van informatie door het splitsen van onze dataset op de ” potato_salad?”variabele / kolom. Onze informatiewinst is laag, maar het is nog steeds positief, omdat we de entropie aan de linkerkant van de splitsing hebben verlaagd.
nu moeten we dit proces herhalen voor elke kolom die we gebruiken. In plaats van dit met de hand te doen, laten we wat Python code schrijven.
het geheel wordt afgesloten met Python
nu we informatieversterking begrijpen, hebben we een manier nodig om dit proces te herhalen om de variabele / kolom met de grootste informatieversterking te vinden. Om dit te doen, kunnen we een paar eenvoudige functies maken in Python.
importeren van de Data
laten we onze bovenstaande tabel omzetten in een DataFrame met behulp van de Python panda ‘ s bibliotheek. We zullen panda ‘ s importeren en de read_csv() functie gebruiken om een DataFrame te maken met de naam “midwest”.
import pandas as pd midwest = pd.read_csv('midwes.csv')
een Python-functie voor entropie
voor deze functie hebben we de NumPy-bibliotheek nodig om de bincount () – functie te gebruiken en de math-module om de log () – functie te gebruiken.
import numpy import math
vervolgens definiëren we onze functie met één parameter. Het gegeven argument zal de reeks, lijst, of NumPy array zijn waarin we proberen de entropie te berekenen.
def calc_entropy(column):
We moeten het percentage van elk geval in de kolom vinden. We kunnen de numpy gebruiken.bincount () functie hiervoor. De return waarde is een NumPy array die de telling van elke unieke waarde uit de kolom die werd doorgegeven als argument zal opslaan.
counts = numpy.bincount(column)
We slaan de waarschijnlijkheden van elke unieke waarde op door de” counts ” array te delen door de lengte van de kolom.
probabilities = counts / len(column)
We kunnen dan een variabele genaamd” entropy ” initialiseren en instellen op 0.
entropy = 0
vervolgens kunnen we een” for loop ” gebruiken om door elke waarschijnlijkheid in onze waarschijnlijkheidsarray te lusenen deze te vermenigvuldigen met de logaritme basis 2 van waarschijnlijkheid met behulp van de wiskunde.log () functie. Voeg vervolgens elk geval toe aan onze opgeslagen entropievariabele. * controleer of je kans groot is dan 0 anders geeft log(0) undefined
for prob in probabilities: if prob > 0: endtropy += prob * math.log(prob,2)
ten slotte retourneren we onze negated Entropy variabele.
return -entropy
nu samen:
geweldig! Nu kunnen we een functie bouwen om informatiewinst te berekenen.
een Python-functie voor Informatieversterking
We moeten een functie definiëren die drie parameters heeft, één voor de volledige dataset, één voor de naam van de kolom die we willen splitsen, en één voor de naam van onze doelkolom.
def calc_information_gain(data, split_name, target_name):
vervolgens kunnen we de entropiefunctie van eerder gebruiken om de oorspronkelijke entropie van onze doelkolom te berekenen.
orginal_entropy = calc_entropy(data)
nu moeten we onze kolom splitsen.
*in dit voorbeeld gebruiken we alleen de variabelen / kolommen met twee unieke. Als u wilt splitsen op een variabele/kolom zoals “leeftijd”, zijn er verschillende manieren om dit te doen. Een manier is om te splitsen op elke unieke waarde. Een andere manier is om de berekening van informatiewinst te vereenvoudigen en splitsingen eenvoudiger te maken door niet te splitsen voor elke unieke waarde. In plaats daarvan wordt de mediaan gevonden voor de variabele / coumn die wordt opgesplitst. Alle rijen waar de waarde van de variabele onder de mediaan ligt, gaan naar de linker tak en de rest van de rijen gaat naar de rechter tak. Om informatie te verkrijgen, hoeven we alleen entropieën te berekenen voor twee deelverzamelingen. We zullen niet lopen door deze methode, maar zodra de splitsing op de mediaan wordt uitgevoerd de rest van de stappen zou hetzelfde zijn als hieronder beschreven.
omdat de kolommen waarmee we werken slechts twee unieke waarden hebben, maken we een links-en een rechts-splitsing.
we beginnen met de panda ‘ s.Reeks.unique() om ons een array te geven van de unieke waarden in de kolom
values = data.unique()
vervolgens maken we een links en rechts split met behulp van “values”.
left_split = data == values] right_split = data == values]
nu kunnen we een variabele initiëren om af te trekken van onze oorspronkelijke entropie.
to_subtract = 0
dan zullen we herhalen door elke subset gemaakt door onze splitsing, berekenen de waarschijnlijkheid van de subset, en voeg dan het product van de waarschijnlijkheid en de entropie van de subsets doel kolom.
for subset in : prob = (subset.shape / data.shape) to_subtract += prob * calc_entropy(subset)
ten slotte kunnen we het verschil retourneren dat to_subract wordt afgetrokken van de oorspronkelijke entropie.
return original_entropy - to_subtract
de volledige functie staat hieronder.
een Python-functie voor de hoogste Informatiewinst
onze uiteindelijke functie zal er een zijn die de variabele/kolomnaam met de hoogste informatiewinst retourneert.
zoals eerder vermeld gebruiken we alleen de kolommen met twee unieke waarden voor dit voorbeeld. We slaan die kolomnamen op in een lijst om te gebruiken in de functie. Om tot het punt te komen zullen we dit hard coderen voor dit voorbeeld, maar in een grote dataset, zou het het beste zijn om code te schrijven om deze lijst dynamisch op te bouwen op basis van de criteria die we gebruiken om de kolommen te kiezen.
columns =
laten we de laatste stap in een functie wikkelen zodat we het kunnen hergebruiken als dat nodig is. Het heeft één parameter, de lijst met kolommen waar we de hoogste informatiewinst voor willen vinden.
def highest_info_gain(columns):
We zullen een leeg woordenboek intialiseren om onze informatiewinst op te slaan.
information_gains = {}
en dan kunnen we de lijst met kolommen herhalen en het resultaat opslaan in ons woordenboek information_gains.
for col in columns: information_gain = calc_information_gain(midwest, col, 'midwest?) information_gains = information_gain
tenslotte kunnen we de sleutel van de hoogste waarde in ons woordenboek teruggeven.
return max(information_gains, key=information_gains.get)
All together now:
zodra we onze uiteindelijke functie uitvoeren
print(highest_info_gain(midwest, columns, 'midwest?')) //sushi
zien we de variabele/kolom met de hoogste informatiewinst is ‘sushi?’.
We kunnen hieronder een splitsing op sushi visualiseren:
dataset in de sushi kolom
onze linkersplit heeft twee van de zes mensen uit het Midwesten. De rechter split heeft acht van de negen mensen uit het Midwesten. Dit was een efficiënte splitsing en verlaagde onze entropie aan beide kanten. Als we doorgaan zouden we recursie gebruiken om elke splitsing te blijven splitsen met een doel om elke branch te beëindigen met een entropie van nul.
conclusie
beslissingsbomen kunnen een nuttig algoritme voor machine learning zijn om niet-lineaire interacties tussen variabelen in de gegevens op te pikken. In dit voorbeeld hebben we gekeken naar de beginstadia van een beslissingsboomclassificatie-algoritme. Vervolgens keken we naar drie concepten van de informatietheorie: entropie, bit en informatiewinst. Door deze concepten te gebruiken konden we een paar functies in Python bouwen om te beslissen welke variabelen/kolommen het meest efficiënt waren om op te splitsen. Met een stevige greep op deze concepten, kunnen we vooruit om een besluit boom te bouwen.