특징 해시(Hashed Feature)

Everafter·2022년 10월 25일
0

ML Study 2022

목록 보기
5/10

특징 해시(Hashed feature)

문제

카테고리형 입력 변수를 원-핫 인코딩으로 처리할 때 다음과 같은 문제가 발생할 수 있다.

  • 어휘의 불완전성

    전체 데이터 중 학습용으로 무작위 선별된 데이터에 모든 어휘가 포함된다는 보장이 없다.

  • 큰 카디널리티

    길이가 수천에서 수백만에 이르는 특징 벡터를 사용할 경우 필요한 가중치가 많아져 학습 데이터가 부족해지고, 모델의 크기가 커지므로 배포 시에도 문제가 발생한다.

  • 콜드 스타트

    모델이 프로덕션에 배포된 후에도 새로운 어휘를 포함한 데이터가 지속 유입될 수 있다. 기존의 모델은 별도의 서빙 인프라를 준비하지 않는 한 이에 대응할 수 없다.

예로, 비행기의 도착 지연을 예측하는 문제를 가정하자. 입력 데이터로 출발 공항이 있다. 데이터셋 수집 당시 347개의 공항이 있었다고 하면

  1. 수집 기간 내 각 공항의 비행기가 가능한 모든 비행을 수행하지 않았을 것이다. 따라서 누락된 출발 공항이 있을 수 있다.

  2. 347은 특징 벡터로서는 굉장히 큰 크기다.

  3. 수집 기간 이후 새로운 공항이 얼마든지 지어질 수 있다.

위와 같은 문제점이 발생한다.

솔루션

특징 해시 디자인 패턴을 이용한다.

  • 카테고리 입력을 고유한 문자열로 변환한다.
  • 문자열에 대해 결정론적 및 이식 가능한 해시 알고리즘을 호출한다.
  • 해시 결과를 원하는 버킷 수로 나누고 나머지를 취한다.
tf.feature_column.categorical_column_with_hash_bucket(
	airtport, num_buckets, dtype=tf.dtypes.string)

작동 원리

10개의 버킷을 이용해(hash10) 공항 코드를 해시했다고 가정하자.

  • 어휘 외 입력

    학습 데이터셋에 누락된 어휘가 있더라도 해시된 특징값은 무조건적으로 범위 내(0~9)에 포함되게 된다. 입력에 포함되지 않았던 공항은 같은 버킷 내 다른 공항에 해당하는 예측을 가져오게 된다. 서빙 과정에서 모델에 오류는 발생하지 않는다.

  • 큰 카디널리티

    수백만의 카디널리티를 가지는 데이터라도 수백개의 버킷으로 해시하면 모델 크기를 실용적으로 유지할 수 있다.

  • 콜드 스타트

    어휘 외 입력의 상황과 유사하다. 추가로 유입되는 데이터 모두 수용 가능하다.

트레이드오프와 대안

  • 버킷 충돌

    해시 버킷의 수는 보통 카디널리티보다 작으므로 서로 다른 어휘가 동일한 버킷을 공유하게 되는데, 이것이 버킷 충돌(Bucket collision)이다. 해시 버킷은 서술한 3개의 문제 해결을 위해 데이터 표현의 정확도를 명백히 손상시키는 방법이다. 이러한 트레이드오프가 있기 때문에, 사전에 가능한 모든 어휘를 알거나, 카디널리티가 작거나, 콜드스타트가 문제되지 않으면 특징 해시를 쓰지 않는것이 좋다.

    확률적으로, 버킷 수를 아무리 늘리더라도 버킷 충돌을 피하기는 어렵다. 예로 347개의 공항을 100000개의 버킷에 담는다고 해도 최소 2개의 공항이 동일한 버킷에 들어갈 확률은 45% 이상이다.

따라서 특징 해시는 동일한 해시 버킷값을 공유하는 것이 허용되는 경우에만 사용해야 한다.

  • 왜도

    카테고리형 입력의 분포가 많이 치우쳐진 경우, 즉 왜도(skew)가 높으면 정확도 손실이 심해진다. 예로, 특정 공항을 출발 공항으로 하는 데이터셋이 압도적으로 많은 경우, 그 공항과 함께 버킷으로 묶인 다른 공항의 데이터 손실이 예상된다.

  • 특징 집계

    분포가 치우쳐져 있거나 버킷 수가 적어 데이터 정확도 손실이 큰 경우 특징 집계(aggregate)을 추가하는 것이 도움이 될 수 있다. 예로 모든 공항에 대해 ‘정시 비행 확률’을 계산해 새로운 특징으로 모델에 추가 할 수 있다. 이로서 개별 공항에 대한 데이터 손실을 방지하고 경우에 따라 특징 해시를 대체할 수 도 있다.

  • 이진 인코딩과 암호화 해시

    여러 해시 값들의 버킷 수에 대한 나머지 값을 사용하지 않고 이진 인코딩을 사용하는 방법을 떠올릴 수 있다. 나머지 연산을 하지 않으므로 정확도 손실을 방지할 수 있다. 그러나 이진 인코딩은 카디널리티 문제만 해결하고 콜드 스타트 문제를 해결하진 못한다. 나머지 연산을 수행하지 않는 경우 문자열 간의 관계가 인코딩에 까지 영향을 미쳐 ‘가짜 상관관계’ 문제가 발생한다. 이진 인코딩을 수행해도 이는 마찬가지다.

    MD5 해시와 같은 암호화 해시의 경우 출력이 균일하게 분산되어 인코딩 결과 간에 가짜 상관관계 문제가 발생하지 않는다. 그러나 MD5해시는 결정론적이지 않고, 결과값이 고유하지도 않다. (암호화를 위한 솔트, 단방향 해시) 따라서 특징 해시 디자인 패턴에서는 핑거프린트 해시 알고리즘 사용이 추천된다.

Refer

머신러닝 디자인 패턴

Feature hashing 활용 Kaggle 예제

Category Encoders 라이브러리

0개의 댓글