logo

Jedno gorące kodowanie w uczeniu maszynowym

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ą:

  1. Umożliwia wykorzystanie zmiennych kategorycznych w modelach wymagających wprowadzania danych liczbowych.
  2. Może poprawić wydajność modelu, dostarczając modelowi więcej informacji na temat zmiennej kategorycznej.
  3. 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ą:

  1. 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.
  2. Może to prowadzić do rzadkich danych, ponieważ większość obserwacji będzie miała wartość 0 w większości kolumn zakodowanych jednokrotnie.
  3. 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.
  4. 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.

OwocWartość kategoryczna owocówCena
jabłko15
mango210
jabłko1piętnaście
Pomarańczowy320

Dane wyjściowe po zastosowaniu kodowania one-hot na danych są podane w następujący sposób:

jabłkomangoPomarańczowycena
1005
01010
100piętnaście
00120

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 Excel
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())>

Wyjście:

Pierwsze pięć wierszy ramki danych

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

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>