Co je Jeden Hot Kódování a Jak na To

Pokud jste do strojového učení, pak budete nevyhnutelně narazit na tuto věc s názvem „One Hot Kódování“. Nicméně, je to jedna z těch věcí, které jsou těžké pochopit jako začátečník strojového učení, protože si potřebuju vědět pár věcí o strojové učení pochopit. Pomoci, myslel jsem, že se pokusím poskytnout vysvětlení pro začátečníky.

první věc, kterou uděláte, když děláte jakýkoli druh programu strojového učení, je obvykle předběžné zpracování. Tím myslím přípravu dat, která budou analyzována vaším programem. Koneckonců, nemůžete jen hodit tabulku nebo nějaké obrázky do svého programu a očekávat, že bude vědět, co dělat. Na takové úrovni umělé inteligence ještě nejsme.

velká část předzpracování je něco kódování. To znamená reprezentovat každý kus dat způsobem, který počítač může pochopit, odtud název encode, což doslova znamená „převést na kód“. Existuje mnoho různých způsobů kódování, jako je kódování štítků, nebo jak byste mohli uhodnout, jedno horké kódování. Kódování štítků je intuitivní a snadno pochopitelné, takže to vysvětlím jako první. Doufejme, že odtud budete schopni plně porozumět jednomu horkému kódování.

předpokládejme, že pracujeme s kategorickými údaji, jako jsou kočky a psi. Při pohledu na název štítku kódování, můžete být schopni odhadnout, že to kóduje štítky, štítek, kde je jen kategorie (tj. kočka nebo pes), a enkódovat jen znamená, že je číslo představující tuto kategorii (1 kočka a 2 pro psa). Tím, že každé kategorii dáte číslo, počítač nyní ví, jak je reprezentovat, protože počítač ví, jak pracovat s čísly. A teď jsme již dokončili vysvětlování kódování štítků. Ale je tu problém, který často nefunguje pro kategorické údaje.

problém je v tom, že při kódování štítků mají Kategorie nyní přirozené uspořádané vztahy. Počítač to dělá, protože je naprogramován tak, aby zacházel s vyššími čísly jako s vyššími čísly; přirozeně dá vyšším číslům vyšší váhy. Problém s tím můžeme vidět na příkladu:

  • Představte si, že jste měli 3 kategorie potravin: jablka, kuře a brokolici. Pomocí kódování štítků byste každému z nich přiřadili číslo, které je bude kategorizovat: jablka = 1, kuře = 2 a brokolice = 3. Ale teď, pokud váš model interně potřebuje vypočítat průměr napříč kategoriemi, může to udělat 1+3 = 4/2 = 2. To znamená, že podle vašeho modelu je průměr jablek a kuřecího masa brokolice.

Samozřejmě, že linie myšlení tím, že váš model bude vést k získání korelací úplně špatně, takže musíme zavést one-hot kódování.

Spíše než označení věci jako číslo od 1 a pak se zvyšuje pro každou kategorii, půjdeme pro další binární styl kategorizace. Možná jste si mysleli, že pokud víte, co je one-hot (týká se binárního kódování ,ale nebojte se o to). Dovolte mi představit vizualizovaný rozdíl mezi štítkem a jedním horkým kódováním. Uvidíme, jestli můžete přijít na rozdíl:

Jaký je v tom rozdíl? Naše kategorie byly dříve řádky, ale teď jsou to sloupce. Naše Číselná proměnná, kalorie, však zůstala stejná. A 1 v konkrétním sloupci řekne počítači správnou kategorii pro data daného řádku. Jinými slovy, pro každou kategorii jsme vytvořili další binární sloupec.

není okamžitě jasné, proč je to lepší (kromě problému, který jsem zmínil dříve), a to proto, že neexistuje jasný důvod. Stejně jako mnoho věcí ve strojovém učení to nebudeme používat v každé situaci; není to úplně lepší než kódování štítků. Je to jen řeší problém, který se setkáte s kódováním štítků při práci s kategorickými daty

jeden Hot kódování v kódu (si to? Je to slovní hříčka)

vždy je užitečné vidět, jak se to dělá v kódu, takže udělejme příklad. Normálně pevně věřím, že bychom měli udělat něco bez knihoven, abychom se to naučili, ale jen pro tyto únavné předzpracování věci opravdu nepotřebujeme. Knihovny mohou dělat to tak jednoduché. Budeme používat numpy, sklearn a pandy, protože se ocitnete pomocí těchto knihoven 3 v mnoha vašich projektech

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd

Nyní, když máme nástroje, začněme. Budeme pracovat s vytvořeným datovým souborem. Zadejte datovou sadu pomocí pand .funkce read_csv:

dataset = pd.read_csv('made_up_thing.csv')

doufejme, že je to samozřejmé. Další je trochu složitější. Věc, o tabulkách je, že může nebo nemusí starat o některé sloupce. Pro jednoduchost řekněme, že nám záleží na všem kromě posledního sloupce. Použijeme funkci pand .iloc, který získá data v jakémkoli sloupci (sloupcích), kterým je řeknete:

X = dataset.iloc.values

.iloc se vlastně ujme, tak jsme zadali . Den: je to proto, že chceme všechny řádky v těchto sloupcích, a : je to jen způsob, jak to udělat. Přidáme .hodnoty, studna, získat hodnoty v jakých segmentech jsme vybrali. Jinými slovy, první část vybere hodnoty, druhá část získá hodnoty.

nyní udělejme skutečné kódování. Sklearn dělá to neuvěřitelně snadné, ale je tu háček. Možná jste si všimli, že jsme importovali jak labelencoder, tak one hot encoder. Sklearn ‚ s one hot encoder ve skutečnosti neví, jak převést kategorie na čísla, ví pouze, Jak převést čísla na binární. Nejdřív musíme použít labelencoder.

nejprve nastavíme labelencoder stejně jako jakýkoli normální objekt:

le = LabelEncoder()

dále musíme použít sklearn ‚ s.funkce fit_transform. Řekněme, že musíme kódovat pouze první sloupec. Udělali bychom:

X = le.fit_transform(X)

Tato funkce je pouze kombinací .fit a .transformovat příkazy. .fit vezme X (v tomto případě první sloupec X kvůli našemu X) a převede vše na numerická data. .transformace pak použije tuto konverzi.

vše, co zbývá, je použít jeden horký kodér. Díkybohu, je to téměř stejné jako to, co jsme právě udělali:

ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()

Categorical_feartures je parametr, který určuje, jaký sloupec chceme jeden horký kódovat, a protože chceme kódovat první sloupec, dáme . Nakonec jsme fit_transform do binární, a přeměnit ji na pole, takže můžeme pracovat s ním snadno do budoucna.

a je to! Je to celkem jednoduché. Jedna poslední poznámka však, pokud potřebujete udělat víc než jen první sloupec, děláte to, co jsme právě udělali, ale místo 0 dáte jakýkoli sloupec, který chcete. U mnoha sloupců jej můžete umístit do smyčky for:

le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)

hodně štěstí na vás strojového učení dobrodružství!