entropie și câștig de informații în arborii de decizie

photo by Absolutvision on Unsplash

ce criterii ar trebui să utilizeze un algoritm arbore de decizie pentru a împărți variabile / coloane?

înainte de a construi un algoritm arbore de decizie, primul pas este să răspundeți la această întrebare. Să aruncăm o privire la una dintre modalitățile de a răspunde la această întrebare. Pentru a face acest lucru, va trebui să înțeleagă o utilizare câteva concepte cheie din teoria informației.

să examinăm această metodă făcând următorii pași:

  1. aruncați o privire foarte scurtă la ceea ce este un arbore de decizie.
  2. definiți și examinați formula pentru entropie.
  3. discutați ce este un pic în teoria informației.
  4. definiți câștigul de informații și utilizați entropia pentru a-l calcula.
  5. scrieți câteva funcții Python de bază folosind conceptele de mai sus.

în știința datelor, algoritmul arborelui decizional este un algoritm de învățare supravegheat pentru probleme de clasificare sau regresie. Scopul nostru final este de a utiliza datele istorice pentru a prezice un rezultat. Spre deosebire de regresia liniară, arborii de decizie pot prelua interacțiuni neliniare între variabilele din date.

să ne uităm la un arbore de decizie foarte simplu. Mai jos este un flux de lucru care poate fi folosit pentru a lua o decizie dacă să mănânci sau nu un cookie cu unt de arahide.

un exemplu de arbore de decizie dacă sau să nu mâncați un cookie

în acest exemplu, un arbore de decizie poate ridica faptul că ar trebui să mâncați cookie-ul numai dacă sunt îndeplinite anumite criterii. Acesta este scopul final al unui arbore de decizie. Vrem să continuăm să luăm decizii (divizări) până când sunt îndeplinite anumite criterii. Odată întâlnit, îl putem folosi pentru a clasifica sau a face o predicție. Acest exemplu este foarte de bază folosind doar două variabile (alergie, ruinarea cina). Dar, dacă aveți un set de date cu mii de variabile/coloane cum decideți care variabile/coloane sunt cele mai eficiente pentru a împărți pe? O modalitate populară de a rezolva această problemă, mai ales dacă utilizați un algoritm ID3, este utilizarea entropiei și a câștigului de informații.

sarcina

Să presupunem că avem unele date și vrem să-l folosească pentru a face un test online care prezice ceva despre taker test. După ce ne-am uitat la relațiile din date, am decis să folosim un algoritm de arbore de decizie. Dacă nu ați fost niciodată aspirat într-un test online, puteți vedea sute de exemple aici. Scopul testului va fi de a ghici dacă test taker este de la unul dintre statele midwest Americii. Întrebările din test se vor învârti în jurul dacă le place un anumit tip de mâncare sau nu. Mai jos are un mic set de date fictiv cu cincisprezece intrări. Fiecare intrare are răspunsuri la o serie de întrebări. Cele mai multe întrebări sunt despre dacă le-a plăcut un anumit tip de mâncare, în care participantul a răspuns (1) Pentru da sau (0) deocamdată. Ultima coloană („midwest?”) este coloana noastră țintă, ceea ce înseamnă că, odată ce arborele de decizie este construit, aceasta este clasificarea pe care încercăm să o ghicim.

entropie

pentru a ne începe vom folosi o metrică a teoriei informației numită entropie. În știința datelor, entropia este utilizată ca o modalitate de a măsura cât de „mixtă” este o coloană. Mai exact, entropia este utilizată pentru a măsura tulburarea. Să începem prin a găsi entropia coloanei noastre țintă, ” midwest?”.

coloana noastră țintă, ” midwest?”

există zece persoane care trăiesc în midwest și cinci persoane care nu. dacă cineva te va întreba cât de amestecat este coloana, ai putea spune că a fost un fel de amestecat, cu o majoritate(2/3) a oamenilor din midwest. Entropia ne oferă o modalitate de a cuantifica răspunsul” Un fel de mixt”. Cu cât sunt mai amestecate (1)s și (0) s din coloană, cu atât entropia este mai mare. Dacă ” midwest?”dacă cantități egale de (1)s și (0) s entropia noastră ar fi 1. Dacă ” midwest?”a constat doar din (1) s entropia ar fi 0.

putem folosi următoarea formulă pentru a calcula entropia:

formula pentru entropie

să parcurgem fiecare pas al formulei și să calculăm entropia pentru „Midwest?”coloana.

  1. trebuie să repetăm fiecare valoare unică într-o singură coloană și să o atribuim lui i. Pentru acest exemplu, avem 2 cazuri (c) în „midwest?”coloană, fie (0) sau (1).
  2. apoi calculăm probabilitatea ca acea valoare să apară în date. Pentru cazul (1), probabilitatea este 10/15. Pentru cazul (0), probabilitatea este de 5/15.
  3. luăm probabilitatea fiecărui caz și o înmulțim cu baza logaritmică 2 a probabilității. 2 este cea mai comună bază, deoarece entropia este măsurată în biți(mai multe despre asta mai târziu). Explicația completă a motivului pentru care 2 este utilizat este în afara domeniului de aplicare al acestui post, dar un utilizator de pe Stack exchange oferă o explicație bună. Pentru cazul(1), obținem 10/15*log2(10/15). Pentru cazul (0), obținem 5/15*log2(5/15).
  4. apoi, luăm produsul nostru din fiecare caz de mai sus și îl rezumăm împreună. Pentru acest exemplu, 10/15 * log2(10/15) + 5/15*log2 (5/15).
  5. în cele din urmă, negăm suma totală de mai sus, — (10/15*log2(10/15) + 5/15*log2(5/15)).

odată ce am pus pașii împreună, obținem următoarele:

entropia noastră finală este .918278. Deci, ce înseamnă asta cu adevărat?

Teoria informației și un pic de informații

Mergând mai departe, va fi important să înțelegem conceptul de bit. În teoria informației, un bit este gândit ca un număr binar reprezentând 0 pentru nicio informație și 1 pentru un bit complet de informații. Putem reprezenta un pic de informație ca număr binar, deoarece are fie valoarea (1), fie (0). Să presupunem că există o probabilitate egală de a ploua mâine (1) sau de a nu ploua(0). Dacă vă spun că va ploua mâine, v-am dat o informație.

ne putem gândi și la entropie ca la informație. Să presupunem că avem o matriță încărcată cu șase fețe care aterizează întotdeauna (3). De fiecare dată când rulăm matrița, știm din timp că rezultatul va fi (3). Nu obținem informații noi rulând matrița, deci entropia este 0. Pe de altă parte,, în cazul în care matrița este departe și ne rostogolim o (3) a existat o 1/6 șansă în rulare (3). Acum am obținut informații. Astfel, rularea matriței ne oferă un pic de informații — pe ce parte a aterizat numărul.

pentru o scufundare mai profundă în conceptul de un pic de informații, puteți citi mai multe aici.

obținem mai puțin de un „bit” de informație .918278-pentru că există mai multe (1)s în „midwest?”coloana decât (0) s. Aceasta înseamnă că, dacă am prezice o nouă valoare, am putea ghici că răspunsul este (1) și să avem dreptate mai des decât greșit (deoarece există o probabilitate de 2/3 ca răspunsul să fie 1). Datorită acestor cunoștințe anterioare, obținem mai puțin de un „bit” complet de informații atunci când observăm o nouă valoare.

utilizarea entropiei pentru a lua decizii

scopul nostru este să găsim cele mai bune variabile / coloane pe care să le împărțim atunci când construim un arbore de decizie. În cele din urmă, dorim să continuăm să împărțim variabilele/coloanele până când coloana noastră țintă mixtă nu mai este amestecată.

de exemplu, să ne uităm la entropia ” midwest?”coloana după ce ne-am împărțit setul de date pe „potato_salad?”coloana.

divizat pe ” potato_salad?”column

de mai sus, setul nostru de date este împărțit în două secțiuni. În partea stângă, toți cei cărora le place salata de cartofi. În partea dreaptă, toți cei care nu o fac. umplem focalizarea pe partea stângă, care are acum șapte persoane din midwest și două persoane care nu sunt. folosind formula pentru entropie din coloana Midwest divizată din stânga, Noua entropie este .764204. Acest lucru este mare! Scopul nostru este de a reduce entropia și am plecat de la .918278 la .764204. Dar, nu ne putem opri aici, dacă ne uităm la coloana din dreapta, entropia noastră a crescut, deoarece există o cantitate egală de (1)s și (0)s. ceea ce avem nevoie este o modalitate de a vedea cum se schimbă entropia pe ambele părți ale diviziunii. Formula pentru câștigul de informații va face acest lucru. Ne oferă un număr pentru a cuantifica câți biți de informații am câștigat de fiecare dată când ne împărțim datele.

câștigul de informații

Mai devreme am stabilit că vrem împărțiri care scad entropia coloanei noastre țintă. Când ne-am împărțit pe ” potato_salad?”am văzut că entropia în” midwest?”a coborât pe partea stângă. Acum trebuie să înțelegem entropia totală redusă atunci când ne uităm la ambele părți ale diviziunii. Să aruncăm o privire asupra câștigului de informații.

câștigul de informații va folosi următoarea formulă:

să defalcare ceea ce se întâmplă aici.

ne vom întoarce la „potato_salad”?”exemplu. Variabilele din formula de mai sus vor reprezenta următoarele:

  • T = țintă, „midwest-ul nostru?”coloana
  • A = variabila (coloana) suntem de testare, „potato_salad?”
  • v = fiecare valoare în A, fiecare valoare în ” potato_salad?”coloana
  1. În primul rând, vom calcula entropia orginală pentru (T) înainte de divizare , .918278
  2. apoi, pentru fiecare valoare unică (v) în variabila (a), calculăm numărul de rânduri în care (a) preia valoarea (v) și o împărțim la numărul total de rânduri. Pentru ” potato_salad?”coloana obținem 9/15 pentru valoarea unică a (1) și 6/15 pentru valoarea unică a (0).
  3. în continuare, înmulțim rezultatele cu entropia rândurilor unde (A) este (v). Pentru split stânga (divizat pe 1 Pentru „potato_salad?”) obținem 9/15*.764204. Pentru partea dreaptă a împărțirii (împărțită pe 0 pentru „potato_salad?”) obținem 6/15 * 1.
  4. adăugăm toate aceste produse subset împreună, 9/14*.764204 + 6/15 = .8585224.

5. Apoi scădem din entropia generală pentru a obține câștig de informații, .918278 -.8585224 = .059754

câștigul nostru de informații este .059754. Ce ne spune asta?

Iată o explicație alternativă. Găsim entropia fiecărui set după împărțire, ponderând-o cu numărul de articole din fiecare împărțire, apoi scăzând din entropia curentă. Dacă rezultatul este pozitiv, am redus entropia cu divizarea noastră. Cu cât rezultatul este mai mare, cu atât am redus entropia.

ajungem cu .059754, ceea ce înseamnă că vom câștiga .059754 biți de informații prin împărțirea setului nostru de date pe „potato_salad?”variabilă / coloană. Câștigul nostru de informații este scăzut, dar este încă pozitiv, deoarece am redus entropia din partea stângă a diviziunii.

acum trebuie să repetăm acest proces pentru fiecare coloană pe care o folosim. În loc de a face acest lucru de mână să scrie unele cod Python.

împachetând totul cu Python

acum că înțelegem câștigul de informații, avem nevoie de o modalitate de a repeta acest proces pentru a găsi variabila / coloana cu cel mai mare câștig de informații. Pentru a face acest lucru, putem crea câteva funcții simple în Python.

Importarea datelor

să transformăm tabelul de mai sus într-un cadru de date folosind biblioteca Panda Python. Vom importa panda și vom folosi funcția read_csv () pentru a crea un cadru de date numit „midwest”.

import pandas as pd
midwest = pd.read_csv('midwes.csv')

o funcție Python pentru entropie

pentru această funcție, vom avea nevoie de Biblioteca NumPy pentru a utiliza funcția bincount() și modulul math pentru a utiliza funcția log ().

import numpy
import math

în continuare, vom defini funcția noastră cu un singur parametru. Argumentul dat va fi seria, lista sau matricea NumPy în care încercăm să calculăm entropia.

def calc_entropy(column):

va trebui să găsim procentul fiecărui caz în coloană. Putem folosi numpy.bincount () funcție pentru acest. Valoarea returnată este o matrice NumPy care va stoca numărul de fiecare valoare unică din coloana care a fost trecut ca un argument.

counts = numpy.bincount(column)

vom stoca probabilitățile fiecărei valori unice împărțind matricea „contează” la lungimea coloanei.

probabilities = counts / len(column)

putem apoi să inițializăm o variabilă numită „entropie” și să o setăm la 0.

entropy = 0

apoi, putem folosi un „For loop” pentru a parcurge fiecare probabilitate din matricea noastră de probabilități și a o înmulți cu baza logaritmică 2 a probabilității folosind matematica.log () funcție. Apoi, adăugați fiecare caz la variabila noastră de entropie stocată. * asigurați-vă că pentru a verifica probabilitatea este mare decât 0 altfel log(0) va reveni nedefinit

for prob in probabilities:
if prob > 0:
endtropy += prob * math.log(prob,2)

În cele din urmă, vom reveni variabila noastră entropie negată.

return -entropy

toate împreună acum:

mare! Acum putem construi o funcție pentru a calcula câștigul de informații.

o funcție Python pentru câștigul de informații

va trebui să definim o funcție care va avea trei parametri, unul pentru întregul set de date, unul pentru numele coloanei pe care dorim să o împărțim și unul pentru numele coloanei noastre țintă.

def calc_information_gain(data, split_name, target_name):

apoi, putem folosi funcția entropie de mai devreme pentru a calcula entropia originală a coloanei noastre țintă.

orginal_entropy = calc_entropy(data)

acum trebuie să ne împărțim coloana.

*pentru acest exemplu vom folosi doar variabilele / coloanele cu două unice. Dacă doriți să împărțiți pe o variabilă / coloană, cum ar fi „vârsta”, există mai multe moduri de a face acest lucru. O modalitate este de a împărți fiecare valoare unică. O altă modalitate este de a simplifica calculul câștigului de informații și de a simplifica împărțirea prin faptul că nu se împarte pentru fiecare valoare unică. În schimb, mediana se găsește pentru variabila / coumn fiind împărțită pe. Orice rânduri în care valoarea variabilei este sub mediană vor merge la ramura stângă, iar restul rândurilor vor merge la ramura dreaptă. Pentru a calcula câștigul de informații, va trebui să calculăm entropiile doar pentru două subseturi. Nu vom merge prin această metodă, dar odată ce împărțirea pe mediană este efectuată, restul pașilor ar fi aceiași cu cei descriși mai jos.

deoarece coloanele cu care lucrăm au doar două valori unice, vom face o împărțire la stânga și o împărțire la dreapta.

vom începe prin a folosi urșii panda.Serie.unique () pentru a ne oferi o matrice a valorilor unice din coloana

values = data.unique()

în continuare, vom crea o împărțire stânga și dreapta folosind „valori”.

left_split = data == values]
right_split = data == values]

acum putem iniția o variabilă pentru a scădea din entropia noastră inițială.

to_subtract = 0

apoi vom itera prin fiecare subset creat de împărțirea noastră, vom calcula probabilitatea subsetului și apoi vom adăuga produsul probabilității și entropia coloanei țintă a subseturilor.

for subset in :
prob = (subset.shape / data.shape)
to_subtract += prob * calc_entropy(subset)

În cele din urmă, putem returna diferența de to_subract fiind scăzută din entropia originală.

return original_entropy - to_subtract

întreaga funcție este mai jos.

o funcție Python pentru cel mai mare câștig de informații

funcția noastră finală va fi una care va returna numele variabilei / coloanei cu cel mai mare câștig de informații.așa cum am menționat mai devreme, folosim doar coloanele cu două valori unice pentru acest exemplu. Vom stoca aceste nume de coloane într-o listă de utilizat în funcție. Pentru a ajunge la punctul în care vom codifica acest lucru pentru acest exemplu, dar într-un set de date mare, ar fi mai bine să scrieți cod pentru a construi această listă dinamic pe baza criteriilor pe care le folosim pentru a alege coloanele.

columns = 

să înfășurăm ultimul pas într-o funcție, astfel încât să o putem reutiliza după cum este necesar. Va avea un parametru, lista coloanelor pentru care dorim să găsim cel mai mare câștig de informații.

def highest_info_gain(columns):

vom intializa un dicționar gol pentru a stoca câștigurile noastre de informații.

information_gains = {}

și apoi putem itera prin lista de coloane și stoca rezultatul în dicționarul nostru information_gains.

for col in columns:
information_gain = calc_information_gain(midwest, col, 'midwest?)
information_gains = information_gain

În cele din urmă, putem returna cheia cu cea mai mare valoare din dicționarul nostru.

return max(information_gains, key=information_gains.get)

toate împreună acum:

odată ce executăm funcția noastră finală

print(highest_info_gain(midwest, columns, 'midwest?'))
//sushi

vedem variabila/coloana cu cel mai mare câștig de informații este ‘sushi?’.

putem vizualiza o scindare pe sushi mai jos:

împărțirea setului nostru de date pe coloana sushi

împărțirea noastră stângă are două persoane din șase din Midwest. Partea dreaptă are opt din cele nouă persoane din midwest. Aceasta a fost o divizare eficientă și a redus entropia noastră pe ambele părți. Dacă ar fi să continuăm, am folosi recursivitatea pentru a continua Să împărțim fiecare divizare cu scopul de a încheia fiecare ramură cu o entropie de zero.

concluzie

arborii de decizie pot fi un algoritm util de învățare automată pentru a detecta interacțiunile neliniare dintre variabilele din date. În acest exemplu, am analizat etapele de început ale unui algoritm de clasificare a arborelui decizional. Apoi am analizat trei concepte ale teoriei informației, entropia, bitul și câștigul de informații. Folosind aceste concepte am reușit să construim câteva funcții în Python pentru a decide care variabile/coloane au fost cele mai eficiente de împărțit. Cu o înțelegere fermă asupra acestor concepte, putem merge mai departe pentru a construi un arbore de decizie.

Lasă un răspuns

Adresa ta de email nu va fi publicată.