Hvad er en Hot Encoding og hvordan man gør det

hvis du er til machine learning, så vil du uundgåeligt komme på tværs af denne ting kaldet “One Hot Encoding”. Det er dog en af de ting, der er svære at forstå som nybegynder til maskinindlæring, da du slags har brug for at vide nogle ting om maskinindlæring for at forstå det. For at hjælpe, jeg regnede med, at jeg ville forsøge at give en begynderforklaring.

det første du gør, når du laver nogen form for maskinindlæringsprogram, er normalt forbehandling. Med det mener jeg at forberede data, der skal analyseres af dit program. Når alt kommer til alt kan du ikke bare smide et regneark eller nogle billeder i dit program og forvente, at det ved, hvad du skal gøre. Vi er ikke på det niveau af AI endnu.

en stor del af forbehandlingen er noget kodning. Dette betyder at repræsentere hvert stykke data på en måde, som computeren kan forstå, deraf navnet encode, som bogstaveligt betyder “konverter til kode”. Der er mange forskellige måder at kode på, såsom Etiketkodning, eller som du måske gættede, en varm kodning. Etiketkodning er intuitiv og let at forstå, så jeg forklarer det først. Forhåbentlig derfra vil du være i stand til fuldt ud at forstå en varm kodning.

lad os antage, at vi arbejder med kategoriske data, som katte og hunde. Når du ser på navnet på etiketkodning, kan du muligvis gætte, at det koder etiketter, hvor etiketten kun er en kategori (dvs.kat eller hund), og kode betyder bare at give dem et nummer til at repræsentere den kategori (1 For kat og 2 For hund). Ved at give hver kategori et nummer ved computeren nu, hvordan man repræsenterer dem, da computeren ved, hvordan man arbejder med tal. Og nu er vi allerede færdige med at forklare etiketkodning. Men der er et problem, der gør det ofte ikke arbejde for kategoriske data.

problemet er, at med etiketkodning har kategorierne nu naturlige ordnede forhold. Computeren gør dette, fordi den er programmeret til at behandle højere tal som højere tal; det vil naturligvis give de højere tal højere vægte. Vi kan se problemet med dette i et eksempel:

  • Forestil dig, om du havde 3 kategorier af fødevarer: æbler, kylling og broccoli. Ved hjælp af etiketkodning tildeler du hver af disse et nummer for at kategorisere dem: æbler = 1, kylling = 2 og broccoli = 3. Men nu, hvis din model internt skal beregne gennemsnittet på tværs af kategorier, kan det gøre 1+3 = 4/2 = 2. Det betyder, at ifølge din model er gennemsnittet af æbler og kylling sammen broccoli.

det er klart, at den tankegang ved din model vil føre til, at den får korrelationer helt forkert, så vi skal introducere en-hot kodning.

i stedet for at mærke ting som et tal, der starter fra 1 og derefter øges for hver kategori, går vi efter mere af en binær kategoriseringsstil. Du har måske tænkt, at hvis du vidste, hvad en one-hot er (det vedrører binær kodning, men bekymre dig ikke om det). Lad mig give en visualiseret forskel mellem etiket og en-hot kodning. Se om du kan finde ud af forskellen:

hvad er forskellen? Vores kategorier var tidligere rækker, men nu er de kolonner. Vores numeriske variabel, kalorier, har dog været den samme. En 1 i en bestemt kolonne fortæller computeren den korrekte kategori for den rækkes data. Med andre ord har vi oprettet en ekstra binær kolonne for hver kategori.

det er ikke umiddelbart klart, hvorfor dette er bedre (bortset fra det problem, jeg nævnte tidligere), og det er fordi der ikke er en klar grund. Ligesom mange ting i maskinindlæring bruger vi ikke dette i enhver situation; det er ikke helt bedre end etiketkodning. Det løser bare et problem, som du vil støde på med etiketkodning, når du arbejder med kategoriske data

en Hot kodning i Kode (Få det? Det er en ordspil)

det er altid nyttigt at se, hvordan dette gøres i kode, så lad os lave et eksempel. Normalt er jeg en fast tro på, at vi skal gøre noget uden biblioteker for at lære det, men bare for denne kedelige forbehandlings ting behøver vi ikke rigtig. Bibliotekerne kan gøre det så enkelt. Vi skal bruge numpy, sklearn og pandas, da du finder dig selv ved at bruge disse 3 biblioteker i mange af dine projekter

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

nu hvor vi har værktøjerne, lad os komme i gang. Vi arbejder med et sammensat datasæt. Indtast datasættet med pandas.read_csv funktion:

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

forhåbentlig er det selvforklarende. Næste op er lidt vanskeligere. Sagen ved regneark er, at du måske eller måske ikke er interesseret i nogle af kolonnerne. For enkelhedens skyld, lad os sige, at vi bryr os om alt undtagen den sidste kolonne. Vi skal bruge pandas funktion .iloc, som får dataene på uanset kolonne(r), som du fortæller det til:

X = dataset.iloc.values

.iloc tager faktisk ind, så vi indtastede . Det : er fordi vi vil have alle rækkerne i disse kolonner, og : er bare den måde, du gør det på. Vi tilføjer .værdier til, Ja, få værdierne på hvilke segmenter vi har valgt. Med andre ord vælger den første del værdierne, den anden del får værdierne.

lad os nu gøre den faktiske kodning. Sklearn gør det utroligt nemt, men der er en fangst. Du har måske bemærket, at vi importerede både labelencoder og one hot encoder. Sklearn ‘ s one hot encoder ved faktisk ikke, hvordan man konverterer kategorier til tal, det ved kun, hvordan man konverterer tal til binært. Vi er nødt til at bruge labelencoder først.

først opretter vi en labelencoder ligesom du ville gøre noget normalt objekt:

le = LabelEncoder()

Dernæst skal vi bruge sklearn ‘ s .fit_transform funktion. Lad os sige, at vi kun skal kode den første kolonne. Vi ville gøre:

X = le.fit_transform(X)

denne funktion er blot en kombination af .fit og .transformer kommandoer. .fit tager H (i dette tilfælde den første kolonne af H på grund af vores H) og konverterer alt til numeriske data. .transform anvender derefter denne konvertering.

alt der er tilbage er at bruge den ene hot encoder. Heldigvis, det er næsten det samme som det, vi lige gjorde:

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

Categorical_feartures er en parameter, der angiver, hvilken kolonne vi vil have en hot encode, og da vi vil kode den første kolonne, sætter vi . Endelig fit_transform til binær, og gøre det til et array, så vi kan arbejde med det nemt fremadrettet.

og det er det! Det er ret simpelt. En sidste note dog, hvis du har brug for at gøre mere end bare den første kolonne, du gør, hvad vi lige gjorde, men i stedet for 0 lægger du den kolonne, du vil have. For mange kolonner kan du sætte det i en for loop:

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

held og lykke på dig machine learning eventyr!