bontsuk le, mi folyik itt.
visszatérünk a ” potato_salad?”példa. A fenti képletben szereplő változók a következőket képviselik:
T = cél, a mi ” középnyugatunk?”column
a = az általunk tesztelt változó(oszlop), “potato_salad?”
v = minden érték A, minden érték a ” potato_salad?”oszlop
először kiszámítjuk a (T) eredeti entrópiáját a felosztás előtt , .918278
ezután az (A) változó minden egyes egyedi értékéhez (v) kiszámítjuk azon sorok számát, amelyekben (A) felveszi az (v) értéket, és elosztjuk a sorok teljes számával. A ” potato_salad?”oszlop 9/15-öt kapunk az (1) egyedi értékére és 6/15-öt a (0) egyedi értékére.
ezután megszorozzuk az eredményeket azon sorok entrópiájával, ahol (a) (v). A bal oldali felosztáshoz (1-re osztva a “potato_salad?”) 9/15 * – et kapunk .764204. A jobb oldalon a split (split 0 a ” potato_salad?”) 6/15 * 1-et kapunk.
ezeket a részhalmazokat együtt adjuk hozzá, 9/14*.764204 + 6/15 = .8585224.
5. Ezután kivonjuk a teljes entrópiából, hogy információt nyerjünk,.918278 -.8585224 = .059754
az információ nyereség .059754. Mit mond ez nekünk?
itt egy alternatív magyarázat. Megtaláljuk az egyes halmazok entrópiáját a felosztás után, súlyozva az egyes felosztások elemeinek számával, majd kivonva az aktuális entrópiából. Ha az eredmény pozitív, csökkentettük az entrópiát a megosztásunkkal. Minél magasabb az eredmény, annál inkább csökkentettük az entrópiát.
végül .059754, ami azt jelenti, hogy nyerünk .059754 bit információ az adatkészletünk felosztásával a ” potato_salad?”változó / oszlop. Az információnyereségünk alacsony, de még mindig pozitív, ami azért van, mert csökkentettük az entrópiát a hasadás bal oldalán.
most meg kell ismételnünk ezt a folyamatot minden használt oszlopnál. Ahelyett, hogy ezt kézzel csinálnánk, írjunk néhány Python kódot.
az egészet a Python
most, hogy megértjük az információnyereséget, meg kell ismételnünk ezt a folyamatot, hogy megtaláljuk a változót/oszlopot a legnagyobb információnyereséggel. Ehhez néhány egyszerű funkciót hozhatunk létre a Pythonban.
az Adatok importálása
alakítsuk át a fenti táblázatot Adatkeretté a Python pandas könyvtár segítségével. Importálni fogjuk a pandákat, és a read_csv () függvény segítségével létrehozunk egy “midwest”nevű Adatkeretet.
import pandas as pd midwest = pd.read_csv('midwes.csv')
az entrópia Python függvénye
ehhez a függvényhez szükségünk lesz a numpy könyvtárra a bincount() függvény használatához, a matematikai modulra pedig a log() függvény használatához.
import numpy import math
ezután meghatározzuk funkciónkat egy paraméterrel. A megadott argumentum az a sorozat, lista vagy NumPy tömb lesz, amelyben megpróbáljuk kiszámítani az entrópiát.
def calc_entropy(column):
meg kell találnunk az egyes esetek százalékos arányát az oszlopban. Használhatjuk a numpy-t.bincount () függvény erre. A visszatérési érték egy NumPy tömb, amely tárolja az egyes egyedi értékek számát az argumentumként átadott oszlopból.
counts = numpy.bincount(column)
az egyes egyedi értékek valószínűségeit úgy tároljuk, hogy a” counts ” tömböt elosztjuk az oszlop hosszával.
probabilities = counts / len(column)
ezután inicializálhatunk egy” entrópia ” nevű változót, és beállíthatjuk 0-ra.
entropy = 0
ezután használhatunk egy” for loop ” – ot a valószínűségi tömb minden valószínűségének hurokjához, és megszorozhatjuk a valószínűség 2 logaritmus alapjával a matematika segítségével.log () függvény. Ezután adja hozzá az egyes eseteket a tárolt entrópia változóhoz. * győződjön meg róla, hogy ellenőrizze a valószínűsége nagy, mint 0 egyébként log(0) vissza fog térni meghatározatlan
for prob in probabilities: if prob > 0: endtropy += prob * math.log(prob,2)
végül, akkor vissza a negált entrópia változó.
return -entropy
most együtt:
nagyszerű! Most építhetünk egy függvényt az információnyereség kiszámításához.
Python függvény az információszerzéshez
meg kell határoznunk egy függvényt, amely három paramétert tartalmaz, egyet a teljes adatkészlethez, egyet annak az oszlopnak a nevéhez, amelyre fel akarunk osztani, egyet pedig a céloszlopunk nevéhez.
def calc_information_gain(data, split_name, target_name):
ezután a korábbi entrópia függvényt használhatjuk a céloszlop eredeti entrópiájának kiszámításához.
orginal_entropy = calc_entropy(data)
most meg kell osztanunk az oszlopunkat.
* ebben a példában csak a két egyedi változót/oszlopot fogjuk használni. Ha meg szeretne osztani egy változót/oszlopot, például az “életkor”, ennek többféle módja van. Az egyik módja az, hogy minden egyedi értéket megosztunk. Egy másik módszer az információnyereség kiszámításának egyszerűsítése és a felosztások egyszerűbbé tétele azáltal, hogy nem osztjuk meg az egyes egyedi értékeket. Ehelyett a medián megtalálható a változó / kumn felosztására. Bármely sor, ahol a változó értéke a medián alatt van, a bal ágra, a többi sor pedig a jobb ágra kerül. Az információszerzés kiszámításához csak két részhalmazra kell kiszámolnunk az entrópiákat. Nem fogjuk végigjárni ezt a módszert, de ha a medián felosztása megtörténik, a többi lépés megegyezik az alább vázoltakkal.
mivel az oszlopoknak, amelyekkel dolgozunk, csak két egyedi értéke van, bal és jobb osztást készítünk.
kezdjük a pandák használatával.Sorozat.unique() az
values = data.unique()
oszlopban található egyedi értékek tömbjének megadásához ezután létrehozunk egy bal és jobb oldali felosztást az “értékek”használatával.
left_split = data == values] right_split = data == values]
most elindíthatunk egy változót, hogy kivonjuk az eredeti entrópiánkból.
to_subtract = 0
ezután végigmegyünk minden részhalmazon, amelyet a felosztásunk hoz létre, kiszámoljuk az részhalmaz valószínűségét, majd hozzáadjuk a valószínűség szorzatát és a részhalmazok céloszlopának entrópiáját.
for subset in : prob = (subset.shape / data.shape) to_subtract += prob * calc_entropy(subset)
végül visszaadhatjuk a to_subract különbségét az eredeti entrópiából.
return original_entropy - to_subtract
a teljes funkció alább található.
Python függvény A legnagyobb Információerősítéshez
végső függvényünk az lesz, amely a változó/oszlop nevét adja vissza a legnagyobb információerősítéssel.
mint korábban említettük, ebben a példában csak két egyedi értékkel rendelkező oszlopokat használunk. Ezeket az oszlopneveket egy listában tároljuk, amelyet a függvényben használhatunk. Ahhoz, hogy eljuthassunk arra a pontra, hogy ezt a példát keményen kódoljuk, de egy nagy adatkészletben a legjobb, ha kódot írunk, hogy ezt a listát dinamikusan építsük fel az oszlopok kiválasztásához használt kritériumok alapján.
columns =
csomagoljuk be az utolsó lépést egy függvénybe, hogy szükség szerint újra felhasználhassuk. Egy paramétere lesz, az oszlopok listája, amelyekhez a legmagasabb információnyereséget akarjuk megtalálni.
def highest_info_gain(columns):
majd intialize üres szótárban tárolja az információkat nyereség.
information_gains = {}
ezután végigjárhatjuk az oszlopok listáját, és az eredményt az information_gains szótárban tárolhatjuk.
for col in columns: information_gain = calc_information_gain(midwest, col, 'midwest?) information_gains = information_gain
végül visszaadhatjuk a szótárunk legmagasabb értékének kulcsát.
return max(information_gains, key=information_gains.get)
minden együtt most:
miután végre a végső funkció
print(highest_info_gain(midwest, columns, 'midwest?')) //sushi
látjuk a változó/oszlop a legnagyobb információnyereség a ‘sushi?’.
a sushi felosztását az alábbiakban vizualizálhatjuk:
>
adatkészletünk felosztása a sushi oszlopon a bal oldali felosztásunkban hatból két ember van a középnyugatról. A jobb megosztottság nyolc kilenc ember a midwest. Ez egy hatékony felosztás volt, és mindkét oldalon csökkentette az entrópiánkat. Ha folytatnánk, akkor a rekurziót használnánk az egyes felosztások felosztásának folytatására azzal a céllal, hogy minden ágat nulla entrópiával fejezzünk be.
következtetés
a döntési fák hasznos gépi tanulási algoritmus lehetnek az adatok változói közötti nemlineáris kölcsönhatások felvételére. Ebben a példában a döntési fa osztályozási algoritmus kezdeti szakaszait vizsgáltuk. Ezután három információelméleti fogalmat vizsgáltunk, az entrópiát, a bitet és az információnyerést. Ezeknek a fogalmaknak a felhasználásával képesek voltunk néhány függvényt felépíteni a Pythonban, hogy eldöntsük, mely változókat/oszlopokat lehet a leghatékonyabban felosztani. Ezeknek a fogalmaknak a határozott megértésével előreléphetünk egy döntési fa felépítésében.