Entrópia, valamint az Információs Nyereség a döntési Fák

Fotó: AbsolutVision a Unsplash

milyen kritériumokat kell használni a döntési fa algoritmusnak a változók / oszlopok felosztásához?

a döntési fa algoritmus felépítése előtt az első lépés a kérdés megválaszolása. Vessünk egy pillantást a kérdés megválaszolásának egyik módjára. Ehhez meg kell érteni a használat néhány kulcsfontosságú fogalmak információ elmélet.

vizsgáljuk meg ezt a módszert a következő lépések végrehajtásával:

  1. Vegyünk egy nagyon rövid pillantást arra, hogy mi a döntési fa.
  2. határozza meg és vizsgálja meg az entrópia képletét.
  3. beszéljétek meg, mi egy kicsit az információelméletben.
  4. határozza meg az Információnyereséget, és használja az entrópiát annak kiszámításához.
  5. írjon néhány alapvető Python funkciót a fenti fogalmak segítségével.

az adattudományban a döntési fa algoritmus felügyelt tanulási algoritmus osztályozási vagy regressziós problémákra. Végső célunk a történelmi adatok felhasználása az eredmény előrejelzésére. A lineáris regresszióval ellentétben a döntési fák nemlineáris kölcsönhatásokat tudnak felvenni az adatok változói között.

nézzünk egy nagyon egyszerű döntési fát. Az alábbiakban egy munkafolyamat, hogy lehet használni, hogy a döntést arról, hogy enni egy mogyoróvaj cookie.

döntési fa példa arra, hogy ne egyen sütit

ebben a példában egy döntési fa felveheti azt a tényt, hogy csak akkor szabad enni a sütit, ha bizonyos feltételek teljesülnek. Ez a döntési fa végső célja. Addig akarunk döntéseket hozni(felosztani), amíg bizonyos kritériumok nem teljesülnek. Miután találkoztunk, felhasználhatjuk osztályozásra vagy előrejelzésre. Ez a példa nagyon egyszerű, csak két változót használva (allergia, vacsora tönkretétele). De ha több ezer változót/oszlopot tartalmazó adatkészleted van, hogyan döntheted el, hogy mely változókat/oszlopokat lehet a leghatékonyabban felosztani? A probléma megoldásának népszerű módja, különösen, ha ID3 algoritmust használ, az entrópia és az információszerzés.

A feladat

tegyük fel, hogy van néhány adatunk, és azt szeretnénk használni, hogy egy online kvíz, amely előrejelzi valamit a kvíz elfogadó. Miután megnéztük az adatok kapcsolatait, úgy döntöttünk, hogy döntési fa algoritmust használunk. Ha még soha nem szívott be egy online kvízbe, itt több száz példát láthat. A kvíz célja annak kitalálása, hogy a kvíz elfogadó Amerika egyik középnyugati államából származik-e. A kvíz kérdései körül forognak, ha szeretnek egy bizonyos típusú ételt, vagy sem. Az alábbiakban egy kis kitalált adatkészlet található, tizenöt bejegyzéssel. Minden bejegyzés választ ad egy sor kérdésre. A legtöbb kérdés arról szól, hogy tetszett-e egy bizonyos típusú étel, amelyben a résztvevő (1) igennel vagy (0) – ra válaszolt. Az utolsó oszlop (“Középnyugat?”) a céloszlopunk, ami azt jelenti, hogy a döntési fa felépítése után ezt a besorolást próbáljuk kitalálni.

entrópia

az induláshoz az entrópia nevű információelméleti metrikát fogjuk használni. Az adattudományban az entrópiát használják annak mérésére, hogy egy oszlop mennyire “vegyes”. Pontosabban, az entrópiát a rendellenesség mérésére használják. Kezdjük azzal, hogy megtaláljuk a céloszlopunk entrópiáját, ” Középnyugat?”.

a cél oszlop,”midwest?”

tíz ember él a középnyugaton, és öt ember nem. Ha valaki azt kérdezné, mennyire vegyes az oszlop, akkor azt mondhatnánk, hogy vegyes volt, a középnyugati emberek többsége(2/3). Az entrópia módot ad arra, hogy számszerűsítsük a választ” egyfajta vegyes”. Minél vegyesebb az (1)S és (0) s az oszlopban, annál nagyobb az entrópia. Ha ” Középnyugat?”ha egyenlő mennyiségű (1)s és (0) s lenne, az entrópiánk 1 lenne. Ha ” Középnyugat?”csak (1)s-ból állt, az entrópia 0 lenne.

az entrópia kiszámításához a következő képletet használhatjuk:

az entrópia képlete

menjünk végig a képlet minden lépésén, és számítsuk ki a “Középnyugat?”oszlop.

  1. minden egyes egyedi értéket át kell ismételnünk egyetlen oszlopban, és hozzá kell rendelnünk az i-hez. Ebben a példában 2 esetünk van (c) a ” középnyugaton?”oszlop, vagy (0) vagy (1).
  2. ezután kiszámítjuk annak valószínűségét, hogy ez az érték előfordul az adatokban. Az (1) esetében a valószínűség 10/15. (0) esetén a valószínűség 5/15.
  3. minden eset valószínűségét megszorozzuk a valószínűség 2 logaritmus alapjával. A 2 a leggyakoribb alap, mert az entrópiát bitekben mérik (erről később). A 2 használatának teljes magyarázata nem tartozik a bejegyzés hatálya alá, de a stack exchange felhasználója jó magyarázatot kínál. Az(1) esetében 10/15*log2(10/15) értéket kapunk. A (0) esetében 5/15*log2(5/15) értéket kapunk.
  4. ezután minden fenti esetből vesszük a termékünket,és összegezzük. Ebben a példában 10/15*log2(10/15) + 5/15*log2(5/15).
  5. végül elutasítjuk a teljes összeget felülről — – (10/15*log2(10/15) + 5/15 * log2 (5/15)).

miután összeraktuk a lépéseket, az alábbiakat kapjuk:

végső entrópiánk .918278. Szóval, mit jelent ez valójában?

információelmélet és egy kis információ

előre haladva fontos lesz megérteni a bit fogalmát. Az információelméletben a bitet bináris számnak tekintik, amely 0-t jelent információ nélkül, az 1-et pedig teljes információ esetén. Egy kis információt bináris számként ábrázolhatunk, mert vagy értéke (1) vagy (0). Tegyük fel, hogy egyenlő a valószínűsége annak, hogy holnap esik (1) vagy nem esik(0). Ha azt mondom, hogy holnap esni fog, adtam neked egy kis információt.

az entrópiára mint információra is gondolhatunk. Tegyük fel, hogy van egy betöltött hatoldalas Szerszámunk, amely mindig a (3)-ra landol. Minden alkalommal, amikor dobjuk a kockát, előre tudjuk, hogy az eredmény (3) lesz. A szerszám gördítésével nem nyerünk új információt, tehát az entrópia 0. Másrészt, ha a szerszám messze van, és egy (3) – ot dobunk, akkor 1/6 esély volt a (3) gördülésére. Most információkat szereztünk. Így a szerszám gördítése egy kis információt ad nekünk-melyik oldalon landolt a szám.

egy mélyebb merülés a koncepció egy kis információt, akkor olvassa el többet itt.

kevesebb, mint egy “bit” információt kapunk — csak .918278-mert több (1) van a “középnyugaton?”oszlop, mint (0) s. ez azt jelenti, hogy ha új értéket jósolunk, akkor kitalálhatjuk, hogy a válasz (1), és gyakrabban igaza van, mint rossz (mert 2/3 valószínűsége van annak, hogy a válasz 1). Ennek az előzetes ismeretnek köszönhetően kevesebb, mint egy teljes “bit” információt nyerünk, amikor új értéket figyelünk meg.

az entrópia használata döntések meghozatalához

célunk, hogy megtaláljuk a legjobb változót/oszlopot, amelyre fel lehet osztani egy döntési fa felépítésekor. Végül meg akarjuk osztani a változókat/oszlopokat, amíg a vegyes céloszlopunk már nem keveredik.

például nézzük meg a “Középnyugat?”oszlop, miután megosztottuk adatkészletünket a” potato_salad?”oszlop.

split a”potato_salad?”column

fent az adatkészletünk két részre oszlik. A bal oldalon mindenki, aki szereti a burgonya salátát. A jobb oldalon mindenki, aki nem. töltjük fókusz a bal oldalon, amely most már hét ember a midwest és két ember, akik nem. segítségével a képlet entrópia a bal oldali osztott midwest oszlop az új entrópia .764204. Ez nagyszerű! Célunk az, hogy csökkentsük az entrópiát ,és elindultunk.918278 hogy .764204. De nem állhatunk meg itt, ha megnézzük a jobb oldali oszlopot, az entrópiánk felment, mivel egyenlő mennyiségű (1)s és (0)s van. Az információszerzés képlete ezt megteszi. Számot ad nekünk, hogy számszerűsítsük, hány bit információt szereztünk minden egyes alkalommal, amikor megosztjuk adatainkat.

információ nyereség

korábban megállapítottuk, hogy olyan felosztásokat akarunk, amelyek csökkentik a céloszlop entrópiáját. Amikor megosztjuk a ” potato_salad?”láttuk ezt az entrópiát a” középnyugaton?”lement a bal oldalon. Most meg kell értenünk a teljes entrópiát, amikor a felosztás mindkét oldalát nézzük. Vessünk egy pillantást az információszerzésre.

az információszerzés a következő képletet fogja használni:

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
  1. először kiszámítjuk a (T) eredeti entrópiáját a felosztás előtt , .918278
  2. 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.
  3. 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.
  4. 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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.