entropia ja Informaatiovoitto päätöksissä

div>

photo by Absolutvision on Unsplash

mitä kriteereitä päätöksentekoalgoritmin tulisi käyttää muuttujien / sarakkeiden jakamiseen?

ennen päätöksentekopuualgoritmin rakentamista on vastattava tähän kysymykseen. Katsotaanpa katsomaan yksi tapa vastata tähän kysymykseen. Tehdä niin meidän täytyy ymmärtää käyttää muutamia keskeisiä käsitteitä informaatioteoria.

Tarkastellaanpa tätä menetelmää seuraavin askelin:

  1. Tarkastellaanpa hyvin lyhyesti, mikä on Ratkaisupuu.
  2. Määrittele ja tutki entropian kaavaa.
  3. keskustele siitä, mitä bitti on informaatioteoriassa.
  4. Määrittele Informaatiovoitto ja käytä entropiaa sen laskemiseen.
  5. kirjoittaa joitakin Pythonin perusfunktioita käyttäen yllä olevia käsitteitä.

datatieteessä ratkaisupuun algoritmi on luokitus-tai regressio-ongelmien ohjattu oppimisalgoritmi. Päämäärämme on käyttää historiatietoja tuloksen ennustamiseen. Toisin kuin lineaarinen regressio, päätöksentekopuut voivat poimia muuttujien välisiä epälineaarisia vuorovaikutuksia aineistosta.

katsotaan hyvin yksinkertaista ratkaisupuuta. Alla on työnkulku, jonka avulla voi tehdä päätöksen siitä, syökö maapähkinävoi-evästeen vai ei.

ratkaisupuu esimerkki siitä, onko tai evästeen syömättä jättäminen

tässä esimerkissä päätöksentekopuu voi poimia sen, että eväste kannattaa syödä vain, jos tietyt kriteerit täyttyvät. Tämä on ratkaisupuun perimmäinen tavoite. Haluamme jatkaa päätösten tekemistä (jakoa), kunnes tietyt kriteerit täyttyvät. Kun olemme tavanneet, Voimme käyttää sitä luokitteluun tai ennustamiseen. Tämä esimerkki on hyvin yksinkertainen käyttäen vain kahta muuttujaa (allergia, pilata illallinen). Mutta, jos sinulla on tietojoukko tuhansia muuttujia / sarakkeita miten päätät mitkä muuttujat / sarakkeet ovat tehokkaimpia jakaa? Suosittu tapa ratkaista tämä ongelma, varsinkin jos käytetään ID3-algoritmia, on käyttää entropiaa ja tiedonhankintaa.

tehtävä

sanotaan, että meillä on tietoa ja haluamme käyttää sitä nettivisan tekemiseen, joka ennustaa jotain tietovisan tekijästä. Tarkasteltuamme tietojen suhteita olemme päättäneet käyttää päätöspuun algoritmia. Jos et ole koskaan suivaantunut nettivisaan, voit katsoa satoja esimerkkejä täältä. Tietokilpailun tavoitteena on arvata, onko tietokilpailun ottaja jostain Amerikan keskilännen osavaltioista. Tietokilpailun kysymykset pyörivät sen ympärillä, pitävätkö he tietynlaisesta ruuasta vai eivät. Alla on pieni fiktiivinen aineisto, jossa on viisitoista merkintää. Jokainen merkintä on vastauksia useita kysymyksiä. Useimmat kysymykset koskevat, pitivätkö he tietyntyyppisestä ruoasta, johon osallistuja vastasi (1) kyllä vai (0) toistaiseksi. Viimeinen kolumni (”midwest?”) on meidän kohdesarakkeemme, eli kun päätöspuu on rakennettu, tätä luokittelua yritämme arvata.

entropia

päästäksemme alkuun käytämme informaatioteorian metriikkaa nimeltä entropia. Datatieteessä entropiaa käytetään keinona mitata, kuinka ”sekamuotoinen” kolonni on. Erityisesti entropiaa käytetään epäjärjestyksen mittaamiseen. Aloitetaan etsimällä kohdekolonnamme entropia: ”Keskilänsi?”.

kohdesarakkeemme ”midwest?”

on kymmenen ihmistä, jotka asuvat keskilännessä, ja viisi ihmistä, jotka eivät. Jos joku kysyisi, kuinka sekalainen palsta on, voisi sanoa, että se oli tavallaan sekalainen, ja enemmistö(2/3) keskilännen asukkaista. Entropia antaa meille tavan kvantifioida vastaus ”tavallaan sekoitettu”. Mitä enemmän sarakkeen (1)s ja (0)s sekoittuvat, sitä suurempi on entropia. Jos ” keskilännessä?”oli yhtä suuri määrä (1)s ja (0) S meidän entropia olisi 1. Jos ” keskilännessä?”koostui vain (1) s entropia olisi 0.

entropian laskemiseen voidaan käyttää seuraavaa kaavaa:

entropian kaava

käydään läpi kaavan jokainen vaihe ja lasketaan entropia ”keskilännelle?” sarake.

  1. meidän täytyy iteroida jokainen uniikki arvo yhteen sarakkeeseen ja antaa se I: lle. Tässä esimerkissä meillä on 2 tapausta (c) ” keskilännessä?”sarake, joko (0) tai (1).
  2. tämän jälkeen lasketaan todennäköisyys, että kyseinen arvo esiintyy aineistossa. Tapauksessa (1) todennäköisyys on 10/15. Tapauksessa (0) todennäköisyys on 5/15.
  3. otamme jokaisen tapauksen todennäköisyyden ja kerromme sen todennäköisyyden logaritmin kantaluvulla 2. 2 on yleisin perusta, koska entropia mitataan bitteinä(lisää siitä myöhemmin). Täydellinen selitys sille, miksi 2: ta käytetään, ei kuulu tämän viestin soveltamisalaan, mutta käyttäjä stack Exchangessa tarjoaa hyvän selityksen. Jos kyseessä on(1), saamme 10/15*log2(10/15). Jos kyseessä on (0), saamme 5/15*log2(5/15).
  4. seuraavaksi otamme tuotteemme jokaisesta yllä olevasta tapauksesta ja summaamme ne yhteen. Tässä esimerkissä 10/15 * log2(10/15) + 5/15*log2 (5/15).
  5. lopuksi kumotaan kokonaissumma ylhäältä, — (10/15*log2(10/15) + 5/15*log2(5/15)).

kun laitamme askeleet kaikki yhteen, saadaan seuraava:

/div>

lopullinen entropiamme on .918278. Mitä se tarkoittaa?

Informaatioteoria ja vähän tietoa

eteenpäin siirryttäessä on tärkeää ymmärtää bitin käsite. Informaatioteoriassa bitti käsitetään binääriluvuksi, joka edustaa 0: ta ilman informaatiota ja 1: tä täyttä informaatiobittiä. Voimme esittää jonkin verran tietoa binäärilukuna, koska sillä on joko arvo (1) tai (0). Oletetaan, että huomenna sataa yhtä todennäköisesti (1) tai ei sada(0). Jos kerron, että huomenna sataa, olen antanut teille yhden tiedon.

voimme ajatella entropiaa myös informaationa. Oletetaan, että meillä on ladattu kuusisivuinen die, joka laskeutuu aina (3). Joka kerta kun heitämme die, tiedämme etukäteen, että tulos on (3). Emme saa uutta tietoa rullaamalla kuolee, joten entropia on 0. Toisaalta, jos kuolee on kaukana ja me roll a (3) oli 1/6 mahdollisuus liikkuvan (3). Nyt olemme saaneet tietoa. Siten, rolling die antaa meille hieman tietoa-kummalle puolelle numero laskeutui.

syvempää sukellusta tietopalasen käsitteeseen voit lukea lisää täältä.

saamme vähemmän kuin yhden ”bitin” informaatiota — vain .918278 – koska on enemmän (1)s ”keskilännessä?”sarake kuin (0)s. Tämä tarkoittaa, että jos ennustamme uutta arvoa, voisimme arvata, että vastaus on (1) ja olla oikeassa useammin kuin väärässä (koska on olemassa 2/3 todennäköisyys, että vastaus on 1). Tämän ennakkotiedon ansiosta saamme vähemmän kuin täyden ”bitin” tietoa, kun havaitsemme uuden arvon.

käyttämällä entropiaa päätösten tekemiseen

tavoitteenamme on löytää paras muuttuja(s) / sarake(s), johon jakaa rakennettaessa ratkaisupuuta. Lopulta haluamme jatkaa muuttujien/sarakkeiden jakamista, kunnes sekoitettu kohdesarakkeemme ei ole enää sekoitettu.

tarkastellaan esimerkiksi ”keskilännen entropiaa?”sarake, kun olemme jakaneet tietomme” potato_salad?” sarake.

split on the ”potato_salad?”sarake

edellä, aineistomme on jaettu kahteen osaan. Vasemmalla kaikki, jotka pitävät perunasalaatista. Oikealla puolella kaikki, joilla ei ole. täytämme focus vasemmalla puolella, joka nyt on seitsemän ihmistä Keskilännestä ja kaksi ihmistä, jotka eivät ole. käyttämällä kaavaa entropia vasemmalla split keskilännen sarake Uusi entropia on .764204. Tämä on mahtavaa! Tavoitteemme on laskea entropiaa ja lähdimme siitä .918278 to .764204. Mutta, emme voi lopettaa siellä, jos katsomme oikea sarake meidän entropia nousi, koska on olemassa yhtä paljon (1)s ja (0)s. mitä tarvitsemme on tapa nähdä, miten entropia muuttuu molemmin puolin split. Tiedonhankintakaava tekee sen. Se antaa meille numeron, jolla voimme määrittää, kuinka monta bittiä tietoa olemme saaneet joka kerta, kun jaamme tietomme.

information Gain

aiemmin totesimme, että haluamme spagaatteja, jotka alentavat kohdesarakkeemme entropiaa. Kun eroamme ” potato_saladista?”näimme sen entropian” keskilännessä?”meni alas vasemmalta puolelta. Nyt on ymmärrettävä kokonais entropian aleneminen, kun tarkastellaan kahtiajaon molempia puolia. Katsotaanpa tietoja.

Information gain käyttää seuraavaa kaavaa:

eritellään, mitä täällä tapahtuu.

palaamme ”potato_saladiin?” esimerkiksi. Yllä olevan kaavan muuttujat edustavat seuraavaa:

  • T = Target, our ”midwest?”sarake
  • a = muuttuja (sarake), jota testaamme,” potato_salad?”
  • v = jokainen arvo A: ssa, jokainen arvo ” potato_saladissa?”sarake
  1. ensin lasketaan orginaalinen entropia (T): lle ennen jakoa , .918278
  2. tämän jälkeen lasketaan jokaiselle muuttujassa (a) olevalle yksilölliselle arvolle (v) rivien lukumäärä, jolla (A) ottaa arvon (v), ja jaetaan se rivien kokonaismäärällä. ”Potato_saladiin?”sarake saamme 9/15 for ainutlaatuinen arvo (1) ja 6/15 for ainutlaatuinen arvo (0).
  3. seuraavaksi kerrotaan tulokset niiden rivien entropialla, joissa (A) on (v). Vasemmalle jaetulle (jaetulle 1: lle ”potato_salad?”) saamme 9/15 * .764204. Jaon oikealle puolelle (Jaa 0: lle ”potato_salad?”) saamme 6/15 * 1.
  4. laskemme kaikki nämä osajoukon tuotteet yhteen, 9/14*.764204 + 6/15 = .8585224.

5. Me sitten vähentää yleisestä entropia saada tietoa voitto,.918278 -.8585224 = .059754

meidän informaatiovoitto on.059754. Mitä se kertoo?

tässä vaihtoehtoinen selitys. Löydämme jokaisen joukon entropian jakautumisen jälkeen,-painotamme sitä kunkin jaon alkioiden määrällä, – ja vähennämme sitten nykyisestä entropiasta. Jos tulos on positiivinen, olemme laskeneet entropiaa jaolla. Mitä korkeampi tulos on, sitä enemmän olemme laskeneet entropiaa.

päädymme siihen.059754, eli me voitamme .059754 bittiä tietoa jakamalla tietokokonaisuutemme ” potato_salad?”muuttuja / sarake. Informaatiomme on vähäistä, mutta se on silti positiivista, – mikä johtuu siitä, että laskimme entropiaa jaon vasemmalla puolella.

nyt tämä prosessi on toistettava jokaisen käyttämämme sarakkeen kohdalla. Sen sijaan, että teet tämän käsin, kirjoitetaan Python-koodia.

kaiken kääriminen Pythonilla

nyt kun ymmärrämme informaatiovahvistuksen, tarvitsemme tavan toistaa tätä prosessia löytääksemme muuttujan / sarakkeen, jolla on suurin informaatiovahvistus. Voit tehdä tämän, voimme luoda muutamia yksinkertaisia toimintoja Python.

Tietojen tuominen

muutetaan yllä oleva taulukko Datakehykseksi Pythonin pandas-kirjaston avulla. Tuomme pandoja maahan ja teemme read_csv () – funktion avulla datakehyksen nimeltä ”midwest”.

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

Python-funktio entropialle

tähän funktioon tarvitaan numpy-kirjasto bincount () – funktiota varten ja matematiikkamoduuli log () – funktiota varten.

import numpy
import math

seuraavaksi määrittelemme funktiomme yhdellä parametrilla. Annettu argumentti on sarja, lista tai NumPy array, jossa yritämme laskea entropiaa.

def calc_entropy(column):

jokaisen tapauksen prosenttiosuus on löydettävä sarakkeesta. Voimme käyttää numpya.bincount () funktio tälle. Return-arvo on NumPy array, joka tallentaa kunkin uniikin arvon määrän sarakkeesta, joka välitettiin argumenttina.

counts = numpy.bincount(column)

Tallennamme jokaisen yksilöllisen arvon todennäköisyydet jakamalla ”counts” – joukon sarakkeen pituudella.

probabilities = counts / len(column)

voimme sitten alustaa muuttujan nimeltä ”entropia” ja asettaa sen arvoon 0.

entropy = 0

seuraavaksi Voimme käyttää ”for Loopia” silmukoidaksemme jokaisen todennäköisyysjoukkomme todennäköisyyden läpi ja kertoaksemme sen todennäköisyyslaskennan logaritmin kantaluvulla 2 käyttäen matematiikkaa.loki () – funktio. Sitten, lisää jokainen tapaus meidän tallennettu entropia muuttuja. * muista tarkistaa, että todennäköisyytesi on suuri kuin 0 muuten log(0) palaa määrittelemättömänä

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

lopuksi palautamme negatoidun entropiamuuttujan.

return -entropy

All together now:

Great! Nyt voimme rakentaa funktion, jolla voimme laskea tiedonlisäystä.

Python-funktio tiedon saamiseksi

meidän on määriteltävä funktio, jolla on kolme parametria, Yksi koko aineistolle, yksi sen sarakkeen nimelle, johon haluamme jakaa, ja yksi kohdesarakkeemme nimelle.

def calc_information_gain(data, split_name, target_name):

seuraavaksi voidaan entropiafunktion avulla laskea kohdesarakkeemme alkuperäinen entropia.

orginal_entropy = calc_entropy(data)

nyt pitää jakaa sarake.

*tässä esimerkissä käytetään vain muuttujia / sarakkeita, joissa on kaksi uniikkia. Jos haluat jakaa muuttujan / sarakkeen, kuten ”ikä”, on olemassa useita tapoja tehdä tämä. Yksi tapa on jakaa jokainen ainutlaatuinen arvo. Toinen tapa on yksinkertaistaa tiedonsaannin laskemista ja tehdä jaottelusta yksinkertaisempaa jättämällä jakamatta jokaisen yksilöllisen arvon kohdalla. Sen sijaan mediaani löytyy muuttuja/coumn on jaettu. Kaikki rivit, joissa muuttujan arvo on mediaanin alapuolella, siirtyvät vasempaan haaraan ja loput riveistä oikeaan haaraan. Saadaksemme tietoa, meidän täytyy laskea entropioita vain kahdelle osajoukolle. Emme ole kävely läpi tätä menetelmää, mutta kun jako mediaani suoritetaan loput vaiheet olisi sama kuin alla.

koska sarakkeilla, joiden kanssa työskentelemme, on vain kaksi ainutlaatuista arvoa, teemme vasemman ja oikean jaon.

aloitamme pandojen avulla.Sarja.uniikki () antaa meille taulukon sarakkeeseen

values = data.unique()

seuraavaksi luodaan vasen ja oikea jako käyttäen ”arvoja”.

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

nyt voimme aloittaa muuttujan, joka vähentää alkuperäisestä entropiastamme.

to_subtract = 0

tämän jälkeen iteroimme jokaisen Jakamamme muodostaman osajoukon läpi, laskemme osajoukon todennäköisyyden ja lisäämme sitten todennäköisyyden tulon ja osajoukkojen kohdesarakkeen entropian.

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

lopuksi voidaan palauttaa to_subractin erotus, joka vähennetään alkuperäisestä entropiasta.

return original_entropy - to_subtract

koko funktio on alla.

Python-funktio, jolla saadaan suurin Informaatiovoitto

lopullinen funktiomme on sellainen, joka palauttaa muuttujan / sarakkeen nimen, jolla on suurin informaatiovoitto.

kuten aiemmin mainittiin, käytämme tässä esimerkissä vain sarakkeita, joilla on kaksi ainutlaatuista arvoa. Tallennamme sarakkeiden nimet funktiossa käytettävään luetteloon. Päästä pisteeseen me kova koodi tämän esimerkin, mutta suuri aineisto, se olisi parasta kirjoittaa koodia rakentaa tämän luettelon dynaamisesti perustuu kriteereihin käytämme valita sarakkeita.

columns = 

kääritään viimeinen vaihe funktioon, jotta voimme käyttää sitä tarpeen mukaan uudelleen. Siinä on yksi parametri, sarakkeiden luettelo, jonka haluamme löytää korkeimman informaatiovoiton.

def highest_info_gain(columns):

intialisoimme tyhjän sanakirjan tallentamaan informaatiovoittojamme.

information_gains = {}

ja sitten voimme iteroida sarakeluettelon läpi ja tallentaa tuloksen information_gains-sanakirjaamme.

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

lopuksi voidaan palauttaa sanakirjamme arvokkain avain.

return max(information_gains, key=information_gains.get)

All together now:

kun suoritamme lopullisen funktion

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

näemme muuttujan/sarakkeen suurin tiedonsaanti on ’sushi?’.

alla on nähtävissä jako sushiin:

figcaption>jakaa tietomme sushipalstalla

meidän vasemmanpuoleisessa jaossa on kaksi ihmistä kuudesta keskilännestä. Oikealla on kahdeksan yhdeksästä keskilännen asukkaasta. Tämä oli tehokas jako ja laski entropiaamme molemmin puolin. Jos meidän pitäisi jatkaa, käyttäisimme rekursio pitää halkaisu kunkin split tavoitteena lopettaa jokaisen haaran kanssa entropia nolla.

johtopäätös

Päätöksentekoalgoritmi voi olla hyödyllinen koneoppimisen algoritmi poimimaan muuttujien välisiä epälineaarisia vuorovaikutuksia aineistosta. Tässä esimerkissä tarkastelimme päätöksentekoalgoritmin alkuvaiheita. Tämän jälkeen tarkastelimme kolmea informaatioteorian käsitettä, entropiaa, bittiä ja informaation saantia. Näiden käsitteiden avulla pystyimme rakentamaan muutaman funktion Pythoniin päättämään, mitkä muuttujat / sarakkeet olivat tehokkaimpia jaettavaksi. Näiden käsitteiden lujalla otteella voimme edetä päätöksentekopuun rakentamiseksi.

Vastaa

Sähköpostiosoitettasi ei julkaista.