머신러닝 & 딥러닝

[머신러닝 & 딥러닝] 데이터 전처리 - 좋은 데이터셋 만들기

beginner-in-coding 2025. 4. 22. 19:13

00. 데이터 전처리

  • 머신 러닝 알고리즘의 중요 요소: 데이터 품질 & 정보의 양
  • 데이터를 모델에 주입하기 전, 조사하고 전처리하는 과정이 필수

01. 누락된 데이터 다루기

  • NaN, NULL: RDB에서 모르는 값을 지칭하는데 사용
  • 누락된 값을 무시하고 학습할 경우 예상치 못한 결과가 발생, 따라서 분석을 하기 전 누락된 값을 처리하는 것이 중요
  • 방법(Python의 DataFrame으로 다룸)
    1. 테이블 데이터에서 누락된 값 식별
      1. isnull()을 통해 셸이 수치 값을 가지고 있는지(false) 가지고 있지 않은지(true)를 불리언 값이 채워진 DataFrame으로 반환
      2. 이를 sum()을 통해 각 특성마다 몇 개씩 보유하고 있는 지 확인
    2. 누락된 데이터 다루는 전략들 활용
      1. 전략 1: 누락된 값이 있는 훈련 샘플이나 특성 제외하기
        • 해당 훈련 샘플(즉, 행)이나 특성(즉, 열)을 삭제 → dropna() 사용
        • dropna()의 매개변수
          • axis=0은 행, axis=1은 열
          • how='all' : 모든 열이 NaN일 때만 삭제
          • thresh=n : NaN값이 아닌 값이 설정한 n개보다 작은 행 삭제
          • subset=['name'] : 특정 열(예시로 name)에 NaN이 있는 행만 삭제
        • 장점: 간단
        • 단점
          • 많은 데이터(행)를 삭제할 경우: 안정된 분석이 불가
          • 많은 특성(열)을 삭제할 경우: 분류기가 클래스를 구분하는 데 필요힌 중요한 정보를 잃게 됨
      2. 전략 2: 보간(interpolation) 방법
        1. 평균으로 대체
          • 각 특성 열이 전체 평균으로 NaN값을 바꾸는 것
          • 사이킷런의 추정기, SimpleImputer 클래스 사용
            • missing_values=np.nan
            • strategy : median, mean, most_frequent
          • fillna()를 통해 값 채우기
            • method : 'bfill' - 누락된 값을 다음 행의 값으로 채움, 'ffill', 'pad' - 누락된 값을 이전 행의 값으로 채움

02. 범주형 데이터 다루기

  • 범주형의 문자열 → 정수로 인코딩
  • 중요한 것: 순서가 있는 데이터와 순서가 없는 데이터인지 구분하기
    • 순서가 존재: 정렬 가능
  • 인코딩
    1. 순서가 존재하는 특성 - 매핑(mapping) 
      • 특성 간의 산술적인 차이를 이미 알고있어야 가능 (예: 사이즈, XL = L + 1 = M + 2)
      • DataFrame의 map()을 사용
      • 디코딩: {v : k for k, v in '매핑변수이름'.items()}
    2. 순서가 존재하지 않은 특성 - 원-핫 인코딩(one-hot encoding)
      • 순서가 존재하지 않은 특성을 매핑을 하면 생기는 문제: A 라는 데이터가 B라는 데이터보다 크다고, 즉 순서가 존재할 것이라고 가정함, 이는 알고리즘이 의미 있는 결과를 만들 수 있다고 해도, 데이터 전처리의 최선이 될 수 없음
      • 원-핫 인코딩: 고유한 값마다 새로운 더미(dummy) 특성을 만드는 것
        • 사이킷런의 preprocessing 모듈의 OneHotEncoder를 사용
        • 여러 개의 특성이 존재하는 배열에서 특정 열만 변환하려면 ColumnTransformer 사용
        • 문자열 특성만 인코딩하여 DataFrame으로 반환하는 Pandas의 get_dummies() 사용
      • 예시: 클래스 레이블
        • 사이킷런의 분류 추정기 라이브러리는 자체적으로 클래스 레이블을 정수로 변환해줌
        • 사소한 실수를 방지하기 위해 클래스 레이블을 정수 배열로 전달하는 것이 좋음
        • 클래스 레이블: 순서가 존재하지 않음
        • 방법
          1. enuerate를 사용하여 클래스 레이블을 0부터 할당 (디코딩: 순서가 존재하는 특성의 디코딩 참고)
          2. 사이킷런의 LabelEncoder 클래스의 fit_transform() 사용 (디코딩: inverse_transform() 사용)
      • 원-핫 인코딩 주의: 다중 공선성(multicolinearity)
        • 역행렬을 구해야하는 알고리즘 등 특정 알고리즘에서 이슈가 될 수 있음
        • 특성 간의 상관 관계가 높으면 역행렬을 계산하기 어려워 수치적으로 불안정해짐
          • 변수 간의 상관관계를 감소하기 위해 원-핫 인코딩 된 배열에서 특정 열 하나 삭제해도 됨

03. 데이터셋을 훈련 데이터셋과 테스트 데이터셋으로 나누기

  • 분할 이유: 모델을 실전에 투입하기 전, 테스트 데이터셋에 있는 레이블과 예측을 비교하기 위해, 즉 이는 편향되지 않은 성능을 측정하기 위해 작업함
  • 사이킷런의 model_selection 모듈의 train_test_split() 사용
    • 데이터셋을 랜덤한 훈련 데이터셋과 테스트 데이터셋으로 나눌 수 있음
    • 적합한 비율: 일반적으로 학습:테스트가 8:2, 7:3 정도, 대용량 데이터셋(약 10만개 이상)은 99:1, 90:10도 가능

04. 특성 스케일 맞추기

  • 결정 트리랜덤 포레스트는 스케일이 상관 없음
  • 대부분의 머신러닝 알고리즘은 특성의 스케일이 같을 때 성능이 훨씬 좋아짐
  • 유클리디안 거리 지표를 사용하는 K-Means와 같은 경우에는 여러 특성들 간의 스케일이 중요함
  • 대표적인 스케일 방법 두가지
    1. 정규화(normalization) - 최소-최대 스케일 변환(min-max scaling)
      • 각 특성의 열마다 최대/최소 값을 찾아 스케일 변환 식에 적용하여 값을 변환함
      • 정해진 범위의 값이 필요할 때 유용하게 사용
      • 사이킷런의 MinMaxScaler()
    2. 표준화(standardzation)
      • 특성의 평균을 0에 맞추고 표준 편차를 1로 만들어 정규 분포와 같은 특징을 만듬
      • 가중치를 더 쉽게 학습할 수 있게함
      • 이상치 정보가 유지되기 때문에 제한된 범위로 데이터를 조정하는 최소-최대 스케일 변환에 비해 알고리즘이 이상치에 덜 민감함
      • 사이킷런의 StandardScaler()
  • 이 외의 사이킷런에서 제공하는 RobousScaler()
    • 특성 마다 독립적으로 작용하며, 중간 값을 뺀 다음 데이터셋의 1사분위수와 3사분위수를 사용해서 데이터셋의 스케일을 조정
    • 즉, 극단적인 값과 이상치에 영향을 덜 받음
    • 따라서 이상치가 많이 포함된 작은 데이터셋이 과대적합 되기 쉬울 경우에 선택

05. 유용한 특성 선택

  • 과대 적합(overfiting): 테스트 데이터셋의 성능 > 훈련 데이터셋의 성능
    • 모델 파라미터가 훈련 데이터셋에 있는 특정 샘플들에 대해, 즉 일부 샘플들이 모델에 너무 잘 반영되어 있음
    • 이유: 주어진 훈련 데이터에 비해 모델이 복잡하기 때문
  • 일반화 오차를 위한 방법
    1. 더 많은 훈련 데이터셋 사용
    2. 규제를 통해 복잡도 제한
    3. 파라미터 개수가 적은 간단한 모델 사용
    4. 데이터 차원을 줄임
  • 규제
    • L1 규제(L1 reqularization)
      • 가중치 제곱을 가중치 절댓값으로 바꾸는 방법
      • 희소한 특성 벡터를 만들 때 사용
      • 관련 없는 특성이 많은 고차원 데이터셋일 경우 희소성이 도움이 될 수 있음
      • 훈련 샘플보다 관련이 없는 특성이 더 많은 경우
      • 사이킷런의 penalty 매개변수에 'l1'으로 지정
    • L2 규제 (L2 reqularization)
      • 개별 가중치 값을 제한하여 모델 복잡도를 줄이는 방법
      • 비용 함수 + 패널티 항(penalty term)
        • 규제가 없는 비용 함수
        • 훈련한 모델에 비해 가중치 값을 아주 작게 만드는 효과
  • 순차 특성 선택 알고리즘
    • 특성 선택을 통한 차원 축소(dimensionality reduction)
    • 규제가 없는 모델에서 유용
    • 두 가지 방법
      1. 특성 선택(feature selection): 원본 특성에서 일부를 선택
      2. 특성 추출(feature extraction): 일련의 특성에서 얻은 정보로 새로운 특성을 만듬