[TIL] 내일배움캠프 34일차_[Pandas] 데이터 전처리 - 데이터 정규화와 표준화, 인코딩
👀Today I Learn
데이터 정규화와 표준화
1. 데이터 정규화(Normalization)
데이터 정규화?
- 정규화는 데이터의 범위를 0과 1사이로 변환하는 과정
- 모델이 안정적이고 빠르게 수렴할수록 도움
- 서로 다른 범위를 가진 데이터를 동일한 스케일로 맞추어 비교하기 쉽게 만듦
Min-Max 정규화
- 가장 일반적인 정규화 방법
- 각 데이터를 최소값을 0, 최대값을 1로 변환
-
pip install scikit-learn
scaler = MinMaxScaler() normalized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
2. 데이터 표준화(Standardization)
데이터 표준화?
- 데이터를 평균이 0, 표준편차가 1이 되도록 변환
- 정규분포를 가정한 많은 분석 기법에 유리
- 각 열의 모든 데이터가 0에서 1 사이의 값으로 변환됨
Z - 표준 표준화
-
데이터에서 평균을 빼고 표준편차로 나누어, 모든 데이터가 표준 정규분표(평균 0, 표준편차 1)를 따르도록 만듬
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() standardized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
3. 비선형 변환(Non-linear Transformation)
- 데이터의 비정상적인 분포를 정규 분포에 가깝게 만들기 위해 사용
로그(log) 변환
- 양의 데이터에서 주로 사용됨
- 데이터의 분포를 좁히는데 유용
- 특히, 지수 분포를 가진 데이터를 다룰 때 효과적
- 데이터의 분포가 평탄해짐
import numpy as np df['특성1_log'] = np.log(df['특성1'])
제곱근(Square Root) 변환
- 데이터의 분포를 평탄하게 만듦
-
특히 포아송 분포를 가진 데이터에서 사용
df['특성1_sqrt'] = np.sqrt(df['특성1'])
- 분포가 줄어듦
박스-콕스(Box-Cox) 변환
- 다양한 형태의 데이터 분포를 정규분포에 가깝게 변환하기 위해 사용
- 양수 데이터에서만 사용 가능
-
pip install scipy
from scipy.stats import boxcox # 박스-콕스 변환 df['특성1_boxcox'], _ = boxcox(df['특성1'])
RobustScaler
```python
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
scaled_df = scaler.fit_transform(df)
scaled_df = pd.DataFrame(scaled_df, columns=df.columns)
```
인코딩(Encoding)
- 범주형 데이터를 수치형 데이터로 변환
- 머신러닝 모델은 수치적으로 처리할 수 있기 때문에, 범주형 데이터를 인코딩 하는 것이 필수
1. 레이블 인코딩(Label Encoding)
- 범주형 데이터를 순서가 있는 숫자로 변환
- 각 범주에 고유한 숫자가 할당됨
import pandas as pd from sklearn.preprocessing import LabelEncoder # 예시 데이터프레임 생성 data = {'과일': ['사과', '바나나', '사과', '오렌지', '바나나']} df = pd.DataFrame(data) # 레이블 인코딩 label_encoder = LabelEncoder() df['과일_인코딩'] = label_encoder.fit_transform(df['과일']) print(df)
-
결과 : 사과는 0, 바나나는 1, 오렌지는 2로 인코딩
과일 과일_인코딩 0 사과 0 1 바나나 1 2 사과 0 3 오렌지 2 4 바나나 1
- 레이블 인코딩 주의점!
- 범주형 데이터에 순서가 있을 때 적합적
- 값을 크기로 인식해 잘못된 결과를 초래할 수 있음
2. 원-핫 인코딩(One-Hot Encoding)
- 범주를 이진 벡터로 변환
-
각 범주는 고유한 열을 가지며, 해당하는 열에는 1, 나머지 열에는 0이 할당
df_one_hot = pd.get_dummies(df['과일'], prefix='과일')
- 결과 : 바나나, 사과, 오렌지 각각이 독립된 열로 변환되었고, 해당하는 위치에 1이 표시
과일_바나나 과일_사과 과일_오렌지 0 0 1 0 1 1 0 0 2 0 1 0 3 0 0 1 4 1 0 0
- 원-핫 인코딩의 장점
- 범주형 데이터에 순서가 없을 때 사용
- 모델이 범주 간의 순서나 관계를 인식하지 않고 각 범주를 독립적으로 처리 가능
3. 차원 축소 인코딩(Count or Frequency Encoding)
- 범주형 데이터가 많을 때 유용
-
각 범주를 데이터셋 내에서의 출현 빈도로 인코딩
df['과일_빈도'] = df['과일'].map(df['과일'].value_counts())
-
결과 : 사과와 바나나는 각각 2회, 오렌지는 1회 출현하여 해당 빈도로 인코딩
과일 과일_인코딩 과일_빈도 0 사과 0 2 1 바나나 1 2 2 사과 0 2 3 오렌지 2 1 4 바나나 1 2
- 주의점!
- 데이터의 빈도가 매우 중요한 경우에 적합
- 범주의 고유성을 잃을 수 있으므로 주의해서 사용
4. 순서형 인코딩(Ordinal Encoding)
-
순서가 있는 범주형 데이터를 그 순서에 따라 숫자로 변환하는 방식
# 예시 데이터 data = {'등급': ['낮음', '중간', '높음', '중간', '높음']} df = pd.DataFrame(data) # 순서형 인코딩 order = {'낮음': 1, '중간': 2, '높음': 3} df['등급_인코딩'] = df['등급'].map(order)
-
결과 : 낮음은 1, 중간은 2, 높음은 3으로 인코딩
등급 등급_인코딩 0 낮음 1 1 중간 2 2 높음 3 3 중간 2 4 높음 3
5. 임베딩(Embedding)
- 딥러닝에서 주로 사용되며, 범주형 데이터를 벡터 공간에 매핑하여 변환
- 고차원 범주형 데이터에 유용
- 임베딩의 장점
- 차원 축소와 메모리 절약 효과가 있음
- 임베딩은 주로 텍스트 데이터에서 단어를 벡터로 변환할 때 사용되며, keras 등의 라이브러리에서 쉽게 구현 가능
💡Today I Thought
오늘의 체크리스트
- 머신러닝과제 필수과제 끝내기
- 백준 코딩테스트 1문제
- TIL 작성하기
회고
내일까지 도전과제까지 끝내서 언능 제출해야겠다. 장고 강의 3일만에 끝낼 수 있을까..? 조금 걱정이 되긴하지만, 그래도 목요일 오전도 사용할 수 있으니까 좀 빨리빨리 진행해야겠다.
댓글남기기