logo

One Hot Encoding i maskinlæring

De fleste virkelige datasett vi møter under utviklingen av datavitenskapsprosjektet har kolonner med blandet datatype. Disse datasettene består av begge kategorisk samt numeriske kolonner. Ulike maskinlæringsmodeller fungerer imidlertid ikke med kategoriske data, og for å passe disse dataene inn i maskinlæringsmodellen må de konverteres til numeriske data. Anta for eksempel at et datasett har en Kjønn kolonne med kategoriske elementer som Mann og Hunn . Disse etikettene har ingen spesifikk preferanserekkefølge, og siden dataene er strengetiketter, feiltolket maskinlæringsmodeller at det er en slags hierarki i dem.

En tilnærming for å løse dette problemet kan være etikettkoding hvor vi vil tilordne en numerisk verdi til disse etikettene for eksempel Mann og Hunn kartlagt til 0 og 1 . Men dette kan legge til skjevhet i modellen vår da den vil begynne å gi høyere preferanse til Hunn parameter som 1>0, men ideelt sett er begge etikettene like viktige i datasettet. For å håndtere dette problemet vil vi bruke One Hot Encoding-teknikken.

One Hot Encoding

En varm koding er en teknikk som vi bruker for å representere kategoriske variabler som numeriske verdier i en maskinlæringsmodell.



Fordelene ved å bruke én varm koding inkluderer:

  1. Den tillater bruk av kategoriske variabler i modeller som krever numerisk input.
  2. Det kan forbedre modellytelsen ved å gi mer informasjon til modellen om den kategoriske variabelen.
  3. Det kan bidra til å unngå problemet med ordinalitet, som kan oppstå når en kategorisk variabel har en naturlig rekkefølge (f.eks. liten, middels, stor).

Ulempene med å bruke én varm koding inkluderer:

  1. Det kan føre til økt dimensjonalitet, da det opprettes en egen kolonne for hver kategori i variabelen. Dette kan gjøre modellen mer kompleks og treg å trene.
  2. Det kan føre til sparsomme data, ettersom de fleste observasjoner vil ha en verdi på 0 i de fleste av de én-hot-kodede kolonnene.
  3. Det kan føre til overfitting, spesielt hvis det er mange kategorier i variabelen og utvalgsstørrelsen er relativt liten.
  4. One-hot-encoding er en kraftig teknikk for å behandle kategoriske data, men det kan føre til økt dimensjonalitet, sparsomhet og overtilpasning. Det er viktig å bruke det forsiktig og vurdere andre metoder som ordinær koding eller binær koding.

One Hot Encoding Eksempler

I One Hot Encoding , vil de kategoriske parameterne forberede separate kolonner for både mannlige og kvinnelige etiketter. Så uansett hvor det er en mann, vil verdien være 1 i mann-kolonnen og 0 i kvinne-kolonnen, og omvendt. La oss forstå med et eksempel: Vurder dataene der frukt, deres tilsvarende kategoriverdier og priser er gitt.

FruktKategorisk verdi av fruktPris
eple15
mango210
eple1femten
oransje3tjue

Utgangen etter å ha brukt one-hot-koding på dataene er gitt som følger,

eplemangooransjepris
1005
01010
100femten
001tjue

One-Hot-koding ved hjelp av Python

Opprette dataramme

Opprette en dataramme for å implementere én hot-encoding fra CSV-fil.

sortere en arraylist
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())>

Produksjon:

De første fem radene med Dataframe

De første fem radene med Dataframe

Unike elementer i kategorisk kolonne

vi kan bruke unik() funksjon fra pandaer bibliotek for å få unike elementer fra kolonnen i datarammen.

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

Produksjon:

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

Antall elementer i kolonnen

Vi kan bruke verdi_antall() funksjon fra pandaer for å få tellingene til hvert element i datarammen.

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

Produksjon:

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

Vi har to tilgjengelige metoder for å utføre one-hot-koding på den kategoriske kolonnen.

One-Hot-koding av kategorisk kolonne ved bruk av Pandas-bibliotek

Vi kan bruke pd.get_dummies() funksjon fra pandaer til one-hot encode de kategoriske kolonnene. Denne funksjonen

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

Produksjon:

One-Hot-kodede kolonner i datasettet

One-Hot-kodede kolonner i datasettet

Det kan vi konstatere at vi har 3 Merknader og 2 Kjønn kolonner i dataene. Du kan imidlertid bare bruke n-1 kolonner for å definere parametere hvis den har n unike etiketter. For eksempel, hvis vi bare beholder Kjønn kvinnelig kolonnen og slipp Kjønn Mann kolonne, da kan vi også formidle hele informasjonen som når etiketten er 1, betyr det kvinne og når etiketten er 0 betyr det mann. På denne måten kan vi kode de kategoriske dataene og redusere antall parametere også.

One Hot Encoding med Sci-kit Learn Library

Scikit-learn(sklearn) er et populært maskinlæringsbibliotek i Python som gir en rekke verktøy for dataforbehandling. Det gir en OneHotEncoder funksjon som vi bruker for å kode kategoriske og numeriske variabler 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}')>

Produksjon

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>