고정되지 않은 범주 형 데이터를 사용하여 분류를 수행하려면 어떻게해야합니까?


10

범주 형 데이터와 숫자 형 데이터 모두에 분류 문제가 있습니다. 내가 직면하고있는 문제는 내 범주 데이터가 고정되어 있지 않다는 것입니다. 즉, 예측하려는 레이블을 가진 새로운 후보자가 미리 관찰되지 않은 새로운 범주를 가질 수 있습니다.

예를 들어 내 범주 데이터가 있다면, sex, 유일하게 가능한 라벨이 없을 것 female, male그리고 other, 더 무엇을 중요. 그러나 나의 범주 형 변수는 city내가 예측하려는 사람이 나의 분류자가 보지 못했던 새로운 도시를 가질 수 있다는 것입니다.

이 용어로 분류를 수행 할 수있는 방법이 있는지 또는이 새로운 범주 형 데이터를 고려하여 훈련을 다시 수행해야하는지 궁금합니다.


1
city어떤 기능에 따라 숫자 로 변환 할 수 있습니까? 이와 같이 city' = f(latitude, longitude)모든 도시에 새로운 가치를 창출 할 수 있습니다
Mohammad Athar

@MohammadAthar는 완벽한 솔루션을 제공했으며 OP가 그것을 보길 바랍니다!
Francesco Pegoraro

답변:


11

아주 좋은 질문입니다. 실제로이 문제는 잠시 동안 있었으며 아직 완벽한 해결책을 찾지 못했습니다. 그러나 내 경험을 나누게되어 기쁘다.

  • 가능한 한 핫 인코딩피하십시오 (위에서 제안한 것과 반대로). 추론은 작동하지 않는다는 것입니다. 하나의 핫 인코딩 기능이있는 모델은 해당 하위 수준이 모두 훈련 데이터에 존재하는 경우에만 작동합니다. 수동으로 조정하지 않으면 모델에서 예측을 수행 할 수 없습니다. 검색하면 데이터를 기차 / 테스트로 분할 할 때 많은 사람들이이 문제에 부딪 히고 특정 기능의 일부 하위 레벨 문제가 교육 분할에 존재하지 않아서 테스트에 대한 예측을 수행하지 못한 것을 발견 할 수 있습니다. 또한, 추기경 기능이 매우 높은 경우 (도시 이름이 200 인 도시와 같이) 불필요하게 데이터의 차원이 증가합니다! 어떤 이유로 one-hot-encoding을 수행해야하는 경우이를 염두에 두십시오.
  • 다른 인코딩 방법을 사용하십시오 . 어쩌면 적어도 목표 기반 코딩, 해싱과 같은 시간 동안이 문제에 강력한 다른 방법에 대해 더 많이 배우십시오 (아래 참조 참조). Python을 사용하는 경우 mant 인코딩 옵션을 제공 하는 멋진 패키지가 있습니다. 다른 간단한 방법이 종종 잘 작동한다는 사실에 놀랄 수도 있습니다.

  • 모델을 재교육하십시오 . 이론적으로 기차 / 세트를 학습 할 때 같은 분포를 가져야합니다 (주로 이것은 목표 분포로 생각되지만 변수에 대해서도 사실 일 수 있습니다). 새로운 아이템이 등장함에 따라 테스트 (보이지 않는) 데이터 배포가 변경되었습니다. 그런 다음 새로운 도시를 설명 할 수 있도록 모델을 다시 훈련 시키는 것이 가장 좋습니다 .

  • 새로 추가 된 하위 카테고리 (및 가장 빈번한 카테고리)를 기타에 배치하십시오 . 이론적으로는 요점은 사실이지만, (특정 범주의) 시험 분포는 대부분의 경우에 급격히 변하지 않을 것입니다. 아마도 귀하의 경우와 같이 도시 기능에 100 개의 도시가있을 수 있으며 시간이 지남에 따라 새로운 도시가 거의 없습니다. 내가 고려할 것은 특정 범주의 X-quantile을 살펴보고 가장 빈번한 항목을 Others 하위 범주에 넣는 것 입니다. 새로 추가 된 데이터 포인트를 가정에만 조금, 아주 많이 들어가는 것입니다 기타그룹. 이 작업을 수행하면 입도 수준을 확실히 잃을 수 있지만 학습의 요점은 모델이 학습 데이터를 학습 할뿐만 아니라 보이지 않는 데이터와 새로 추가 된 카테고리에 대해 매우 잘 일반화 할 수 있다는 점입니다. 데이터 포인트가 매우 높으며 기타 그룹 으로 그룹화하면 아프지 않습니다.

  • Cat2Vec (NLP의 Word2Vec에서 차용) 또는 유사성 인코딩 과 같은 다른 최근의 아직 개발되지 않은 솔루션 . 이들은 매우 최근의 수표 용지를 이전하고 대한 github에(Word2Vec 기준) 예를 Kaggle에서,이 종이 후자와에 대한 구현을 . 전자의 개념은 카테고리를 벡터로 변환하는 것입니다. 내가 말해야 할만 큼 실제로 작동하는 것이 합리적이지만 사용 경험이 없습니다. 후자 ( dirty_cat )는 매우 유망하고 사용하기 쉬운 것처럼 보입니다. 테스트 데이터에서 보이지 않는 기본 범주를 갖는 것이 강력한 지 여부는 분명하지 않습니다!

추신 : 첫 번째 의견에서 주어진 지리적 위치에 대한 도시의 아이디어는 정말 좋으며 Google 또는 HERE의 많은 Python API이기 때문에 실제로 그렇게 복잡하지는 않습니다. 그러나 이것은 새로운 기능을 엔지니어링하는 방법 일 뿐이며 도시 기능 자체로 대체되지는 않습니다.

첫 번째 , 두 번째 , 세 번째 , 번째 확인에 대한 흥미로운 참조 (특별한 순서는 없습니다!)

위에서 언급 한 모든 요점은 이론적으로는 정확하고 실질적인 해결책이며 추가 논의가 필요합니다. 그리고 더 많은 것을 배우게되어 기쁩니다.


1
비슷한 도시의 클러스터를 만드는 것은 어떻습니까? 새 도시가 있더라도 이미 가지고있는 도시와 다를 바없이 가장 가까운 도시와 교차 점검 할 수 있습니까?
Aditya

즐거움 Aditya. 그것은 또 다른 훌륭한 아이디어입니다. 새로운 "유사성 인코딩"에 대해 잘 모르겠습니다. 정확히 같은 일을하는 경우 일 수 있습니다. 튜토리얼을 확인하십시오. 또한 모든 거리가 숫자 값과 유사한 의미를 갖지 않은 경우 k 모드와 같은 범주 형 데이터에 클러스터링을 사용할 때주의해야합니다.
TwinPenguins

좋은 답변 감사합니다. 재교육은 어떻게합니까? 나는 새로운 후보자가 있다고 상상하고 그가 좋은지 나쁜지를 예측하고 싶습니다. 좋은지 아닌지를 나타내는 진정한 라벨이 없으면 어떻게 모델을 다시 훈련시킬 수 있습니까? 재교육을 수행하기 위해이 새로운 데이터를 포함하는 방법을 보지 못했고 예측 지점이 누락 될 것입니다. 내가 잘못?
Marisa

아니에요. 재교육 정보 : 문자 그대로 다시 시작하고 모든 데이터를 혼합하여 새로운 데이터가 있는지 확인한 후 다시 학습하는 것을 의미합니다. 당신이 언급 한 다른 요점은 당신이 그 특정한 새로운 데이터 포인트에 대한 진정한 라벨을 가지고 있지 않다는 것입니다. 이것은 그 자체로 매우 다른 이야기입니다. 이 데이터 포인트에 레이블을 지정하기 위해 할 수있는 일은 가장 유사한 데이터 포인트를 찾고 매우 간단한 KNN 알고리즘처럼 레이블을 가져옵니다.
TwinPenguins

4

가장 간단한 작업 (보통 시작하기에 좋은 장소)은 모든 도시가 하나의 지형지 물이되고 1 (사람이 그 도시 출신) 또는 0 (아님이 아닌 도시)의 도시를 한 번 핫 인코딩하는 것입니다. 그 도시). 훈련 세트에없는 시험 세트에 새로운 도시가 나타나면 그 사람은 훈련 세트의 모든 도시에 대해 0을 갖습니다. 이것은 이상하게 보일지 모르지만, 해당 도시가 훈련 세트에 없다면, 그 도시 출신 사람이 체중이 없어야합니다.

다음 단계는 모하마드 아 타르가 제안한 내용을 따르고 훈련 세트의 다른 도시와 지리적으로 근접한 아이디어를 얻는 것입니다. 그것은 훨씬 더 복잡해질 것이므로 다른 사람이 그것에 대해 언급하게 할 것입니다.


간단하게 시작하여 성장하는 것이 좋습니다.
Escachator

0

당신은 체크 아웃해야 Vowpal Wabbit 매우 멋지게 사용하여 새로운 기능을 처리, 해시 트릭 및 적응 학습 속도를.

새로운 기능 (트레인 또는 테스트 시간)이 나타날 때 충돌하지 않을뿐만 아니라 가중치 업데이트도 시작됩니다. 그것의 사악한 금식. 그러나 선형 모델의 변형 만 구현하므로 그쪽으로 제한됩니다. 알아야 할 매우 강력한 도구

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.