좋은 피처를 설계해야하는 이유는?

올바른 피처를 보유하는 것이 하이퍼파라미터 조정 같은 것 보다 훨씬 유용하다고 함.

 

고품질의 피처는 모델이 학습하고 일반화하는 능력에 직접적인 영향을 미치기 때문.

 

하이퍼파라미터를 아무리 조정한다 해도, 입력 데이터(피처)가 관련 정보를 포함하지 않거나 노이즈가 많다면, 모델은 정확한 예측을 하는 데 어려움을 겪게 됨.

 

좋은 피처는 모델이 데이터의 근본적인 패턴을 파악하고 이를 보지 못한 데이터에 일반화할 수 있도록 보장함.

 

Q) 모델의 일반화 (generalization) 능력이란?

 

모델이 학습 데이터셋에서 학습한 패턴을 새로운, 보지 못한 데이터셋에 적용하여 예측을 수행하는 능력을 말함.

 

다시 말해, 모델이 학습 과정에서 얻은 지식을 실제 세계 데이터나 테스트 데이터셋에 얼마나 잘 적용할 수 있는지를 나타냄.

 

단순히 모델의 예측 능력을 말하는 것보다 모델이 학습 데이터 외부의 데이터에 대해 얼마나 잘 작동하는지를 측정하는 것.

 

 

Q) 딥러닝에서는 피처를 설계할 필요가 없지 않나요?

 

맞다. 

 

일단 이 말인 "딥러닝에서는 피처를 설계할 필요가 없다"는 심층 신경망이 원시 데이터로부터 스스로 특징(feature)을 학습하고 추출할 수 있는 능력을 갖추고 있기 때문에 나온 말임.

 

딥러닝은 점점 더 고수준의 피처(예: 에지, 질감, 객체의 일부)를 스스로 학습하는 능력이 있음.

 

전통적인 머신러닝 방식에서는 모델의 성능을 최대화하기 위해 데이터 전처리 과정에서 전문가의 지식을 바탕으로 중요한 피처를 선택하거나 만들어내는 과정이 필수적이었음.

 

 

피처 엔지니어링 기법에 대해서 (데이터 전처리 시점)

여러가지 방법들이 있는데 하나씩 살펴보자.

 

 

결측값 처리(Missing Value)

먼저, 결측값이라는 건 일부 데이터 값이 비어있는 걸 말함.

 

이런 결측값 유형에 따라서 처리 방식이 달라질 걸 알아야한다.

 

결측값 유형:

  • 비무작위 결측 (MNAR, Missing not at random)
  • 무작위 결측 (MAR, Missing at random)
  • 완전 무작위 결측 (MCAR, Missing completely at random)

비무작위 결측:

  • 값이 결측되었지만 결측된 이유가 있는 걸 말한다.
  • 예시로 "향후 12개월 내 주택 구매 여부 예측" 에서 연간 소득이라는 데이터가 결측되었다고 가정해보자. 이 사람들은 소득이 높기 때문에 값을 제대로 입력하지 않았을 확률이 높다. 그러므로 이를 반영해서 결측 처리를 해야함.

무작위 결측:

  • 결측된 이유가 다른 변수와 연관이 있는 걸 말한다.
  • 예시로 나이가 결측값인데, 성별이 여자이기 때문인 걸 수도 있다.

완전 무작위 결측:

  • 특별한 이유 없이 결측된 걸 말한다.
  • 다만 이런 경우는 드물므로, 앞의 두 가지 경우를 생각해봐야함.

 

 

Q) 그래서 결측값은 어떻게 처리하는데?

 

크게 두 가지 방법이 있다:

  • 삭제
  • 대치

삭제하는 방법:

  • 가장 쉬운 접근 방법이라서 많이 이용한다.
  • 크게는 열 삭제와 행 삭제가 있다.
  • 데이터가 완전 무작위로 결측된거라면 삭제를 해도 괜찮지만, 다른 유형이라면 삭제를 했을 때 편향을 일으킬 수 있다.

열 삭제 방법:

  • 해당 열을 전부 삭제하는 기법으로, 해당 변수는 고려하지 않도록 만드는 방법임.
  • 대규모 데이터가 결측되었을 떄 사용하는 방법이다.
  • 그러나 중요한 데이터일 수도 있으니까 신중하게 해야함.

행 삭제 방법:

  • 결측값이 있는 행만 삭제하는 방법임.
  • 데이터 일부가 결측되었을 때 사용하는 방법이다.
  • 이 또한 중요한 데이터가 삭제되는 것일 수도 있음.

대치하는 방법:

  • 특정 값으로 대치하는 방법이다.
  • 어떤 값으로 대치할지 결정하는게 어렵긴함.

일반적인 대치 방법:

  • 기본값, 평균, 중앙값(median), 최빈값(mode) 로 채우는 걸 말함.
  • 예: 7월 온도 데이터에서 일부 날짜 데이터에 온도 값이 결측되었을 경우에 평균값으로 넣는 건 합리적임.

결측값을 사용하지 않는 데이터로 대치하는 방법:

  • 비어있는 값을 채우기 위해서 사용하는 방법이고, 결측값을 다른 가능한 값으로는 대치하지 않는 방법임.
  • 결측값 자체가 의미가 있을 수 있으므로 이를 그대로 이용하는 방식임.

 

 

Q) 결측된 데이터는 학습에 사용될 수 있나? 아니면 무조건 결측값은 삭제하거나, 대치해야하는건가?

 

일부 모델은 결측된 데이터 그대로 이용해서 학습에 사용할 수 있다. 그러나 다른 모델들은 결측값 처리를 해야하는 경우도 있음.

 

그리고 결측이 되었다는 정보를 피처로 만들어서 사용하는 방법도 있다.

 

이 방법은 결측 여부 자체가 중요한 의미를 가지고 있으므로, 모델이 학습을 하길 바라는 점 때문임.

 

예를 들어, 어떤 변수 X에 대해 결측값이 있다면, 해당 데이터 포인트에서 새로운 변수 X_missing을 생성하고 1(또는 True)로 설정하는거. 만약 X의 값이 결측되지 않았다면, X_missing은 0(또는 False)으로 설정될거임.

 

 

스케일링(Scaling)

피처를 스케일링해야하는 이유는 모델이 숫자의 크기가 큰 쪽을 더 중요하게 생각하기 떄문임.

  • 예시: 주택 구매 여부 예측에서 소득의 숫자와 연령의 숫자는 범위가 다를 거임. 이걸 그대로 사용하면 소득의 숫자를 압도적으로 더 중요하게 생각함.

따라서 각 피처를 유사한 범위로 스케일링 하는게 중요함.

 

피처를 조정하는 방법은 다양하게 있음.

  • 표준화 (Standardization)
  • 정규화 (Normalization)
  • 로그 변환 (Log Transformation)
  • 최대 절대값 스케일링 (Max Abs Scaling)
  • 로버스트 스케일링 (Robust Scaling)

표준회:

  • 데이터에서 평균을 빼고 표준편차로 나누어, 결과적으로 평균이 0이고 분산이 1인 데이터 분포를 만드는 방법임
  • 표준화는 데이터의 스케일을 조정할 뿐만 아니라, 이상치에 덜 민감하고, 데이터가 정규 분포를 따르지 않을 때 유용하다.
  • 새로운 값 = (원래 값 - 평균) / 표준편차

정규화 (Normalization):

  • 정규화는 데이터를 특정 범위(보통 0과 1 사이)로 조정하는 방법임.
  • 정규화는 모든 피처의 스케일을 동일하게 맞추고 싶을 때, 특히 거리 기반의 알고리즘을 사용할 때 사용함.
  • 새로운 값 = (원래 값 - 최소값) / (최대값 - 최소값)

로그 변환 (Log Transformation):

  • 데이터의 스케일을 줄이고, 이상치의 영향을 감소시키며, 데이터의 분포를 정규 분포에 가깝게 만드는 데 도움이 됨.
  • 데이터가 오른쪽으로 긴 꼬리를 가진 분포(긍정적인 왜도)를 가질 때 특히 유용함.
  • 새로운 값 = log(원래 값)

최대 절대값 스케일링 (Max Abs Scaling):

  • 피처의 절대값 중 최대값으로 나누어, 데이터를 [-1, 1] 범위 안으로 조정하는 방법.
  • 정규화보다는 이 방법이 더 잘 작동한다고 함.
  • 데이터가 이미 중심이 0 주위에 있을 때 유용하다고 함.
  • 새로운 값 = 원래 값 / |최대값|

로버스트 스케일링 (Robust Scaling):

  • 중앙값과 사분위수를 사용하여 이상치의 영향을 최소화하면서 데이터를 스케일링하는 방법.
  • 이 방법은 이상치가 있는 데이터에 적합함.
  • 새로운 값 = (원래 값 - 중앙값) / IQR

 

 

Q) 피처를 스케일링 해야하는 이유로는 큰 숫자를 가진 데이터가 더 중요하게 다뤄지기 때문이라고 한다. 왜 이게 더 모델이 중요하게 생각하는거지?

 

그래디언트 기반 모델 (e.g 선형 회귀, 로지스틱 회귀, 신경망) 기준으로 생각해보면 그레디언트의 계산 방식과 밀접하게 관련이 있기 때문임.

 

모델의 파라미터를 업데이트하는 과정에서 그레디언트(비용 함수의 기울기)를 사용하는데, 이때 피처 값의 크기가 그레디언트의 크기에 직접적인 영향을 미침

 

모델의 비용 함수는 보통 실제 값과 모델이 예측한 값의 차이에 기반함. 이 차이를 최소화하기 위해 비용 함수의 그레디언트를 계산하고, 이를 사용하여 모델 파라미터를 조정한다.

 

큰 숫자를 가진 피처는 비용 함수와 그레디언트 계산에 있어서 비교적 더 큰 변화와 기울기를 생성하게 되며, 이로 인해 학습 과정에 더 큰 영향을 미치게 됨.

 

그래서 이걸 위주로 조정하다 보니까 다른 피처는 중요하게 생각을 하지 않는거지.

 

 

Q) 스케일링에서 고려사항은 없음?

 

스케일링에서 고려사항:

  • 데이터 누수의 원인이 될 수 있음.

데이터 누수란?

  • 데이터 누수(Data Leakage)의 핵심은 학습 과정에서 모델이 본래 학습하면서 만나지 못했어야 할 정보, 즉 테스트 데이터셋이나 검증 데이터셋의 정보를 미리 "만나게" 되는 상황을 말함.

데이터 누수를 방지하기 위한 방법:

  • 스케일링은 데이터 분할 이후에 사용하는 것.

 

 

Q) 스케일링을 할 때 전체 데이터셋의 통계치를 사용하는 경우가 왜 문제가 되는건가?

 

테스트 데이터 셋을 사용하는 이유는 모델의 일반화 능력을 보는 거임. 그러니까 새로운 데이터를 보았을 때 모델의 예측 능력을 보는거지.

 

근데 전역 데이터셋의 통계치를 사용하게 되는 경우에는 테스트 데이터를 포함한 통계치를 이용해서 학습을 하는거니까, 간접적으로 테스트 데이터의 범위를 포함해서 학습을 하게 되는 것.

 

그래서 테스트 데이터에서는 그렇게 낯선 범위의 데이터가 아닐 거이므로 성능이 꽤 준수하게 나올거임. 진짜 새로운 데이터들보다.

 

그러나 훈련 데이터로 통계치를 사용하게 되면 테스트 데이터는 낯설게 볼 수 있으므로 모델의 일반화 능력을 보다 잘 평가하게 될 수 있음.

 

 

Q) 스케일링에서 정규 분포로 만드는 방법은 없음?

 

여러가지 방법이 있음:

  • 로그 변환 (Log Transformation):
    • 데이터가 오른쪽으로 긴 꼬리를 가질 때 사용하면 좋음
  • 제곱근 변환 (Square Root Transformation):
    • 로그 변환과 유사하지만, 제곱근 변환은 로그 변환보다 덜 강력하다고 함. 주로 카운트 데이터에 유용함.
  • 역수 변환 (Reciprocal Transformation):
    • 데이터의 역수를 취하는 변환 방법임. 이 방법 역시 데이터의 분포를 더 대칭적으로 만드는 데 도움을 줄 수 있음.
  • Box-Cox 변환:
    • 데이터를 정규 분포에 가깝게 만들기 위해 사용할 수 있는 더 일반적인 변환 방법임.
    • 양수 데이터에만 적용 가능.
  • Yeo-Johnson 변환:
    • Yeo-Johnson 변환은 양수뿐만 아니라 음수 데이터에도 적용 가능.
  • Shapiro-Wilk test와 같은 통계적 검정을 사용하여 데이터의 정규성을 평가할 수 있음. 이 방법으로 정규 분포가 잘 되었는지 검증 가능.

 

 

Q) 표준화는 왜 정규 분포를 따르지 않을 때 유용한건데?

 

정규 분포를 따르지 않는 데이터도 스케일링을 해야하는데 이런 경우에 적용할 수 있는 방법이라서.

 

정규 분포는 다음과 같은 특성이 있는 경우인데, 이런 경우가 아닌 데이터도 스케일링을 해야하니:

  • 대칭성(Symmetry): 정규 분포는 평균을 중심으로 좌우 대칭인 형태를 가짐.
  • 종 모양의 곡선(Bell-shaped curve): 정규 분포는 그래프 상에서 종 모양의 곡선이 그려짐. 이 곡선은 중앙에서 가장 높고, 양쪽 끝으로 갈수록 점점 낮아지는 특징을 보임.
  • 정규 분포에서는 평균, 중앙값, 최빈값이 모두 같으며, 분포의 중심에 위치함.

 

 

이산화(Discretization)

연속적인 값을 가진 데이터를 이산적인 값으로 변환하는 과정을 말함.

 

이 경우는 훈련 데이터가 제한된 경우에 더 유용하다. (적은 데이터로 패턴을 파악하기 더 쉬우니까)

 

 

Q) 이산화를 왜 하는건데?

 

연속적인 데이터를 범주형 데이터로 변환해서 더 모델이 학습하기 쉽게 만들려고.

 

예를 들면 환자의 연령을 기반으로 특정 질병의 발병 위험도를 예측하고자 할 때 환자의 연령을 연속적인 값으로 사용하는 대신, "어린이(0-12)", "청소년(13-19)", "성인(20-64)", "노인(65+)"과 같이 범주형 변수로 변환하면 더 명확하게 학습을 할 수 있다.

 

 

Q) 이산화에서 고려해야 할 점은?

 

경계값에서 특히 주의가 필요함. 위의 예시를 기준으로 64세의 나이는 성인으로 분류되는 것보다 노인으로 분류되는게 더 정확할 수 있음.

그렇다고 너무 구간을 잘게 나누는 건 모델의 복잡도를 늘릴 수도 있음.

 

 

범주형 피처 인코딩

범주형 데이터를 모델이 처리할 수 있는 수치형 데이터로 변환하는 과정을 말함.

 

범주형 데이터는 '정적' 이 아니고 계속해서 늘어날 수 있기 때문임. 범주형 데이터는 계속 늘어나는데, 모델은 이를 이를 알지 못하는 경우라면 해당 데이터는 피처에 포함되지 않으니까, 예측이 안될 수 있기 때문.

 

예를 들면 200만개 브랜드가 있다라고 했을 때, 새로운 브랜드가 데이터로 추가되면 모델은 새로운 브랜드를 인코딩할 수 없게 될 수 있다:

  • 인코딩은 범주형 데이터를 머신러닝 모델이 이해하고 처리할 수 있는 형태로 변환하는 걸 말함.

 

그렇다고 새로운 범주형 데이터를 UNKNOWN 이라고 인코딩하게 되면 해당 브랜드들은 추천이 안되는 문제가 발생함.

 

 

Q) 그럼 동적으로 계속 변경될 수 있는 범주형 데이터는 어떻게 처리해야하는데?

 

대표적인 기법으로 해싱 트릭이 있음.

 

해싱 함수를 사용하여 각 범주를 고정된 크기의 벡터로 변환하는 걸 말함.

 

그러니까 새로운 범주가 들어오더라도 해싱 함수를 통해 변경되서 인코딩 될 수 있음.

 

그러나 해싱 충돌이 발생하는 경우가 생길 수 있다. 이 경우에는 두 다른 범주가 같은 데이터 값을 가지므로 모델이 예측하는데 영향을 줄 수 있음.

 

그치만 이 정도의 충돌 만으로 모델 예측이 틀리는 경우는 거의 없기 떄문에 문제 없다고 함.

 

그리고 유사한 범주는 서로 가까운 값으로 해시되는 지역 민감 해싱(locality-sensitive hasing) 이라는 기법을 사용하기도 한다.

 

 

교차 피처 (Cross Feature)

두 개 이상의 피처를 결합하여 새로운 피처를 생성하는 과정을 말함.

 

 

Q) 왜 피처를 교차해서 새로운 피처를 만드는거지?

 

모델이 데이터의 비선형 관계와 상호작용을 더 잘 학습할 수 있도록 도와줌.

 

교차 피처는 특히 선형 모델이나 기타 비선형 패턴을 내재적으로 학습하지 못하는 모델에서 유용하게 사용됨.

 

그리고 일부 피처는 단독으로 사용될 때보다 다른 피처와 결합됐을 때 더 많은 정보를 제공하기도 함.

 

예를 들면 부동산의 가격을 결정하는 여러 요소 중에서 "위치"와 "주택 크기"라는 두 피처를 주목할 수 있음.

  • "위치" 피처: 도심, 교외, 시골
  • "주택 크기" 피처: 작음, 중간, 큼

 

위치와 주택 크기 각각 교차 피처 전에는 독립적인 피처로서 가중치를 줄 수 있음.

 

그치만 이걸 교차 피처로 만들면 "도심에서의 큰 주택", "시골에서의 큰 주택" 이런 값들이 만들어질텐데, "도심에서의 큰 주택" 에 더 많은 프리미엄 (= 가중치) 를 줄 수 있음.

 

또 다른 예시를 들면 향후 12개월 내 주택 구매 여부 예측을 하는 경우에서, 혼인 상태와 자녀 수 사이를 교차 피처로 만들면 미혼인 상태에서 자녀 수가 있는 것보다, 기혼 인 상태에서 자녀 수가 있는 것에 더 많은 가중치를 줄 수 있음.

 

즉 특정 조건을 만족하는 경우에 추가적인 가치(프리미엄)를 반영하고 싶을 때 교차 피처를 활용할 수 있는 것.

 

 

Q) 비선형 관계를 모델링하기 위해서 교차 피처를 사용한다고 했는데 이게 왜 중요한데? 비선형 관계 패턴는 파악하기 어려워서인가?

 

실제 세계의 많은 데이터와 현상이 비선형적인 패턴을 보이는데 비선형 관계를 모델링할 수 있으면, 데이터의 복잡성과 다양성을 더 잘 이해하고 예측할 수 있다고 함.

 

 

Q) 피처 교차에서의 주의할 점은?

 

피처 수가 폭발적으로 증가할 수 있다는 것.

 

피처 A 와 피처 B 를 이용해서 교차 피처를 하면 둘의 곱 만큼 가능한 경우의 수가 생긴다.

 

그럼 이런 경우의 수에서 복잡한 패턴을 파악하려면 각 경우의 수 마다 충분한 데이터가 주어져야 하므로 엄청 많은 데이터가 필요할 수 있다.

 

 

위치 피처 (Positional Feature)

위치 데이터를 고차원에서 저차원 벡터로 매핑하는 기술임.

 

위치의 복잡한 속성과 관계를 간결하게 표현하는게 가능.

 

위치 임베딩의 주된 목적은 지리적 위치의 복잡한 관계와 속성을 수치화된 벡터 형태로 요약하여 머신러닝 모델이 이해할 수 있도록 만드는 거.

 

예시: 허깅 페이스의 BERT(Transformer 기반의 모델)에서 위치 임베딩(position embedding)은 입력된 텍스트의 각 토큰이 문장 내에서 어디에 위치하는지 모델에게 알려주는 역할이 필요함

  • 단어의 순서가 중요함. (개가 아이를 물다와, 아이가 개를 물다는 의미가 다르니까)
  • 트랜스포머 계열 모델은 단어의 순서가 병렬로 처리되니까 이렇게 단어의 위치에 대해서 알려줘야한다고 함.

 

 

피처와 피처 스토어의 차이는?

피처:

  • 모델에서 사용되는 입력 변수를 의미. 피처는 원시 데이터에서 추출하거나 파생된 속성이며, 모델이 학습하고 예측을 수행하는 데 사용되는 정보임.
  • 고객의 연령, 구매 이력, 웹사이트에서의 클릭 행동 등이 고객 이탈 예측 모델의 피처가 될 수 있음.

피처 스토어:

  • 머신러닝 피처를 중앙화하여 저장하고 관리하는 시스템이라고 함.
  • 피처 스토어는 피처의 저장, 버전 관리, 검색, 접근 제어 등을 포함한 피처 관리의 전 과정을 담당함.
  • 피처 스토어의 주된 목적은 피처의 재사용성을 높이고, 피처 생성과 사용 과정에서의 일관성을 유지하며, 모델 학습과 서빙 과정에서 피처의 동기화를 보장하는 것.

 

 

Q) 피처 스토어는 그럼 모델이 사용하는 피처들을 저장해두는거?

 

그렇다.

 

모델이 고객의 구매 예측을 위해 사용하는 피처들, 예를 들어 고객의 나이, 구매 이력, 활동 로그 등을 피처 스토어에 저장한다.

 

모델 개발 시, 데이터 사이언티스트는 이 피처 스토어에서 필요한 피처를 선택하여 모델 학습에 사용한다.

 

또한, 모델이 실제 운영 환경에서 예측을 수행할 때도, 피처 스토어에서 해당 피처를 조회하여 사용한다.

 

 

Q) 피처의 재사용성을 높인다는 건 유사한 모델이 같은 피처를 사용하도록 하는건가?

 

그렇다.

 

피처를 재사용함으로써, 데이터 과학자와 개발자는 피처를 처음부터 생성하는 데 필요한 시간과 노력을 줄일 수 있음.

 

 

Q) 피처의 버전 관리라는 건 모델의 버전에 맞춰서 사용하는 피처들이 무엇인지 나타내기 위한건가?

 

피처의 버전 관리는 모델의 버전뿐만 아니라, 데이터 변화와 피처 엔지니어링 과정의 변화를 추적하고 관리하기 위한 과정임.

 

이는 모델 버전에 맞춰 사용하는 피처들이 무엇인지 나타내는 것을 포함하며, 이보다 더 넓은 의미를 가짐.

 

피처 버전 관리의 중요성:

  • 데이터 과학 프로젝트에서 모델의 성능을 재현하거나, 과거의 실험 결과를 검증하기 위해서는 동일한 데이터와 피처 세트를 사용해야 함.
  • 데이터 파이프라인에서 데이터가 업데이트되거나, 피처 엔지니어링 과정에 변경이 있을 때, 피처의 버전을 관리함으로써 모델 학습과 예측에서의 일관성을 유지할 수 있음.

 

 

Q) 모델 운영에서도 피처 스토어를 쓴다는 건 사용자의 데이터를 모델에 바로 입력하는게 아니라 피처 스토어에서 검색한 후 필터링 한 후 모델에 입력 데이터로 넣어준다는건가?

 

모델 운영(또는 모델 서빙)에서 피처 스토어를 사용하는 것은 사용자의 데이터를 모델에 직접 입력하기 전에, 필요한 피처를 피처 스토어에서 검색하고 준비하는 과정을 포함하는 것.

 

이 과정은 실시간 예측이나 배치 예측에서 모델의 입력 데이터로 사용할 피처를 효율적이고 일관된 방식으로 제공하기 위해 필요함.

 

 

데이터 누수는?

좁은 의미의 데이터 누수 문제:

  • 학습 데이터가 테스트 데이터나 미래의 데이터에 대한 정보를 포함하고 있어서, 모델이 실제보다 더 좋은 성능을 보이는 것처럼 착각하게 만드는 문제를 의미함.

이보다 넓은 의미의 데이터 누수 문제:

  • 부적절한 정보나 관련없는 정보를 통해서 모델이 학습해서 이를 이용해 예측하는 것.
    • 모델이 잘못된 신호나 상관관계에 기반해 예측을 수행하게 되는 것.
    • 예: 환자의 자세를 바탕으로 코로나를 예측하는 것. (환자가 누워있다 -> 중상이다! 코로나다!)
  • 모델이 학습 단계에서 특정 환경적, 컨텍스트적 요소에 의존하여 학습함으로써, 다른 환경에서의 일반화 능력이 떨어지는 형태:
    • 예: 폐 CT 스캔에서 암 징후를 예측하는 ML 모델을 구축하려고 한다. A 병원에서 데이터를 가져온 뒤 의사ㅈ의 진단을 제거해서 모델을 훈련헀음. A 병원 데이터에서는 아주 좋은 결과를 냈지만 B 병원에서는 좋은 결과가 나오지 않았음. 이 이유로는 A 병원에서는 환자가 암이라고 생각했을 때 더 좋은 장비로 데이터를 생성하기 때문임. B 병원에서는 일관된 장비로 찍은 반면에

 

 

데이터 누수를 방지하는 방법은?

여러가지 방법들이 있다 하나씩 살펴보자.

 

 

시간 상관 관게가 있는 시스템에서 데이터를 무작위로 분할하는 경우

무작위로 데이터를 분할하면 데이터 누수가 생길 수 있다.

 

주식 가격 예측 시스템을 생각해보면 된다.

 

과거의 데이터로 미래의 가격을 예측하도록 만들어야하는데, 훈련 데이터에 미래의 가격 데이터가 섞이면 안됨. 이러면 답지를 유출하는 거라서 모델의 일반화 능력이 떨어짐.

 

이 예시와는 다르게 상관관계가 안보이는 유형의 데이터들도 있다.

 

음악 추천이 바로 그거인데, 가수가 죽으면 해당 가수의 노래가 그 날의 트렌드가 되거나, 특정 이벤트가 생기면 그날 음악은 특정한 패턴을 띄게된다.

 

그러므로 이런 경우에는 무작위로 분할을 시키지 말고 그 날짜의 데이터를 그대로 가져와서 학습시키는게 낫다. 그러면 다음에 비슷한 패턴을 더 잘 맞출 것.

 

 

분할 전 스케일링을 수행한 경우

항상 스케일링 전에는 분할을 먼저해야하고, 분할된 데이터의 통계치를 가지고 스케일링을 해야함.

 

전체 데이터셋 (= 훈련 + 검증 + 테스트) 의 통계치를 가지고 학습하게되면 모델의 일반화 능력이 떨어질 것.

 

 

분할 전 데이터 중복을 처리하지 않는 경우

훈련 데이터와 테스트 데이터간의 중복이 발생한다고 하면 모델이 실제로는 학습해서는 안 될 정보를 학습하게 만들어 모델의 일반화 능력을 과대평가하게 할 수 있게 됨.

 

그러므로 데이터 중복은 없도록 만들어야 함.

 

 

그룹 누수

데이터 중복과 비슷하게 강한 상관관계를 가지는 두 데이터들이 하나는 테스트 셋으로, 하나는 훈련 셋으로 들어가게 되면 이 또한 데이터 누수가 발생하는 거임.

 

예를 들면 폐 CT 를 일주일에 두 번 찍었는데, 하나는 훈련 데이터로, 다른 하나는 테스트 데이터로 들어간 경우

 

 

데이터 생성 과정에서 누수가 생긴 경우

이전에 본 넓은 의미의 데이터 누수 예시처럼 CT 장비가 달라서 하나의 병원에서는 잘 예측이 되지만, 다른 병원에서는 예측이 안되는 경우.

그러니까 환경이나 외부 컨택스트 요인에 데이터가 의존이 생기는 경우에는 모델의 일반화 능력이 떨어진다.

 

이런 문제를 해결하려면 데이터 수집 과정에 대해서 정확하게 이해해야함. 수집 과정에서 누수가 생길 수 있기 때문에.

  • 그리고 이 과정에 대해 논의할 땐 도메인 전문가를 포함시켜야한다. 잊지마라.

 

 

데이터 누수를 검출하는 방법

데이터 누수를 검출하는 방법:

  • 과도하게 높은 성능 지표:
    • 피처 집합을 사용한 모델의 학습 데이터에 대한 정확도, 정밀도, 재현율, F1 점수 등의 성능 지표가 현실적으로 기대할 수 있는 범위를 크게 초과하는 경우, 데이터 누수를 의심해 볼 필요가 있다.
  • 학습 세트의 성능이 지나치게 높은 경우:
    • 상관없는 데이터를 학습해서 패턴을 발견하게 된다면 학습 데이터에서 지나치게 높은 성능을 달성할 수 있고 이것도 넓은 의미의 데이터 누수라고 볼 수 있음.
    • 물론 이건 과적합도 생각해봐야함.
  • 테스트 데이터 성능이 지나치게 높은 경우:
    • 미래나 테스트 데이터가 학습 데이터에 섞인다면 테스트 데이터의 성능이 높을 수 있음.
  • 피처 중요도 분석:
    • 머신러닝 모델의 피처 중요도(feature importance)를 분석하여, 예측에 지나치게 큰 영향을 미치는 피처가 있는지 확인하는 것.

 

Q) 피처 중요도를 분석하는 방법은?

 

많은 머신러닝 알고리즘(예: 랜덤 포레스트, 그래디언트 부스팅, XGBoost 등)은 학습된 모델의 피처 중요도를 직접 제공하기도 함.

 

의심스러운 피처를 모델에서 제거하거나, 정보를 다르게 표현하여 다시 모델을 학습시켜 성능 변화를 관찰하면 됨.

 

SHAP (SHapley Additive exPlanations) 로 분석하는 방법이 있음.

  • 모델에서 피처가 제거될 떄 모델 성능이 얼마나 저하되는지 확인하는 기법

 

 

피처 엔지니어링 모범 사례 (Best Practice) 는?

  1. 별로 중요하지 않는 피처는 제거하는 것:
  • 피처를 제거하면 모델을 서빙할 때 메모리 이점, 레이턴시 이점, 기술 부채 이점 등이 있다.
  • 예: 댓글의 스팸 여부를 따질 때 사용자 식별 아이디 같은 것.
  1. 일반화되어 있는 피처를 사용한다.
  • 모든 피처가 같은 수준으로 일반화되는 것은 아닙니다. 일부 피처는 특정 데이터셋에 과도하게 특화되어 있어 다른 상황이나 조건에서는 도움이 되지 않을 수 있음. 반면, 어떤 피처는 보다 일반적인 정보를 담고 있어 다양한 데이터셋에서 유용하게 사용될 수 있다는 뜻임.
  1. 데이터를 무작위로 분할하는 대신 시간별로 학습, 검증, 테스트 별로 분할할 필요가 있다는 것.
  1. 데이터 오버 샘플링은 분할 이후에 하는 것
  1. 데이터 누수를 방지하기 위해 스케일링과 정규화는 데이터 분할 후에 하는 것
  1. 피처를 스케일링하고 결측값을 처리할 때는 전체 데이터 대신 훈련 분할 통계치만 사용하는 것
  1. 데이터 생성, 수집, 처리 방식을 이해하는 것.
  1. 데이터 계보를 추적하는 것
  • 데이터 계보는 데이터가 어디서 왔는지, 어떻게 변형되었는지, 그리고 어디로 흘러갔는지에 대한 정보를 제공한다.
  • 이를 통해 모델이 일반화 되는 데이터에 의존하는게 아니라 특정 환경과 컨택스트에 데이터가 의존하는 문제를 막을 수 있다.
  • 그리고 데이터 오류나 누락 이상치 등도 더 파악하기 쉬움
  1. 모델에 대한 피처 중요도를 이해하는 것.

'Machine Learning' 카테고리의 다른 글

모델 배포와 예측 서비스  (0) 2024.04.21
모델 개발과 오프라인 평가  (0) 2024.04.15
훈련 데이터  (0) 2024.04.05
데이터 엔지니어링 기초  (0) 2024.04.03
머신러닝 시스템 설계 소개  (0) 2024.04.02

+ Recent posts