Vad är en het kodning och hur man gör det
om du är i maskininlärning, kommer du oundvikligen att stöta på den här saken som kallas ”en het kodning”. Det är dock en av de saker som är svåra att förstå som nybörjare till maskininlärning, eftersom du behöver veta några saker om maskininlärning för att förstå det. För att hjälpa, jag tänkte att jag skulle försöka ge en nybörjare förklaring.
det första du gör när du gör någon form av maskininlärningsprogram är vanligtvis förbehandling. Med det menar jag att förbereda data som ska analyseras av ditt program. När allt kommer omkring kan du inte bara kasta ett kalkylblad eller några bilder i ditt program och förvänta dig att det vet vad du ska göra. Vi är inte på den nivån av AI än.
en stor del av förbehandlingen är något som kodar. Detta innebär att representera varje bit av data på ett sätt som datorn kan förstå, därav namnet koda, vilket bokstavligen betyder ”konvertera till kod”. Det finns många olika sätt att koda som Etikettkodning, eller som du kanske gissat, en het kodning. Etikettkodning är intuitiv och lätt att förstå, så jag förklarar det först. Förhoppningsvis därifrån kommer du att kunna förstå en het kodning.
låt oss anta att vi arbetar med kategoriska data, som katter och hundar. Om du tittar på namnet på etikettkodning kan du kanske gissa att det kodar etiketter, där etiketten bara är en kategori (dvs. katt eller hund), och koda betyder bara att ge dem ett nummer för att representera den kategorin (1 för katt och 2 för hund). Genom att ge varje kategori ett nummer vet datorn nu hur man representerar dem, eftersom datorn vet hur man arbetar med siffror. Och nu har vi redan slutat förklara etikettkodning. Men det finns ett problem som gör att det ofta inte fungerar för kategoriska data.
problemet är att med etikettkodning har kategorierna nu naturliga ordnade relationer. Datorn gör detta eftersom den är programmerad att behandla högre tal som högre tal; det kommer naturligtvis att ge högre tal högre vikter. Vi kan se problemet med detta i ett exempel:
- Tänk om du hade 3 kategorier av livsmedel: äpplen, kyckling och broccoli. Med hjälp av etikettkodning skulle du tilldela var och en av dessa ett nummer för att kategorisera dem: äpplen = 1, kyckling = 2 och broccoli = 3. Men nu, om din modell internt behöver beräkna genomsnittet över kategorier, kan det göra 1 + 3 = 4/2 = 2. Det betyder att enligt din modell är genomsnittet av äpplen och kyckling tillsammans broccoli.
självklart kommer den tankegången av din modell att leda till att det blir korrelationer helt fel, så vi måste introducera en het kodning.
i stället för att märka saker som ett tal som börjar från 1 och sedan ökar för varje kategori, kommer vi att gå för mer av en binär kategoriseringsstil. Du kanske har tänkt att om du visste vad en one-hot är (det gäller binär kodning, men oroa dig inte för det). Låt mig ge en visualiserad skillnad mellan etikett och en het kodning. Se om du kan räkna ut skillnaden:
vad är skillnaden? Tja, våra kategorier var tidigare rader, men nu är de kolumner. Vår numeriska variabel, kalorier, har dock förblivit densamma. En 1 i en viss kolumn kommer att berätta för datorn rätt kategori för den radens data. Med andra ord har vi skapat en extra binär kolumn för varje kategori.
det är inte omedelbart klart varför det här är bättre (bortsett från det problem jag nämnde tidigare), och det beror på att det inte finns någon tydlig anledning. Liksom många saker i maskininlärning kommer vi inte att använda detta i alla situationer; det är inte direkt bättre än etikettkodning. Det fixar bara ett problem som du kommer att stöta på med etikettkodning när du arbetar med kategoriska data
en het kodning i Kod (få det? Det är en ordlek)
det är alltid bra att se hur detta görs i kod, så låt oss göra ett exempel. Normalt är jag en fast tro på att vi borde göra något utan några bibliotek för att lära oss det, men bara för det här tråkiga förbehandlingsmaterialet behöver vi inte riktigt. Bibliotek kan göra detta så enkelt. Vi kommer att använda numpy, sklearn och pandas, eftersom du kommer att hitta dig själv med de 3 biblioteken i många av dina projekt
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd
nu när vi har verktygen, låt oss komma igång. Vi kommer att arbeta med en färdig dataset. Mata in dataset med pandas .read_csv-funktionen:
dataset = pd.read_csv('made_up_thing.csv')
förhoppningsvis är det självförklarande. Nästa upp är lite svårare. Saken med kalkylblad är att du kanske eller kanske inte bryr dig om några av kolumnerna. För enkelhetens skull, låt oss säga att vi bryr oss om allt utom den sista kolumnen. Vi kommer att använda pandas funktion .iloc, som får data i vilken kolumn(er) som du säger det till:
X = dataset.iloc.values
.iloc tar faktiskt in, så vi inmatade . De: beror på att vi vill ha alla rader i dessa kolumner, och : är precis som du gör det. Vi lägger till .värden för att, ja, få värdena på vilka segment vi har valt. Med andra ord väljer den första delen värdena, den andra delen får värdena.
låt oss nu göra den faktiska kodningen. Sklearn gör det otroligt enkelt, men det finns en hake. Du kanske har märkt att vi importerade både labelencoder och one hot encoder. Sklearns one hot encoder vet faktiskt inte hur man konverterar kategorier till siffror, det vet bara hur man konverterar siffror till binära. Vi måste använda labelencoder först.
först ställer vi in en labelencoder precis som du skulle ha något normalt objekt:
le = LabelEncoder()
nästa måste vi använda sklearns .fit_transform funktion. Låt oss säga att vi måste koda bara den första kolumnen. Vi skulle göra:
X = le.fit_transform(X)
denna funktion är bara en kombination av .passa och .omvandla kommandon. .fit tar X (i detta fall den första kolumnen i X på grund av vår X) och omvandlar allt till numeriska data. .transform tillämpar sedan den omvandlingen.
allt som är kvar är att använda one hot encoder. Tack och lov, Det är nästan detsamma som vad vi just gjorde:
ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()
Categorical_feartures är en parameter som anger vilken kolumn vi vill ha en varm koda, och eftersom vi vill koda den första kolumnen lägger vi . Slutligen passar vi in i binär, och gör det till en array så att vi enkelt kan arbeta med det framåt.
och det är det! Det är ganska enkelt. En sista anteckning om, om du behöver göra mer än bara den första kolumnen, du gör vad vi just gjorde, men i stället för 0 du sätter vad kolumn du vill. För många kolumner kan du lägga den i en för loop:
le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)
lycka till på dig maskininlärning äventyr!