Entropie a Informační Zisk v Rozhodovací Stromy

Foto AbsolutVision na Unsplash

jaká kritéria by měl algoritmus rozhodovacího stromu použít k rozdělení proměnných / sloupců?

před vytvořením algoritmu rozhodovacího stromu je prvním krokem odpověď na tuto otázku. Podívejme se na jeden ze způsobů, jak odpovědět na tuto otázku. K tomu budeme muset pochopit použití několik klíčových pojmů z teorie informací.

podívejme se na tuto metodu následujícími kroky:

  1. podívejme se velmi stručně na to, co je rozhodovací strom.
  2. Definujte a prozkoumejte vzorec pro entropii.
  3. diskutujte o tom, co je trochu v teorii informací.
  4. Definujte informační zisk a pro jeho výpočet použijte entropii.
  5. napište některé základní funkce Pythonu pomocí výše uvedených konceptů.

v datové vědě je algoritmus rozhodovacího stromu kontrolovaným algoritmem učení pro klasifikační nebo regresní problémy. Naším konečným cílem je použít Historická data k předpovědi výsledku. Na rozdíl od lineární regrese mohou rozhodovací stromy zachytit nelineární interakce mezi proměnnými v datech.

podívejme se na velmi jednoduchý rozhodovací strom. Níže je pracovní postup, který lze použít k rozhodnutí o tom, zda jíst arašídové máslo cookie.

rozhodovací strom příklad o tom, zda nebo ne jíst cookie

V tomto příkladu rozhodovací strom můžete vyzvednout na skutečnost, že byste měli jen jíst cookie, pokud jsou splněna určitá kritéria. To je konečný cíl rozhodovacího stromu. Chceme dál rozhodovat (rozdělovat), dokud nebudou splněna určitá kritéria. Jakmile se setkáme, můžeme jej použít ke klasifikaci nebo předpovědi. Tento příklad je velmi jednoduchý pomocí pouze dvou proměnných (alergie, ničí večeři). Ale pokud máte datovou sadu s tisíci proměnných / sloupců, jak se rozhodnete, které proměnné / sloupce jsou nejúčinnější rozdělit na? Populární způsob, jak tento problém vyřešit, zejména pokud používáte algoritmus ID3, je použití entropie a získávání informací.

Úkol

řekněme, že máme nějaká data a chceme ji použít, aby se on-line kvíz, který předpovídá něco o kvíz příjemce. Po pohledu na vztahy v datech jsme se rozhodli použít algoritmus rozhodovacího stromu. Pokud jste nikdy nebyli vtaženi do online kvízu, můžete zde vidět stovky příkladů. Cílem kvízu bude odhadnout, zda je příjemce kvízu z jednoho z amerických států Středozápadu. Otázky v kvízu se budou točit kolem toho, zda mají rádi určitý druh jídla nebo ne. Níže je malý fiktivní datový soubor s patnácti záznamy. Každá položka obsahuje odpovědi na řadu otázek. Většina otázek se týká toho, zda se jim líbil určitý druh jídla,ve kterém účastník prozatím odpověděl (1) ano nebo (0). Poslední sloupec („midwest?“) je náš cílový sloupec, což znamená, že jakmile je strom rozhodnutí postaven, jedná se o klasifikaci, kterou se snažíme uhodnout.

Entropie

Do začátku budeme používat informační teorie metrických nazývá entropie. V datové vědě se entropie používá jako způsob měření toho, jak je sloupec „smíšený“. Konkrétně se entropie používá k měření poruchy. Začněme tím, že najdeme entropii našeho cílového sloupce, “ midwest?”.

Náš cíl sloupec, „midwest?“

Tam jsou deset lidí, kteří žijí na středozápadě a pět lidí, kteří nemají. Pokud se někdo chce zeptat, jak se mísí sloupci je, můžete říct, že to bylo trochu smíšené, s většinou(2/3), lidi ze středozápadu. Entropie nám dává způsob, jak kvantifikovat odpověď „druh smíšené“. Čím více smíšených (1)s a (0)s ve sloupci jsou, tím vyšší je entropie. Pokud “ midwest?“kdyby bylo stejné množství (1) s A (0) s, naše entropie by byla 1. Pokud “ midwest?“sestával pouze z (1)s entropie by byla 0.

můžeme použít následující vzorec pro výpočet entropie:

vzorec pro entropii

Pojďme projít každý krok vzorec a výpočet entropie pro „midwest?” sloupec.

  1. musíme iterovat každou jedinečnou hodnotu v jednom sloupci a přiřadit ji i. Pro tento příklad máme 2 případy (c) na “ Středozápadě?“sloupec buď (0) nebo (1).
  2. pak vypočítáme pravděpodobnost výskytu této hodnoty v datech. Pro případ (1) je pravděpodobnost 10/15. Pro případ (0) je pravděpodobnost 5/15.
  3. vezmeme pravděpodobnost každého případu a vynásobíme ji logaritmickou základnou 2 pravděpodobnosti. 2 je nejběžnější báze, protože entropie se měří v bitech (více o tom později). Úplné vysvětlení, proč se 2 používá, je mimo rozsah tohoto příspěvku, ale uživatel na stack exchange nabízí dobré vysvětlení. Pro případ(1) dostaneme 10/15 * log2 (10/15). Pro případ (0) dostaneme 5/15 * log2 (5/15).
  4. dále vezmeme náš produkt z každého výše uvedeného případu a shrneme jej dohromady. Pro tento příklad 10/15 * log2 (10/15) + 5/15 * log2 (5/15).
  5. nakonec negujeme celkovou částku shora, — (10/15*log2(10/15) + 5/15*log2(5/15)).

Jakmile jsme dali takto dohromady dostaneme níže:

Naše konečná entropie je .918278. Co to vlastně znamená?

teorie informací a trochu informací

v pohybu vpřed bude důležité pochopit pojem bit. V teorii informace je bit považován za binární číslo představující 0 pro žádnou informaci a 1 pro úplnou informaci. Můžeme reprezentovat trochu informace jako binární číslo, protože má buď hodnotu (1) nebo (0). Předpokládejme, že je stejná pravděpodobnost, že zítra prší (1) nebo neprší(0). Když vám řeknu, že zítra bude pršet, dal jsem vám jednu informaci.

entropii můžeme také považovat za informaci. Předpokládejme, že máme nabitou šestistrannou matrici, která vždy přistane na (3). Pokaždé, když hodíme matrici, víme předem, že výsledek bude (3). Válcováním matrice nezískáme žádné nové informace, takže entropie je 0. Na druhou stranu, v případě, že matrice je daleko a my valit (3) tam byl 1/6 šance v válcování (3). Nyní jsme získali informace. Tím pádem, válcování matrice nám dává jednu informaci-na které straně číslo přistálo.

pro hlubší ponor do konceptu trochu informací si můžete přečíst více zde.

získáme méně než jeden „bit“ pouze informací .918278-protože existuje více (1)s v „midwest?“sloupec než (0)s. To znamená, že pokud bychom předpovídali novou hodnotu, mohli bychom odhadnout, že odpověď je (1)a mít pravdu častěji než špatně (protože existuje pravděpodobnost 2/3 odpovědi 1). Díky těmto předchozím znalostem získáváme méně než plný “ bit “ informací, když pozorujeme novou hodnotu.

pomocí entropie k rozhodování

Naším cílem je najít nejlepší proměnnou(y)/sloupec(Y), které se rozdělí při vytváření rozhodovacího stromu. Nakonec chceme rozdělit proměnné / sloupce, dokud náš smíšený cílový sloupec již nebude smíchán.

podívejme se například na entropii “ Středozápadu?“sloupec poté, co jsme rozdělili naši datovou sadu na“ potato_salad?” sloupec.

rozdělit na „potato_salad?“sloupec

naše datová sada je rozdělena do dvou částí. Na levé straně každý, kdo má rád bramborový salát. Na pravé straně každého, kdo nemá. Naplníme soustředit na levé straně, která má nyní sedm lidí ze středozápadu a dva lidé, kteří nejsou. Pomocí vzorce pro entropii na levé rozdělit středozápadě sloupci nový je entropie .764204. To je skvělé! Naším cílem je snížit entropii a šli jsme od .918278 až .764204. Ale nemůžeme se tam zastavit, když se podíváme na pravý sloupec, naše entropie stoupla, protože existuje stejné množství (1) s a (0) s. potřebujeme způsob, jak zjistit, jak se entropie mění na obou stranách rozdělení. Vzorec pro získání informací to udělá. Dává nám číslo, abychom kvantifikovali, kolik bitů informací jsme získali pokaždé, když rozdělíme naše data.

informační zisk

dříve jsme zjistili, že chceme rozdělení, která snižují entropii našeho cílového sloupce. Když jsme se rozdělili na “ potato_salad?“viděli jsme tu entropii na Středozápadě?“šel dolů na levé straně. Nyní musíme pochopit celkovou entropii sníženou, když se podíváme na obě strany rozdělení. Pojďme se podívat na informační zisk.

informační zisk použije následující vzorec:

řekněme, rozpis, co se děje tady.

vrátíme se k našemu “ potato_salad?” příklad. Proměnné ve výše uvedeném vzorci budou představovat následující:

  • T = cíl, náš “ Středozápad?“sloupec
  • a = proměnná (sloupec), kterou testujeme,“ potato_salad?“
  • v = každá hodnota v a, každá hodnota v „potato_salad?“sloupec
  1. nejprve vypočítáme původní entropii pro (T) před rozdělením , .918278
  2. Pak, pro každou jedinečnou hodnotu (v), v ‚ (A), budeme počítat počet řádků v které (A) má na hodnotu (v), a vydělte celkový počet řádků. Pro “ potato_salad?“sloupec dostaneme 9/15 pro jedinečnou hodnotu (1) a 6/15 pro jedinečnou hodnotu (0).
  3. dále vynásobíme výsledky entropií řádků, kde (a) je (v). Pro levé rozdělení (rozdělit na 1 pro “ potato_salad?“) dostaneme 9/15 * .764204. Pro pravou stranu rozdělení (rozdělit na 0 pro “ potato_salad?“) dostaneme 6/15 * 1.
  4. přidáme všechny tyto podmnožinové produkty dohromady, 9/14*.764204 + 6/15 = .8585224.

5. Pak odečteme od celkové entropie získat informace zisk,.918278 -.8585224 = .059754

náš informační zisk je .059754. Co nám to říká?

zde je alternativní vysvětlení. Zjišťujeme entropii každé množiny po rozdělení, vážíme ji počtem položek v každém rozdělení, pak odečteme od současné entropie. Pokud je výsledek pozitivní, snížili jsme entropii s naším rozdělením. Čím vyšší je výsledek, tím více jsme snížili entropii.

skončíme .059754, což znamená, že získáme .059754 bitů informací rozdělením naší datové sady na “ potato_salad?“proměnná / sloupec. Náš informační zisk je nízký, ale stále je pozitivní, protože jsme snížili entropii na levé straně rozdělení.

nyní musíme tento proces opakovat pro každý sloupec, který používáme. Místo toho, abychom to udělali ručně, pojďme napsat nějaký kód Pythonu.

zabalení vše s Pythonem

Nyní, když chápeme informační zisk, potřebujeme způsob, jak tento proces opakovat, abychom našli proměnnou / sloupec s největším informačním ziskem. K tomu můžeme v Pythonu vytvořit několik jednoduchých funkcí.

Import dat

Přeměňme naši výše uvedenou tabulku na datový rámec pomocí knihovny Python pandas. Importujeme pandy a pomocí funkce read_csv () vytvoříme datový rám s názvem „midwest“.

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

Python Funkce pro Entropii

Pro tuto funkci, budeme potřebovat knihovna NumPy používat bincount funkce() a math modul použít log() funkce.

import numpy
import math

dále definujeme naši funkci jedním parametrem. Uvedeným argumentem bude řada, seznam nebo NumPy pole, ve kterém se snažíme vypočítat entropii.

def calc_entropy(column):

budeme muset najít procento každého případu ve sloupci. Můžeme použít numpy.bincount () funkce pro toto. Návratová hodnota je NumPy pole, které uloží počet každé jedinečné hodnoty ze sloupce, který byl předán jako argument.

counts = numpy.bincount(column)

pravděpodobnosti každé jedinečné hodnoty uložíme vydělením pole „počty“ délkou sloupce.

probabilities = counts / len(column)

pak můžeme inicializovat proměnnou s názvem „entropie“ a nastavit ji na 0.

entropy = 0

Next, můžeme použít „pro smyčce“ procházet každý pravděpodobnost v našem pravděpodobnosti pole a vynásobte to logaritmus o základu 2 pravděpodobnosti pomocí matice.log () funkce. Poté přidejte každý případ k naší uložené proměnné entropie. *ujistěte se, zkontrolujte, zda vaše pravděpodobnost je velká, než jinak 0 log(0) vrátí undefined

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

Konečně, vrátíme naše negoval entropie proměnné.

return -entropy

Všechny dohromady teď:

Skvěle! Nyní můžeme vytvořit funkci pro výpočet zisku informací.

Python Funkce pro Informace Získat

Musíme definovat funkci, která bude mít tři parametry, jeden pro celý dataset, jeden pro název sloupce, který chceme rozdělit, a jeden pro jméno našeho cílového sloupce.

def calc_information_gain(data, split_name, target_name):

dále můžeme použít funkci entropie z dřívějších pro výpočet původní entropie našeho cílového sloupce.

orginal_entropy = calc_entropy(data)

nyní musíme rozdělit náš sloupec.

*pro tento příklad použijeme pouze proměnné / sloupce se dvěma jedinečnými. Pokud chcete rozdělit na proměnnou / sloupec, například „věk“, existuje několik způsobů, jak to udělat. Jedním ze způsobů je rozdělit na každou jedinečnou hodnotu. Dalším způsobem je zjednodušit výpočet informačního zisku a zjednodušit rozdělení tím, že se nerozděluje pro každou jedinečnou hodnotu. Místo toho je medián nalezen pro proměnnou/coumn, která je rozdělena na. Všechny řádky, kde je hodnota proměnné pod mediánem, přejdou do levé větve a zbytek řádků přejde do pravé větve. Pro výpočet informačního zisku budeme muset vypočítat entropie pouze pro dvě podmnožiny. Nebudeme procházet touto metodou, ale jakmile se provede rozdělení na medián, zbytek kroků by byl stejný, jak je uvedeno níže.

protože sloupce, se kterými pracujeme, mají pouze dvě jedinečné hodnoty, uděláme levý a pravý split.

začneme použitím pand.Série.unikátní (), aby nám řadu jedinečných hodnot ve sloupci,

values = data.unique()

Next, budeme vytvářet levé a pravé rozdělit pomocí „hodnot“.

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

Nyní můžeme iniciovat proměnnou odečíst z naší původní entropie.

to_subtract = 0

Pak se budeme iterovat přes jednotlivé podskupiny vytvořené našimi rozdělit, spočítat pravděpodobnost, podmnožina, a pak přidat produkt pravděpodobnosti a podskupin cíl sloupec je entropie.

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

nakonec můžeme vrátit rozdíl to_subract odečtený od původní entropie.

return original_entropy - to_subtract

celá funkce je níže.

Python Funkce pro Nejvyšší Informační Zisk

Naše konečná funkce bude ten, který se vrátí proměnná/název sloupce s nejvyšší informační zisk.

jak již bylo zmíněno, pro tento příklad používáme pouze sloupce se dvěma jedinečnými hodnotami. Tyto názvy sloupců uložíme do seznamu, který budeme používat ve funkci. Se dostaneme do bodu budeme tvrdě kód pro tento příklad, ale ve velkém souboru dat, to by bylo nejlepší psát kód pro sestavení tohoto seznamu dynamicky na základě kritérií používáme vybrat sloupce.

columns = 

zabalme poslední krok do funkce, abychom ji mohli znovu použít podle potřeby. Bude mít jeden parametr, seznam sloupců, pro které chceme najít nejvyšší informační zisk.

def highest_info_gain(columns):

intializujeme prázdný slovník pro uložení našich informačních zisků.

information_gains = {}

a pak můžeme iterovat seznam sloupců a výsledek uložit do našeho slovníku information_gains.

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

nakonec můžeme vrátit klíč nejvyšší hodnoty v našem slovníku.

return max(information_gains, key=information_gains.get)

Všechny dohromady teď:

Jakmile jsme se spustit náš poslední funkci,

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

vidíme, že proměnné nebo sloupec s nejvyšší informační zisk je ‚sushi?’.

můžeme představit rozdělenou na sushi níže:

Rozdělení náš dataset na sushi sloupec

Naše levé rozdělení má dva lidé, šest ze středozápadu. Správné rozdělení má osm z devíti lidí ze Středozápadu. Toto bylo efektivní rozdělení a snížilo naši entropii na obou stranách. Pokud bychom měli pokračovat, použili bychom rekurzi k udržení rozdělení každého rozdělení s cílem ukončit každou větev entropií nula.

Závěr

Rozhodovací stromy mohou být užitečné strojového učení algoritmus, aby vyzvednout nelineární interakce mezi proměnnými v datech. V tomto příkladu jsme se podívali na počáteční fáze algoritmu klasifikace rozhodovacího stromu. Poté jsme se podívali na tři koncepty teorie informace, entropii, bit a informační zisk. Pomocí těchto konceptů jsme byli schopni vytvořit několik funkcí v Pythonu rozhodnout, které proměnné / sloupce byly nejúčinnější rozdělit na. S pevným pochopením těchto konceptů můžeme pokročit v budování rozhodovacího stromu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.