logo

기계 학습의 원 핫 인코딩

데이터 과학 프로젝트 개발 중에 접하는 대부분의 실제 데이터 세트에는 혼합 데이터 유형의 열이 있습니다. 이 데이터세트는 두 가지로 구성됩니다. 범주형 숫자 열도 마찬가지입니다. 그러나 다양한 기계 학습 모델은 범주형 데이터에서는 작동하지 않으며 이 데이터를 기계 학습 모델에 맞추려면 숫자 데이터로 변환해야 합니다. 예를 들어 데이터세트에 성별 다음과 같은 범주형 요소가 있는 열 남성과 여성 . 이러한 레이블에는 특정 우선 순위가 없으며 데이터가 문자열 레이블이기 때문에 기계 학습 모델은 레이블에 일종의 계층 구조가 있다고 잘못 해석했습니다.

이 문제를 해결하기 위한 한 가지 접근 방식은 예를 들어 이러한 레이블에 숫자 값을 할당하는 레이블 인코딩이 될 수 있습니다. 남성 그리고 여성 매핑됨 0 그리고 1 . 그러나 이는 모델에 더 높은 선호도를 부여하기 시작하므로 모델에 편향을 추가할 수 있습니다. 여성 매개변수는 1>0이지만 이상적으로는 두 레이블 모두 데이터세트에서 똑같이 중요합니다. 이 문제를 해결하기 위해 One Hot Encoding 기술을 사용합니다.

원 핫 인코딩

원 핫 인코딩은 기계 학습 모델에서 범주형 변수를 숫자 값으로 표현하는 데 사용하는 기술입니다.



하나의 핫 인코딩을 사용하면 다음과 같은 이점이 있습니다.

  1. 수치 입력이 필요한 모델에서 범주형 변수를 사용할 수 있습니다.
  2. 범주형 변수에 대한 추가 정보를 모델에 제공하여 모델 성능을 향상시킬 수 있습니다.
  3. 이는 범주형 변수가 자연적인 순서(예: 소형, 중형, 대형)를 가질 때 발생할 수 있는 순서성 문제를 피하는 데 도움이 될 수 있습니다.

단일 핫 인코딩 사용의 단점은 다음과 같습니다.

  1. 변수의 각 범주에 대해 별도의 열이 생성되므로 차원이 증가할 수 있습니다. 이로 인해 모델이 더 복잡해지고 학습 속도가 느려질 수 있습니다.
  2. 대부분의 관측값은 원-핫 인코딩된 열의 대부분에서 0 값을 갖기 때문에 데이터가 희박해질 수 있습니다.
  3. 특히 변수에 범주가 많고 표본 크기가 상대적으로 작은 경우에는 과적합이 발생할 수 있습니다.
  4. 원-핫 인코딩은 범주형 데이터를 처리하는 강력한 기술이지만 차원성, 희소성 및 과적합이 증가할 수 있습니다. 신중하게 사용하고 서수 인코딩이나 이진 인코딩과 같은 다른 방법을 고려하는 것이 중요합니다.

원 핫 인코딩 예제

~ 안에 원 핫 인코딩 , 범주형 매개변수는 남성 및 여성 라벨 모두에 대해 별도의 열을 준비합니다. 따라서 남성이 있는 경우 남성 열의 값은 1, 여성 열의 값은 0이 되며 그 반대의 경우도 마찬가지입니다. 예를 들어 이해해 보겠습니다. 과일, 해당 범주 값 및 가격이 제공되는 데이터를 생각해 보세요.

과일과일의 범주형 가치가격
사과15
망고210
사과1열 다섯
주황색이십

데이터에 원-핫 인코딩을 적용한 후의 출력은 다음과 같습니다.

사과망고주황색가격
1005
01010
100열 다섯
001이십

Python을 사용한 원-핫 인코딩

데이터프레임 생성

CSV 파일에서 하나의 핫 인코딩을 구현하기 위한 데이터 프레임을 생성합니다.

문자열 자바의 길이
파이썬3
# 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())>

산출:

데이터프레임의 처음 5개 행

데이터프레임의 처음 5개 행

범주형 열의 고유 요소

우리는 고유한() 에서 기능 팬더 데이터프레임의 열에서 고유한 요소를 가져오는 라이브러리입니다.

파이썬3
print(data['Gender'].unique()) print(data['Remarks'].unique())>

산출:

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

열의 요소 수

우리는 사용할 수 있습니다 value_counts() pandas에서 함수를 사용하여 데이터프레임의 각 요소 수를 가져옵니다.

파이썬3
data['Gender'].value_counts() data['Remarks'].value_counts()>

산출:

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

범주형 열에 대해 원-핫 인코딩을 수행하는 데 사용할 수 있는 두 가지 방법이 있습니다.

Pandas 라이브러리를 사용한 범주형 열의 원-핫 인코딩

우리는 사용할 수 있습니다 pd.get_dummies() 팬더에서 범주형 열을 원-핫 인코딩하는 함수입니다. 이 기능

파이썬3
one_hot_encoded_data = pd.get_dummies(data, columns = ['Remarks', 'Gender']) print(one_hot_encoded_data)>

산출:

데이터 세트의 원-핫 인코딩된 열

데이터 세트의 원-핫 인코딩된 열

우리는 우리가 가지고 있음을 관찰할 수 있습니다 3 비고 그리고 2 성별 데이터의 열입니다. 그러나 그냥 사용할 수 있습니다 n-1 매개변수를 정의하는 열(있는 경우) N 독특한 라벨. 예를 들어, 성별 여성 열을 삭제하고 성별 남성 열을 사용하면 레이블이 1이면 여성을 의미하고 레이블이 0이면 남성을 의미하므로 전체 정보를 전달할 수도 있습니다. 이렇게 하면 범주형 데이터를 인코딩하고 매개변수 수도 줄일 수 있습니다.

Sci-kit Learn 라이브러리를 사용한 원 핫 인코딩

Scikit-learn(sklearn)은 데이터 전처리를 위한 다양한 도구를 제공하는 Python의 인기 있는 기계 학습 라이브러리입니다. 그것은 원핫인코더 범주형 변수와 숫자형 변수를 이진 벡터로 인코딩하는 데 사용하는 함수입니다.

파이썬3
#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}')>

산출

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>