mi az egy forró kódolás és hogyan kell csinálni
ha a gépi tanulás, akkor elkerülhetetlenül találkoznak a dolog az úgynevezett “egy forró kódolás”. Ez azonban egyike azoknak a dolgoknak, amelyeket nehéz megérteni a gépi tanulás kezdőjeként, mivel bizonyos dolgokat tudnia kell a gépi tanulásról, hogy megértse. Hogy segítsek, arra gondoltam, hogy megpróbálok kezdő magyarázatot adni.
bármilyen gépi tanulási program készítésekor az első dolog általában az előfeldolgozás. Ez alatt azt értem, hogy előkészíti az adatokat, amelyeket a programja elemez. Végül is nem dobhat csak egy táblázatot vagy néhány képet a programjába, és elvárhatja, hogy tudja, mit kell tennie. Még nem vagyunk az AI szintjén.
az előfeldolgozás nagy része valami kódolás. Ez azt jelenti, hogy az egyes adatokat úgy kell ábrázolni, hogy a számítógép megértse, ezért a kódolás név, ami szó szerint azt jelenti, hogy “konvertálni kódra”. Sok különböző módon kódolás, mint a címke kódolás, vagy ahogy talán a sejtette, egy forró kódolás. A címke kódolása intuitív és könnyen érthető, ezért először elmagyarázom. Remélhetőleg onnan képes lesz teljes mértékben megérteni egy forró kódolást.
tételezzük fel, hogy kategorikus adatokkal dolgozunk, például macskákkal és kutyákkal. Ha megnézzük a címkekódolás nevét, akkor kitalálhatjuk, hogy a címkéket kódolja, ahol a címke csak egy kategória (azaz macska vagy kutya), a kódolás pedig csak azt jelenti, hogy számot adunk nekik az adott kategória képviseletére (1 A macska és 2 a kutya számára). Azáltal, hogy minden kategóriának számot ad, a számítógép most már tudja, hogyan kell képviselni őket, mivel a számítógép tudja, hogyan kell dolgozni a számokkal. És most már befejeztük a címkekódolás magyarázatát. De van egy probléma, ami miatt gyakran nem működik kategorikus adatok esetén.
a probléma az, hogy a címkekódolással a kategóriák természetes rendezett kapcsolatokkal rendelkeznek. A számítógép azért teszi ezt, mert úgy van programozva, hogy a nagyobb számokat magasabb számként kezelje; természetesen nagyobb súlyt ad a nagyobb számoknak. A problémát egy példában láthatjuk:
- képzelje el, ha 3 Élelmiszer-kategóriája lenne: alma, csirke és brokkoli. A címkekódolás használatával mindegyikhez hozzárendel egy számot a kategorizáláshoz: alma = 1, csirke = 2, brokkoli = 3. De most, ha a modellnek belsőleg ki kell számítania az átlagot a kategóriák között, akkor előfordulhat, hogy 1+3 = 4/2 = 2. Ez azt jelenti, hogy a modell szerint az alma és a csirke átlaga együtt brokkoli.
nyilvánvaló, hogy a modell gondolkodásmódja ahhoz vezet, hogy a korrelációk teljesen rosszak lesznek, ezért be kell vezetnünk egy forró kódolást.
ahelyett, hogy a dolgokat 1-től kezdődő számként címkéznénk, majd minden kategóriában növelnénk, inkább a bináris kategorizálási stílust választjuk. Lehet, hogy arra gondolt, hogy ha tudná, mi az egy forró (bináris kódolásra vonatkozik, de ne aggódjon miatta). Hadd adjak egy vizualizált különbséget a címke és a one-hot kódolás között. Nézze meg, ki tudja-e dolgozni a különbséget:
mi a különbség? Nos, a kategóriáink korábban sorok voltak, de most oszlopok. Numerikus változónk, kalória, azonban ugyanaz maradt. A 1 egy adott oszlopban megmondja a számítógépnek a megfelelő kategóriát az adott sor adataihoz. Más szavakkal, minden kategóriához létrehoztunk egy további bináris oszlopot.
nem azonnal világos, hogy ez miért jobb (eltekintve a korábban említett problémától), és ez azért van, mert nincs egyértelmű oka. Mint sok más dolog a gépi tanulásban, ezt sem fogjuk minden helyzetben használni; nem egyenesen jobb, mint a címke kódolása. Csak kijavít egy problémát, amellyel a címke kódolásával találkozhat, amikor kategorikus adatokkal dolgozik
egy forró kódolás a kódban (Szerezd meg? Ez egy szójáték)
mindig hasznos látni, hogy ez hogyan történik kódban, ezért tegyünk egy példát. Általában szilárdan hiszek abban, hogy meg kell tennünk valamit könyvtárak nélkül, hogy megtanuljuk, de csak erre az unalmas előfeldolgozási dologra nincs igazán szükségünk. A könyvtárak ezt egyszerűvé tehetik. Fogjuk használni numpy, sklearn, és pandas, ahogy találja magát használja a 3 könyvtárak sok a projektek
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd
most, hogy már az eszközöket, lássunk hozzá. Egy kitalált adatkészlettel fogunk dolgozni. Adja meg az adatkészletet pandákkal .read_csv funkció:
dataset = pd.read_csv('made_up_thing.csv')
Remélhetőleg ez magától értetődő. A következő egy kicsit trükkösebb. A táblázatokkal kapcsolatban az a helyzet, hogy lehet, hogy nem érdekel néhány oszlop. Az egyszerűség kedvéért tegyük fel, hogy mindent érdekel, kivéve az utolsó oszlopot. A pandák funkcióját fogjuk használni .iloc, amely megkapja az adatokat bármilyen oszlop(ok), hogy azt mondja, hogy:
X = dataset.iloc.values
.iloc valójában veszi, így bevitt . A: azért van, mert az összes sort akarjuk ezekben az oszlopokban, és : csak így csinálod. Hozzáadjuk a .értékek, jól, hogy az értékeket milyen szegmensekben választottuk ki. Más szavakkal, az első rész kiválasztja az értékeket, a második rész megkapja az értékeket.
most csináljuk a tényleges kódolást. Sklearn teszi hihetetlenül egyszerű, de van egy fogás. Lehet, hogy észrevetted, hogy importáltuk mind a labelencodert, mind a one hot encodert. A Sklearn one hot encoder valójában nem tudja, hogyan kell a kategóriákat számokká konvertálni, csak azt tudja, hogyan kell a számokat binárisra konvertálni. Először a labelencodert kell használnunk.
először is beállítunk egy labelencodert, mint bármely normál objektumot:
le = LabelEncoder()
ezután a sklearn ‘ s-t kell használnunk .fit_transform funkció. Tegyük fel, hogy csak az első oszlopot kell kódolnunk. We would do:
X = le.fit_transform(X)
ez a funkció csak egy kombinációja a .fit és .parancsok átalakítása. .fit veszi X (ebben az esetben az első oszlop X, mert a mi X), és átalakítja mindent numerikus adatokat. .a transzformáció ezután alkalmazza ezt az átalakítást.
már csak a one hot encoder használata maradt hátra. Hálásan, ez majdnem ugyanaz, mint amit most tettünk:
ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()
Categorical_feartures egy paraméter, amely meghatározza, hogy melyik oszlopot akarjuk egy forró kódolni, és mivel az első oszlopot akarjuk kódolni, feltesszük . Végül, mi fit_transform bináris, és kapcsolja be egy tömb, így tudunk dolgozni vele könnyen megy előre.
és ennyi! Elég egyszerű. Még egy utolsó megjegyzés, ha nem csak az első oszlopot kell tennie, akkor azt csinálja, amit éppen tettünk, de a 0 helyett bármilyen oszlopot tesz. Sok oszlop, akkor tedd egy For hurok:
le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)
sok szerencsét a gépi tanulási kalandokhoz!