[머신러닝] 숫자형 데이터 스케일링 방법 정리

반응형
    반응형

    숫자형 데이터 스케일링하기

    머신러닝이나 딥러닝으로 빅데이터 분석을 하기전에 필수로 해야하는 것이 데이터값 맞추는 작업입니다.
    숫자형 데이터인 경우 숫자가 중구난방이 되면 안되기 모델 정확도가 많이 떨어지기 때문에 컬러마다 범위가 같게 숫자로 맞춰주어야 합니다. 모두 비율로서 맞춰서 모델 예측력을 높입니다.

    스케일링 방법

    스케일링 방법에는 Min-Max Scaling, Standard Scaling, Robust Scaling이 주요한 방법입니다.

    Min-Max Scaling

    • 개념: 데이터의 범위를 최솟값을 0, 최댓값을 1로 변환하여 모든 데이터값이 0~1사이의 값으로 바꿔줍니다.
    • 수식:
      $$X_{\text{scaled}} = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}}$$
      최대,최소값을 직접 적용하기 때문에 이상치에 굉장히 민감합니다.
      분류 모델보다는 회귀모델에 적합하고 예측의 정확성보다는 방향성을 보는 쪽에 많이 쓰입니다. 주로 이미지쪽에서 쓰입니다.
    • 코드 예시:
    from sklearn.preprocessing 
    import MinMaxScaler scaler = MinMaxScaler() 
    data['scaled_column'] =scaler.fit_transform(data[['original_column']])
    
    # 머신러닝 train, test
    x_train_scaled = scaler.fit_transform(x_train)
    x_test_scaled = scaler.transform(x_test)

     

    Standard Scaling (Z-Score Normalization)

    • 개념: 데이터를 평균이 0, 표준편차가 1인 분포로 변환합니다. z-score 정규화입니다.
    • 수식:
      $$X_{\text{scaled}} = \frac{X - X_{mean}}{X_{std}} $$
      MinMax와 마찬가지로 이상치에 민감하지만 최대,최소값을 직접 쓰는게 아니므로 MinMax보다는 덜 민감합니다. 분류 모델에 더 적합합니다.
    • 코드 예시:

    from sklearn.preprocessing import StandardScaler 
    scaler = StandardScaler() 
    data['scaled_column'] = scaler.fit_transform(data[['original_column']])
    
    # 머신러닝 train, test
    x_train_scaled = scaler.fit_transform(x_train)
    x_test_scaled = scaler.transform(x_test)

     

    Robust Scaling

    • 개념: 이상치에 민감하지 않도록 중앙값과 IQR(Interquartile Range)을 사용하여 스케일링합니다.
    • 수식:
      $$X_{\text{scaled}} = \frac{X - X_{median}}{\text{IQR}} $$
      IQR과 중앙값을 가져다 쓰기 때문에 이상치에 민감하지 않습니다.
      분포 형태에 유지하려고 하기 때문에 정규분포와 거리가 먼 데이터에 유용합니다. 이상치가 많거나 정규분포가 아닌 데이터인 경우 주로 사용합니다.
    • 코드 예시:

    from sklearn.preprocessing import RobustScaler 
    scaler = RobustScaler() 
    data['scaled_column'] = scaler.fit_transform(data[['original_column']])
    
    # 머신러닝 train, test
    x_train_scaled = scaler.fit_transform(x_train)
    x_test_scaled = scaler.transform(x_test)

     

    로그 변환

    마지막으로 로그 변환을 설명하려고 합니다. 로그 변환은 말그대로 데이터에 로그를 취해 분포 변환을 위해 사용합니다. 데이터가 왜곡된경우 유용합니다.

    우리가 잘 아는 분포는 정규분포이므로 로그변환을 했을 때 정규분포로 변환되면 아주 좋은 시도를 했다고 볼 수 있습니다. 그렇지 않다면 로그 변환은 큰 힘을 발휘하기 어렵습니다. 물론 너무 치우친 데이터면 그래도 로그변환을 한게 나을 수도 있습니다.

    파이썬에서 로그변환을 하려면 numpy가 필요합니다. numpy의 log1p() 메쏘드를 씁니다.

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 데이터 생성 (양수 값)
    np.random.seed(42)
    data = np.random.exponential(scale=10, size=1000)
    
    # 로그 변환
    log_transformed_data = np.log1p(data)
    
    # 시각화
    plt.figure(figsize=(12, 6))
    
    plt.subplot(1, 2, 1)
    plt.hist(data, bins=30, color='blue', edgecolor='black')
    plt.title('Original Data')
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    
    plt.subplot(1, 2, 2)
    plt.hist(log_transformed_data, bins=30, color='green', edgecolor='black')
    plt.title('Log-Transformed Data')
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    
    plt.tight_layout()
    plt.show()

    마치며

    스케일링 방법 중에서 어떤 방법을 선택할지는 데이터의 특성과 모델의 요구사항에 따라 다릅니다. 예를 들어, 데이터의 분포가 정규분포에 가깝다면 Standard Scaling을 사용하거나 그렇지 않다면 Min-Max Scaling이나 Robust Scaling을 시도해볼 수 있습니다. 스케일링은 주로 모델의 학습 성능에 영향을 미칩니다. 완벽한 건 사실 없습니다. 여러 실험을 통해 어떤 스케일링이 가장 적절한지 확인하는 것이 학습성능을 높이는 이상적인 방법입니다.

    댓글

    Designed by JB FACTORY

    ....