logo

One Hot Encoding i Machine Learning

De fleste datasæt fra det virkelige liv, vi støder på under vores udvikling af datavidenskabsprojekter, har kolonner med blandet datatype. Disse datasæt består af begge dele kategorisk samt numeriske kolonner. Forskellige Machine Learning-modeller fungerer dog ikke med kategoriske data, og for at passe disse data ind i maskinlæringsmodellen skal de konverteres til numeriske data. Antag for eksempel, at et datasæt har en Køn kolonne med kategoriske elementer som Mand og Kvinde . Disse etiketter har ingen specifik præferencerækkefølge, og da dataene er strengetiketter, misfortolkede maskinlæringsmodeller, at der er en form for hierarki i dem.

En tilgang til at løse dette problem kan være etiketkodning, hvor vi f.eks. vil tildele en numerisk værdi til disse etiketter Han og Kvinde kortlagt til 0 og 1 . Men dette kan tilføje bias i vores model, da det vil begynde at give højere præference til Kvinde parameter som 1>0, men ideelt set er begge etiketter lige vigtige i datasættet. For at håndtere dette problem vil vi bruge One Hot Encoding-teknikken.

En varm kodning

En varm kodning er en teknik, som vi bruger til at repræsentere kategoriske variable som numeriske værdier i en maskinlæringsmodel.



Fordelene ved at bruge én hot-encoding omfatter:

  1. Det tillader brugen af ​​kategoriske variable i modeller, der kræver numerisk input.
  2. Det kan forbedre modellens ydeevne ved at give modellen mere information om den kategoriske variabel.
  3. Det kan hjælpe med at undgå problemet med ordinalitet, som kan opstå, når en kategorisk variabel har en naturlig rækkefølge (f.eks. lille, mellem, stor).

Ulemperne ved at bruge én varm kodning inkluderer:

  1. Det kan føre til øget dimensionalitet, da der oprettes en separat kolonne for hver kategori i variablen. Dette kan gøre modellen mere kompleks og langsommere at træne.
  2. Det kan føre til sparsomme data, da de fleste observationer vil have en værdi på 0 i de fleste af de one-hot-kodede kolonner.
  3. Det kan føre til overtilpasning, især hvis der er mange kategorier i variablen, og stikprøvestørrelsen er relativt lille.
  4. One-hot-encoding er en kraftfuld teknik til at behandle kategoriske data, men det kan føre til øget dimensionalitet, sparsomhed og overtilpasning. Det er vigtigt at bruge det forsigtigt og overveje andre metoder såsom ordinær kodning eller binær kodning.

One Hot Encoding Eksempler

I En varm kodning , vil de kategoriske parametre forberede separate kolonner for både mandlige og kvindelige etiketter. Så uanset hvor der er en Mand, vil værdien være 1 i Mand-kolonnen og 0 i Kvinde-kolonnen og omvendt. Lad os forstå med et eksempel: Overvej de data, hvor frugter, deres tilsvarende kategoriske værdier og priser er givet.

FrugtKategorisk værdi af frugtPris
æble15
mango210
æble1femten
orange3tyve

Outputtet efter anvendelse af one-hot-kodning på dataene er givet som følger,

æblemangoorangepris
1005
01010
100femten
001tyve

One-Hot-kodning ved hjælp af Python

Oprettelse af dataramme

Oprettelse af en dataramme for at implementere én hot-encoding fra CSV-fil.

anmærkninger i springstøvle
Python3
# Program for demonstration of one hot encoding # import libraries import numpy as np import pandas as pd # import the data required data = pd.read_csv('employee_data.csv') print(data.head())>

Produktion:

Første fem rækker af Dataframe

Første fem rækker af Dataframe

Unikke elementer i kategorisk kolonne

vi kan bruge enestående() funktion fra pandaer bibliotek for at få unikke elementer fra kolonnen i datarammen.

Python3
print(data['Gender'].unique()) print(data['Remarks'].unique())>

Produktion:

array(['Male', 'Female'], dtype=object) array(['Nice', 'Good', 'Great'], dtype=object)>

Optælling af elementer i kolonnen

Vi kan bruge værdi_antal() funktion fra pandaer for at få tællingerne af hvert element i datarammen.

Python3
data['Gender'].value_counts() data['Remarks'].value_counts()>

Produktion:

Female 7 Male 5 Name: Gender, dtype: int64  Nice 5 Great 4 Good 3 Name: Remarks, dtype: int64>

Vi har to tilgængelige metoder til at udføre one-hot-kodning på den kategoriske kolonne.

One-Hot-kodning af kategorisk kolonne ved hjælp af Pandas-bibliotek

Vi kan bruge pd.get_dummies() funktion fra pandaer til one-hot encode de kategoriske kolonner. Denne funktion

Python3
one_hot_encoded_data = pd.get_dummies(data, columns = ['Remarks', 'Gender']) print(one_hot_encoded_data)>

Produktion:

One-Hot-kodede kolonner i datasættet

One-Hot-kodede kolonner i datasættet

Det kan vi konstatere, at vi har 3 Bemærkninger og 2 køn kolonner i dataene. Du kan dog bare bruge n-1 kolonner for at definere parametre, hvis det har n unikke etiketter. For eksempel, hvis vi kun beholder Køn kvinde kolonne og slip Køn_Mand kolonne, så kan vi også formidle hele informationen, som når etiketten er 1, betyder det kvinde, og når etiketten er 0 betyder det mand. På denne måde kan vi indkode de kategoriske data og også reducere antallet af parametre.

One Hot Encoding ved hjælp af Sci-kit Learn Library

Scikit-learn(sklearn) er et populært maskinlæringsbibliotek i Python, der giver adskillige værktøjer til dataforbehandling. Det giver en OneHotEncoder funktion, som vi bruger til at indkode kategoriske og numeriske variable til binære vektorer.

Python3
#one hot encoding using OneHotEncoder of Scikit-Learn import pandas as pd from sklearn.preprocessing import OneHotEncoder #Building a dummy employee dataset for example data = {'Employee id': [10, 20, 15, 25, 30], 'Gender': ['M', 'F', 'F', 'M', 'F'], 'Remarks': ['Good', 'Nice', 'Good', 'Great', 'Nice'], } #Converting into a Pandas dataframe df = pd.DataFrame(data) #Print the dataframe: print(f'Employee data : 
{df}') #Extract categorical columns from the dataframe #Here we extract the columns with object datatype as they are the categorical columns categorical_columns = df.select_dtypes(include=['object']).columns.tolist() #Initialize OneHotEncoder encoder = OneHotEncoder(sparse_output=False) # Apply one-hot encoding to the categorical columns one_hot_encoded = encoder.fit_transform(df[categorical_columns]) #Create a DataFrame with the one-hot encoded columns #We use get_feature_names_out() to get the column names for the encoded data one_hot_df = pd.DataFrame(one_hot_encoded, columns=encoder.get_feature_names_out(categorical_columns)) # Concatenate the one-hot encoded dataframe with the original dataframe df_encoded = pd.concat([df, one_hot_df], axis=1) # Drop the original categorical columns df_encoded = df_encoded.drop(categorical_columns, axis=1) # Display the resulting dataframe print(f'Encoded Employee data : 
{df_encoded}')>

Produktion

Employee data :   Employee id Gender Remarks 0 10 M Good 1 20 F Nice 2 15 F Good 3 25 M Great 4 30 F Nice Encoded Employee data :   Employee id Gender_F Gender_M Remarks_Good Remarks_Great Remarks_Nice 0 10 0.0 1.0 1.0 0.0 0.0 1 20 1.0 0.0 0.0 0.0 1.0 2 15 1.0 0.0 1.0 0.0 0.0 3 25 0.0 1.0 0.0 1.0 0.0 4 30 1.0 0.0 0.0 0.0 1.0>