서론
데이터에는 크게 두가지 데이터가 있습니다.
1. 범주형 데이터
[ 순서형, 명목형 ]
2. 연속형 데이터
[ 연속형, 이산형 ]
머신러닝 모델은 문자 데이터를 인식하지 못하므로 문자로 구성된 범주형은 숫자로 바꿔줘야합니다. 관련된 기법을 간단히 보겠습니다.
1. 레이블 인코딩 (Label Encoding)
각 카테고리 값을 고유한 정수로 변환합니다. 예를 들어, "사과", "바나나", "체리"가 있으면 각각을 0, 1, 2로 변환합니다.
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['Category'] = label_encoder.fit_transform(data['Category'])
개념:
- 레이블 인코딩은 각 카테고리 값을 고유한 정수로 변환하는 방법입니다.
- 예를 들어, 카테고리가 ['red', 'green', 'blue']라면, 이를 [0, 1, 2]로 변환합니다.
특징:
- 간단하고 직관적이며, 카테고리 수가 많지 않을 때 유용합니다.
- 단점은 카테고리 값들 간에 순서가 생긴다는 점입니다. 즉, 모델이 0과 2 사이의 차이를 인식할 수 있어 불필요한 의미를 부여할 수 있습니다.
사용 예:
- LabelEncoder는 주로 트리 기반 알고리즘(예: 결정 트리, 랜덤 포레스트)에서 잘 동작합니다.
선택 기준:
- 카테고리가 명목형(nominal)이고 모델이 이를 순서형 데이터로 잘못 해석하지 않는 경우.
2. 원-핫 인코딩 (One-Hot Encoding)
각 카테고리 값을 이진 벡터로 변환합니다. 예를 들어, "사과", "바나나", "체리"가 있으면 각 카테고리에 대해 하나의 열을 만들어 해당 카테고리에만 1을 넣고 나머지는 0으로 설정합니다.
from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
one_hot_encoded = one_hot_encoder.fit_transform(data[['Category']])
또는 Pandas의 get_dummies 메서드를 사용할 수도 있습니다.
data = pd.get_dummies(data, columns=['Category'])
개념:
- 원-핫 인코딩은 각 카테고리 값을 이진 벡터로 변환하는 방법입니다.
- 예를 들어, 카테고리가 ['red', 'green', 'blue']라면, 이를 각각 [1, 0, 0], [0, 1, 0], [0, 0, 1]로 변환합니다.
특징:
- 카테고리 값들 간의 순서를 부여하지 않아 순서의 문제를 해결합니다.
- 단점은 카테고리 수가 많을 때 고차원 희소 행렬을 생성하여 메모리와 계산 비용이 증가할 수 있습니다.
사용 예:
- OneHotEncoder는 대부분의 머신러닝 알고리즘에서 잘 동작하며, 특히 선형 모델이나 신경망에서 유용합니다.
선택 기준:
- 대부분의 명목형 데이터에 적합, 특히 카테고리 수가 적을 때.
3. 순서형 인코딩 (Ordinal Encoding)
카테고리 값들 간에 순서가 있을 경우, 순서형 인코딩을 사용할 수 있습니다. 예를 들어, "Low", "Medium", "High"와 같이 순서가 있는 경우, 이를 0, 1, 2로 변환합니다.
from sklearn.preprocessing import OrdinalEncoder
ordinal_encoder = OrdinalEncoder(categories=[['Low', 'Medium', 'High']])
data['Category'] = ordinal_encoder.fit_transform(data[['Category']])
개념:
- 순서형 인코딩은 카테고리 값들 간에 자연스러운 순서가 있을 때 사용합니다.
- 예를 들어, ['low', 'medium', 'high']를 [0, 1, 2]로 변환합니다.
특징:
- 카테고리 간의 순서를 유지하면서 인코딩할 수 있습니다.
- 순서가 없는 데이터에 적용하면 부정확한 결과를 초래할 수 있습니다.
사용 예:
- 순서형 인코딩은 카테고리 간에 명확한 순서가 있을 때(예: 고객 만족도 수준, 교육 수준) 유용합니다.
선택 기준:
- 카테고리 간에 순서가 있는 경우.
4. 대상 인코딩 (Target Encoding)
카테고리 값을 해당 카테고리의 목표 변수(target variable) 평균 값으로 변환합니다. 이는 주로 회귀 문제에서 사용됩니다.
import category_encoders as ce
target_encoder = ce.TargetEncoder(cols=['Category'])
data['Category'] = target_encoder.fit_transform(data['Category'], data['Target'])
# 컬럼 적용
target_encoder = ce.TargetEncoder(cols=['feature1', 'feature2'])
data_encoded = target_encoder.fit_transform(data[['feature1', 'feature2']], data['target'])
개념:
- 대상 인코딩은 카테고리 값을 목표 변수(target variable)의 평균 값으로 변환합니다.
- 예를 들어, 특정 카테고리가 종속 변수의 평균값을 기준으로 인코딩됩니다.
특징:
- 모델이 카테고리와 목표 변수 간의 관계를 더 잘 이해할 수 있도록 도와줍니다.
- 주의해야 할 점은 과적합(overfitting)의 위험이 있습니다.
사용 예:
- 대상 인코딩은 주로 회귀 문제에서 사용되며, 특히 카테고리 수가 많을 때 유용합니다.
선택 기준:
- 주로 회귀 문제에서, 카테고리 수가 많을 때.
5. 빈도 인코딩 (Frequency Encoding)
카테고리 값의 빈도를 사용하여 인코딩합니다.
frequency_encoding = data['Category'].value_counts().to_dict()
data['Category'] = data['Category'].map(frequency_encoding)
개념:
- 빈도 인코딩은 각 카테고리 값을 데이터 내에서의 빈도로 변환합니다.
- 예를 들어, 'red'가 10번, 'green'이 20번, 'blue'가 5번 나타났다면 이를 [10, 20, 5]로 변환합니다.
특징:
- 카테고리 값의 분포를 반영하여 모델이 데이터를 더 잘 이해할 수 있도록 도와줍니다.
- 카테고리 값 간의 순서를 도입하지 않으면서도 유용한 정보를 제공합니다.
사용 예:
- 빈도 인코딩은 카테고리 수가 많고 각 카테고리가 자주 반복되는 경우에 유용합니다.
선택 기준:
- 카테고리 수가 많을 때.
요약
- 레이블 인코딩: 단순하고 빠르지만 순서가 부여될 수 있음.
- 카테고리가 명목형(nominal)이고 모델이 이를 순서형 데이터로 잘못 해석하지 않는 경우. - 원-핫 인코딩: 순서 문제를 해결하지만 고차원 희소 행렬을 생성할 수 있음.
- 대부분의 명목형 데이터에 적합, 특히 카테고리 수가 적을 때. - 순서형 인코딩: 순서가 있는 카테고리에 적합.
- 카테고리 간에 순서가 있는 경우. - 대상 인코딩: 목표 변수와의 관계를 반영하지만 과적합 위험이 있음.
- 주로 회귀 문제에서, 카테고리 수가 많을 때. - 빈도 인코딩: 데이터 내 빈도를 반영하여 유용한 정보를 제공.
- 카테고리 수가 많을 때