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ří:
- Umožňuje použití kategorických proměnných v modelech, které vyžadují numerický vstup.
- Může zlepšit výkon modelu tím, že modelu poskytne více informací o kategorické proměnné.
- 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í:
- 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í.
- 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.
- 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á.
- 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.
| Ovoce | Kategorická hodnota ovoce | Cena |
|---|---|---|
| jablko | 1 | 5 |
| mango | 2 | 10 |
| jablko | 1 | patnáct |
| oranžový | 3 | dvacet |
Výstup po aplikaci jednorázového kódování na data je uveden následovně,
| jablko | mango | oranžový | cena |
|---|---|---|---|
| 1 | 0 | 0 | 5 |
| 0 | 1 | 0 | 10 |
| 1 | 0 | 0 | patnáct |
| 0 | 0 | 1 | dvacet |
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 loopPython3
# 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
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
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>