Wat is een Hot Encoding en hoe het te doen
als je van machine learning houdt, dan zul je onvermijdelijk dit ding tegenkomen dat “One Hot Encoding”wordt genoemd. Echter, het is een van die dingen die moeilijk te begrijpen als een beginner aan machine learning, omdat je soort van nodig hebt om te weten een aantal dingen over machine learning om het te begrijpen. Om te helpen, dacht ik dat ik zou proberen om een beginner uitleg te geven.
het eerste wat je doet wanneer je een machine learning programma maakt is meestal pre-processing. Daarmee bedoel ik het voorbereiden van gegevens om door uw programma te worden geanalyseerd. Immers, je kunt niet gewoon gooien een spreadsheet of een aantal foto ‘ s in uw programma en verwachten dat het om te weten wat te doen. We zijn nog niet op dat niveau van AI.
een groot deel van de voorbewerking is iets dat codeert. Dit betekent dat elk stukje gegevens wordt weergegeven op een manier die de computer kan begrijpen, vandaar de naam encode, wat letterlijk “converteren naar code”betekent. Er zijn veel verschillende manieren van coderen, zoals Label codering, of zoals je misschien al geraden, een Hot codering. Label codering is intuïtief en gemakkelijk te begrijpen, dus Ik zal dat eerst uitleggen. Hopelijk vanaf daar zul je in staat zijn om volledig te begrijpen een hete codering.
laten we aannemen dat we werken met categorische gegevens, zoals katten en honden. Kijkend naar de naam van label codering, zou je kunnen raden dat het labels codeert, waar label slechts een categorie is (dwz kat of hond), en coderen betekent gewoon dat je ze een nummer geeft om die categorie weer te geven (1 Voor Kat en 2 Voor Hond). Door elke categorie een nummer te geven, weet de computer nu hoe ze te vertegenwoordigen, omdat de computer weet hoe te werken met getallen. En nu zijn we al klaar met het uitleggen van labelcodering. Maar er is een probleem waardoor het vaak niet werkt voor categorische gegevens.
het probleem is dat met labelcodering de categorieën nu natuurlijke geordende relaties hebben. De computer doet dit omdat hij is geprogrammeerd om hogere getallen als hogere getallen te behandelen; het zal natuurlijk de hogere getallen een hoger gewicht geven. We kunnen het probleem hiermee zien in een voorbeeld:
- stel je voor dat je 3 categorieën voedsel had: appels, kip en broccoli. Met behulp van labelcodering, zou je elk van deze een nummer toewijzen om ze te categoriseren: appels = 1, kip = 2, en broccoli = 3. Maar nu, als uw model intern het gemiddelde over categorieën moet berekenen, zou het 1+3 = 4/2 = 2 kunnen doen. Dit betekent dat volgens uw model Het gemiddelde van appels en kip samen broccoli is.
het is duidelijk dat de denkwijze van uw model zal leiden tot het krijgen van correlaties volledig verkeerd, dus we moeten introduceren one-hot codering.
in plaats van dingen te labelen als een getal vanaf 1 en dan te verhogen voor elke categorie, gaan we voor meer van een binaire stijl van categoriseren. Je zou kunnen hebben gedacht dat als je wist wat een one-hot is (het heeft betrekking op binaire codering, maar maak je geen zorgen over). Laat me een gevisualiseerd verschil tussen label en one-hot codering. Kijk of je het verschil kunt oplossen:
Wat is het verschil? Onze categorieën waren vroeger rijen, maar nu zijn het kolommen. Onze numerieke variabele, calorieën, is echter hetzelfde gebleven. Een 1 in een bepaalde kolom vertelt de computer de juiste categorie voor de gegevens van die rij. Met andere woorden, we hebben een extra binaire kolom gemaakt voor elke categorie.
het is niet meteen duidelijk waarom dit beter is (afgezien van het probleem dat ik eerder noemde), en dat is omdat er geen duidelijke reden is. Zoals veel dingen in machine learning, We zullen niet worden met behulp van deze in elke situatie; het is niet regelrecht beter dan label codering. Het lost gewoon een probleem op dat u zult tegenkomen met labelcodering bij het werken met categorische gegevens
een Hot codering in Code (Get it? Het is een woordspeling)
het is altijd handig om te zien hoe dit in code wordt gedaan, dus laten we een voorbeeld geven. Normaal gesproken geloof ik dat we iets moeten doen zonder bibliotheken om het te leren, maar alleen voor deze vervelende voorbewerking hoeven we dat niet echt te doen. Bibliotheken kunnen dit zo eenvoudig maken. We gaan numpy, sklearn en panda ‘ s gebruiken, omdat je merkt dat je deze 3 bibliotheken gebruikt in veel van je projecten
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd
nu we de tools hebben, gaan we aan de slag. We zullen werken met een verzonnen dataset. Voer de dataset in met panda ‘ s .read_csv-functie:
dataset = pd.read_csv('made_up_thing.csv')
hopelijk spreekt dat vanzelf. De volgende is lastiger. Het ding over spreadsheets is dat u wel of niet de zorg over een aantal van de kolommen. Voor de eenvoud, laten we zeggen dat we de zorg over alles behalve de laatste kolom. We gaan panda ‘ s functie gebruiken .iloc, die de gegevens krijgt op welke kolom (s) je het vertelt:
X = dataset.iloc.values
.iloc neemt het op, dus hebben we het ingevoerd . De : is omdat we alle rijen in die kolommen willen, en : is gewoon de manier waarop je dat doet. We voegen de .waarden om de waarden te krijgen op welke segmenten we hebben geselecteerd. Met andere woorden, het eerste deel selecteert de waarden, het tweede deel krijgt de waarden.
laten we nu de werkelijke codering doen. Sklearn maakt het ongelooflijk gemakkelijk, maar er is een addertje onder het gras. Je hebt misschien gemerkt dat we zowel de labelencoder als de one hot encoder geïmporteerd hebben. Sklearn ‘ s one hot encoder weet eigenlijk niet hoe je Categorieën naar getallen converteert, het Weet alleen hoe je getallen naar binair kunt converteren. We moeten eerst de labelencoder gebruiken.
eerst zullen we een labelencoder instellen, net als elk normaal object:
le = LabelEncoder()
daarna moeten we sklearn ‘ s gebruiken .fit_transform functie. Laten we zeggen dat we alleen de eerste kolom moeten coderen. We zouden doen:
X = le.fit_transform(X)
deze functie is slechts een combinatie van de .fit en .transformeer commando ‘ s. .fit neemt X (in dit geval de eerste kolom van X vanwege onze X) en zet alles om in numerieke gegevens. .transform past dan die conversie toe.
het enige wat overblijft is de ene hete encoder te gebruiken. Gelukkig is het bijna hetzelfde als wat we net deden. :
ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()
Categorical_feartures is een parameter die specificeert welke kolom we willen coderen, en omdat we de eerste kolom willen coderen, zetten we . Tot slot, We fit_transform in binair, en zet het in een array zodat we gemakkelijk kunnen werken met het vooruit.
en dat is het! Het is vrij simpel. Een laatste opmerking echter, als je meer moet doen dan alleen de eerste kolom, doe je wat we net deden, maar in plaats van 0 zet je welke kolom je wilt. Voor veel kolommen kunt u het in een for-lus plaatsen:
le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)
veel succes op je machine learning avonturen!