TIL

👀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일만에 끝낼 수 있을까..? 조금 걱정이 되긴하지만, 그래도 목요일 오전도 사용할 수 있으니까 좀 빨리빨리 진행해야겠다.

댓글남기기