logo

Jedno horké kódování ve strojovém učení

Většina reálných datových sad, se kterými se setkáváme během vývoje našeho projektu datové vědy, má sloupce smíšeného datového typu. Tyto datové sady se skládají z obou kategorický stejně jako číselné sloupce. Různé modely strojového učení však nepracují s kategorickými daty a aby se tato data vešla do modelu strojového učení, je třeba je převést na numerická data. Předpokládejme například, že datová sada má a Rod sloupec s kategorickými prvky jako Muž a ženský . Tyto štítky nemají žádné konkrétní pořadí preferencí a také protože data jsou řetězcové štítky, modely strojového učení si špatně vyložily, že v nich existuje nějaká hierarchie.

Jedním z přístupů k vyřešení tohoto problému může být kódování štítků, kdy těmto štítkům přiřadíme číselnou hodnotu například mužský a ženský mapováno na 0 a 1 . To však může přidat zaujatost v našem modelu, protože začne dávat vyšší přednost modelu ženský parametr jako 1>0, ale v ideálním případě jsou oba štítky v datové sadě stejně důležité. K vyřešení tohoto problému použijeme techniku ​​One Hot Encoding.

Jedno horké kódování

Jedno horké kódování je technika, kterou používáme k reprezentaci kategorických proměnných jako číselných hodnot v modelu strojového učení.



Mezi výhody použití jednoho horkého kódování patří:

  1. Umožňuje použití kategorických proměnných v modelech, které vyžadují numerický vstup.
  2. Může zlepšit výkon modelu tím, že modelu poskytne více informací o kategorické proměnné.
  3. Může pomoci vyhnout se problému ordinality, který může nastat, když má kategorická proměnná přirozené uspořádání (např. malá, střední, velká).

Nevýhody použití jednoho horkého kódování zahrnují:

  1. Může to vést ke zvýšení dimenzionality, protože pro každou kategorii v proměnné je vytvořen samostatný sloupec. Díky tomu může být model složitější a pomalejší na trénování.
  2. Může to vést k řídkým datům, protože většina pozorování bude mít hodnotu 0 ve většině sloupců s jednoduchým kódováním.
  3. Může to vést k nadměrnému přizpůsobení, zejména pokud je v proměnné mnoho kategorií a velikost vzorku je relativně malá.
  4. One-hot-encoding je výkonná technika pro zpracování kategorických dat, ale může vést ke zvýšené dimenzionalitě, řídkosti a nadměrnému přizpůsobení. Je důležité jej používat opatrně a zvážit další metody, jako je ordinální kódování nebo binární kódování.

Jeden příklad horkého kódování

v Jedno horké kódování , kategorické parametry připraví samostatné sloupce pro štítky Muž i žena. Takže kdekoli je muž, hodnota bude 1 ve sloupci Muž a 0 ve sloupci Žena a naopak. Pojďme to pochopit na příkladu: Zvažte data, kde jsou uvedeny ovoce, jejich odpovídající kategoriální hodnoty a ceny.

OvoceKategorická hodnota ovoceCena
jablko15
mango210
jablko1patnáct
oranžový3dvacet

Výstup po aplikaci jednorázového kódování na data je uveden následovně,

jablkomangooranžovýcena
1005
01010
100patnáct
001dvacet

One-Hot Encoding pomocí Pythonu

Vytvoření datového rámce

Vytvoření datového rámce pro implementaci jednoho horkého kódování ze souboru CSV.

java end for loop
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())>

Výstup:

Prvních pět řádků Dataframe

Prvních pět řádků Dataframe

Jedinečné prvky v kategorickém sloupci

můžeme použít unikátní() funkce z pandy knihovny, abyste získali jedinečné prvky ze sloupce datového rámce.

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

Výstup:

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

Počet prvků ve sloupci

Můžeme použít value_counts() funkce z pand k získání počtů každého prvku v datovém rámci.

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

Výstup:

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

Máme k dispozici dvě metody pro provádění jednorázového kódování na kategorickém sloupci.

One-Hot kódování kategorického sloupce pomocí knihovny Pandas

Můžeme použít pd.get_dummies() funkce od pand až po rychlé zakódování kategorických sloupců. Tato funkce

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

Výstup:

One-Hot kódované sloupce datové sady

One-Hot kódované sloupce datové sady

Můžeme pozorovat, že máme 3 Poznámky a 2 Pohlaví sloupce v datech. Můžete však jen použít n-1 sloupců k definování parametrů, pokud má n unikátní štítky. Pokud například ponecháme pouze Pohlaví Žena sloupec a zahoďte Pohlaví Muž sloupec, pak také můžeme předat celou informaci, jako když je štítek 1, znamená to žena, a když je štítek 0, znamená to muž. Tímto způsobem můžeme zakódovat kategoriální data a také snížit počet parametrů.

One Hot Encoding pomocí Sci-kit Learn Library

Scikit-learn(sklearn) je oblíbená knihovna pro strojové učení v Pythonu, která poskytuje řadu nástrojů pro předzpracování dat. Poskytuje a OneHotEncoder funkce, kterou používáme pro kódování kategoriálních a číselných proměnných do binárních vektorů.

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}')>

Výstup

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>