Większość rzeczywistych zbiorów danych, które napotykamy podczas opracowywania naszego projektu analizy danych, ma kolumny o mieszanym typie danych. Te zbiory danych składają się z obu kategoryczny jak również kolumny numeryczne. Jednak różne modele uczenia maszynowego nie działają z danymi kategorycznymi i aby dopasować te dane do modelu uczenia maszynowego, należy je przekształcić w dane liczbowe. Załóżmy na przykład, że zbiór danych ma Płeć kolumna z elementami kategorycznymi, takimi jak Mężczyzna i Kobieta . Etykiety te nie mają określonej kolejności preferencji, a ponieważ dane są etykietami łańcuchowymi, modele uczenia maszynowego błędnie zinterpretowały, że istnieje w nich jakiś rodzaj hierarchii.
Jednym ze sposobów rozwiązania tego problemu może być kodowanie etykiet, w którym na przykład przypiszemy tym etykietom wartość liczbową Mężczyzna I Kobieta zmapowany do 0 I 1 . Może to jednak zwiększyć stronniczość w naszym modelu, ponieważ zacznie dawać większe preferencje dla Kobieta parametr jako 1>0, ale w idealnym przypadku obie etykiety są równie ważne w zbiorze danych. Aby rozwiązać ten problem, użyjemy techniki One Hot Encoding.
Jedno gorące kodowanie
Jedno kodowanie na gorąco to technika, której używamy do reprezentowania zmiennych kategorycznych jako wartości liczbowych w modelu uczenia maszynowego.
Zalety stosowania jednego gorącego kodowania obejmują:
- Umożliwia wykorzystanie zmiennych kategorycznych w modelach wymagających wprowadzania danych liczbowych.
- Może poprawić wydajność modelu, dostarczając modelowi więcej informacji na temat zmiennej kategorycznej.
- Może to pomóc uniknąć problemu porządkowości, który może wystąpić, gdy zmienna kategoryczna ma naturalny porządek (np. Mały, średni, duży).
Wady stosowania jednego gorącego kodowania obejmują:
- Może to prowadzić do zwiększonej wymiarowości, ponieważ dla każdej kategorii zmiennej tworzona jest osobna kolumna. Może to sprawić, że model będzie bardziej złożony i wolniejszy w uczeniu.
- Może to prowadzić do rzadkich danych, ponieważ większość obserwacji będzie miała wartość 0 w większości kolumn zakodowanych jednokrotnie.
- Może to prowadzić do nadmiernego dopasowania, zwłaszcza jeśli w zmiennej występuje wiele kategorii, a wielkość próby jest stosunkowo mała.
- Kodowanie one-hot to potężna technika przetwarzania danych kategorycznych, ale może prowadzić do zwiększonej wymiarowości, rzadkości i nadmiernego dopasowania. Ważne jest, aby używać go ostrożnie i rozważyć inne metody, takie jak kodowanie porządkowe lub kodowanie binarne.
Jeden z przykładów kodowania na gorąco
W Jedno gorące kodowanie , parametry kategoryczne spowodują utworzenie oddzielnych kolumn dla etykiet Mężczyzna i Kobieta. Tak więc, gdziekolwiek jest mężczyzna, wartość będzie wynosić 1 w kolumnie Mężczyzna i 0 w kolumnie Kobieta i odwrotnie. Wyjaśnijmy to na przykładzie: rozważmy dane, w których podane są owoce, odpowiadające im wartości kategoryczne i ceny.
| Owoc | Wartość kategoryczna owoców | Cena |
|---|---|---|
| jabłko | 1 | 5 |
| mango | 2 | 10 |
| jabłko | 1 | piętnaście |
| Pomarańczowy | 3 | 20 |
Dane wyjściowe po zastosowaniu kodowania one-hot na danych są podane w następujący sposób:
| jabłko | mango | Pomarańczowy | cena |
|---|---|---|---|
| 1 | 0 | 0 | 5 |
| 0 | 1 | 0 | 10 |
| 1 | 0 | 0 | piętnaście |
| 0 | 0 | 1 | 20 |
Kodowanie One-Hot przy użyciu języka Python
Tworzenie ramki danych
Tworzenie ramki danych w celu zaimplementowania jednego gorącego kodowania z pliku CSV.
usuń pierwszy znak ExcelPython3
# 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())> Wyjście:

Pierwsze pięć wierszy ramki danych
Unikalne elementy w kolumnie kategorycznej
możemy skorzystać z unikalny() funkcja z pandy biblioteka, aby uzyskać unikalne elementy z kolumny ramki danych.
Python3 print(data['Gender'].unique()) print(data['Remarks'].unique())>
Wyjście:
array(['Male', 'Female'], dtype=object) array(['Nice', 'Good', 'Great'], dtype=object)>
Liczba elementów w kolumnie
Możemy użyć wartość_liczba() funkcja z pand, aby uzyskać liczbę każdego elementu w ramce danych.
Python3 data['Gender'].value_counts() data['Remarks'].value_counts()>
Wyjście:
Female 7 Male 5 Name: Gender, dtype: int64 Nice 5 Great 4 Good 3 Name: Remarks, dtype: int64>
Mamy do dyspozycji dwie metody kodowania typu one-hot w kolumnie kategorycznej.
Jednorazowe kodowanie kolumny kategorycznej przy użyciu biblioteki Pandas
Możemy użyć pd.get_dummies() funkcja z pand do jednego gorącego kodowania kolumn kategorycznych. Ta funkcja
Python3 one_hot_encoded_data = pd.get_dummies(data, columns = ['Remarks', 'Gender']) print(one_hot_encoded_data)>
Wyjście:

Kolumny zestawu danych zakodowane w One-Hot
Możemy zaobserwować, że tak 3 uwagi I 2 Płeć kolumny w danych. Możesz jednak po prostu użyć n-1 kolumny, aby zdefiniować parametry, jeśli takowe istnieją N unikalne etykiety. Na przykład, jeśli zachowamy tylko Płeć żeńska kolumnę i upuść Płeć męska kolumnie, wtedy również możemy przekazać całą informację, ponieważ gdy etykieta ma wartość 1, oznacza to kobietę, a gdy etykieta wynosi 0, oznacza to mężczyznę. W ten sposób możemy zakodować dane kategoryczne i jednocześnie zmniejszyć liczbę parametrów.
Jedno kodowanie na gorąco przy użyciu biblioteki Sci-kit Learn
Scikit-learn(sklearn) to popularna biblioteka do uczenia maszynowego w Pythonie, która udostępnia liczne narzędzia do wstępnego przetwarzania danych. Zapewnia OneHotEnkoder funkcja, której używamy do kodowania zmiennych jakościowych i numerycznych na wektory binarne.
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}')> Wyjście
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>