많은 범주 형 변수로 분류 개선


37

200,000 개 이상의 샘플과 샘플 당 약 50 개의 기능으로 데이터 세트를 작성하고 있습니다. 10 개의 연속 변수와 다른 40 개는 범주 형 변수 (국가, 언어, 과학 분야 등)입니다. 이러한 범주 형 변수의 경우 예를 들어 150 개의 다른 국가, 50 개의 언어, 50 개의 과학 분야 등이 있습니다.

지금까지 내 접근 방식은 다음과 같습니다.

  1. 가능한 값이 많은 각 범주 형 변수에 대해이 값을 갖는 10000 개 이상의 표본이있는 변수 만 사용하십시오. 이것은 150이 아닌 5-10 개의 범주로 줄어 듭니다.

  2. 각 범주 형에 대한 더미 변수를 작성하십시오 (10 개국의 경우 각 샘플에 대해 이진 벡터 크기 10 추가).

  3. 이 데이터를 사용하여 임의의 포리스트 분류 자 ​​(매개 변수를 교차 유효성 검사하는 등)를 제공하십시오.

현재이 접근법을 사용하면 65 %의 정확도 만 얻을 수 있으며 더 많은 것을 할 수 있다고 생각합니다. 특히 나는 1)에 만족하지 않는다. 왜냐하면 그들이 덜 대표되는 값들은 좀 더 차별적 일 수 있기 때문에 그들이 가지고있는 샘플의 수에 따라 "최소 관련 값"을 임의로 제거해서는 안된다고 생각하기 때문에 나는 만족스럽지 않다. 반면, RAM은 가능한 모든 값을 유지하여 500 열 * 200000 행을 데이터에 추가 할 여유가 없습니다.

이 범주 형 변수에 대처할 제안이 있습니까?


2
당신은 여전히 관심이 있다면, 당신은 확인하시기 바랍니다 내 대답차원 축소내 대답계층 적 분류를 .
Aleksandr Blekh 2016 년

1
"각 범주 형 변수에 대해 더미 변수 작성" 이라고 말하면 R이 아닌 Python을 사용하는 것처럼 들립니까? R randomforest는 기본적으로 범주 형을 처리 할 수 ​​있으며 결과적으로 메모리를 줄입니다. R을 시도
smci

답변:


20

1) 임의 포리스트는 기본적으로 범주 형 값을 처리 할 수 ​​있어야하므로 다른 구현을 찾아 해당 기능을 모두 인코딩하고 모든 메모리를 사용하지 않아도됩니다.

2) 높은 카디널리티 범주 기능의 문제점은 해당 기능이 지나치게 적합하다는 것입니다. 이것이 문제가되지는 않지만 충분한 데이터가있을 수 있습니다.

3) Brieman이 제안한 방법 또는 인공 대비를 사용하여 임의의 포리스트 기반 기능 선택을 살펴볼 것을 제안 합니다. 인공 조영법 (ACE)은 기능의 중요성을 일부 카디널리티 문제와 싸우는 섞인 버전 자체의 중요성과 비교하기 때문에 흥미 롭습니다. 상관 관계가 높은 기능 그룹을 인식하는 기능 선택 방법을 사용하기 때문에 더 많은 기능이있는 경우 흥미로울 수있는 "Module Guided Random Forests"라는 새로운 문서가 있습니다.

4) 언젠가 사용되는 또 다른 옵션은 알고리즘을 조정하여 가방 내부 케이스에 스플릿을 장착 한 후 가방 외부 케이스를 사용하여 최종 기능 선택을 수행하는 것입니다.

이 거의 완전한 에이스 구현 여기가 내가 기본적으로 핸들 범주 변수하는 이상의 메모리 effichent / 빠른 RF 구현이 여기가 ... -evaloob 옵션을 지원하는 옵션 4 내가 ACE에 대한 지원을 추가 일하고 있어요 및 기타 RF 몇 기능 선택 방법을 기반으로하지만 아직 완료되지 않았습니다.


4
이러한 모든 제안은 흥미 롭습니다. 무작위 포리스트가 기본적으로 범주 형 변수를 처리해야한다는 데 동의하지만 scikit-learn은 그렇지 않습니다 ... scikit의 주요 결함 중 하나 인 것 같습니다. 데이터에 대한 코드를 시도하여 어떤 일이 발생하는지 확인하고 다른 제안에 대해 살펴 보겠습니다!
Bertrand R

1
R 구현을 시도하십시오. 그것을 실행하는 것은 하나의 라이너입니다. r-bloggers.com/… : 데이터를 읽는 것은 매우 쉽고 매우 빠르고 효율적인 메모리를 구현하는 새로운 병렬 구현이 있습니다. 수업의 균형이 맞지 않습니까? r 구현에서는 균형 잡힌 부트 스트랩 샘플 sampsize = c (x, x)에서 각 트리를 확장 할 수 있습니다. 이것은 나를 위해 더 나은 이진 분류를 생성했습니다. OOB 혼란 매트릭스 R 출력을 사용하여 크기를 조정하고 분류를 매우 쉽게 조정할 수 있습니다.
JEquihua

2
R의 randomForest 구현은 최대 32 레벨의 요인을 허용합니다. scikit-learn은 덜 제한적이며 먼저 더미 변수를 생성합니다 ( pandas.get_dummies함수 참조 ). H2O의 랜덤 포레스트 구현은 실제로 나에게 잘 수행되었습니다 ( 0xdata.com/docs/master/model/rf 참조 ).
Alex Woolford 2016 년

1
임의 포리스트의 새롭고 빠른 구현이 있으며이 패키지를 레인저라고합니다. 정말 좋은 물건. 수십 배 더 빠르며 32 레벨 제한이 없습니다.
marbel

6

카테고리를 두껍게 만드는 대신 왜 각각에 단일 숫자 변수를 사용하지 않습니까? 임의의 숲의 맥락에서, 나는 종종 그렇게하는 결과에 대해 궁금해했습니다. 내가 사용한 RF의 scikit-learn 구현으로), 종종 결과에 차이가 없다는 것을 관찰했습니다 (왜 그런지 잘 모르겠습니다).


1
n <= 3 인 범주 형 피처에는 기본적으로 피처를 범주 형으로 고려하여 동일한 분할을 모두 생성 할 수 있으므로 괜찮습니다. 더 큰 n의 경우 범주 형 분할에 해당하는 분할 세트를 얻을 수 있지만 알고리즘이 효율적으로이를 분할하거나 찾지 못할 수 있습니다. 그러나 피쳐를 n 개의 숫자 피쳐로 분할하면 효율성이 감소합니다. 알고리즘은 분할을 찾을 수 있습니다. 누군가가 scikit-learn 구현에 범주 형 변수 지원을 추가해야합니다.
Ryan Bressler

범주 형 데이터에 서수를 도입하는 것이 의심 스럽다고 말하면 동의합니다. 차라리 그렇게 할 필요는 없지만 최소한 시도해보고 어떤 일이 발생하는지 확인할 수 있습니다!
Bertrand R

4
나는 sklearn 메일 링리스트에서이 질문에 대해 긴 토론을했다 (여기서 mail-archive.com/scikit-learn-general@lists.sourceforge.net/… ). 구현 자 중 한 사람의 의견은 충분히 깊은 나무가 있으면 서수로 인코딩 된 범주 형 기능이 더 계산적으로 효율적일뿐만 아니라 합리적으로 잘 작동 할 수 있다는 것입니다. 어쨌든, 당신이 그것을 시도한다면, 나는 이것이 계속 부딪 치는 문제이기 때문에 당신의 결과 / 결론에 대해 듣고 싶습니다.
cjauvin

1
따라서 범주 형 변수에 단일 숫자 변수를 유지하려고 시도했지만 실제로 이진 항목을 많이 추가하는 것보다 놀랍게 잘 작동하며 훨씬 더 효과적입니다. 평균에 따라 값을 정렬하려고했습니다. . 그리고 그것은 잘 작동합니다
Bertrand R

나는 실제로 그것에 놀라지 않습니다. 그것은 몇 가지 다른 설정에서 관찰 한 것과 일치하지만, 공판의 수에 의해 판단되지만, 이것은 반 직관적 인 아이디어입니다.
cjauvin

5

나는 더 많은 변수 축소 기술을 고려해야한다고 생각합니다 . 그렇게 유창하지 않은 예측 변수를 제거합니다.

나는 데이터 전처리 에 대해 많은 것을 읽었으며 변수의 n °를 줄이는 훌륭한 솔루션입니다.

내 제안은 다음과 같습니다.

  • 위한 질적 변수 , 범주 "누락"로 누락 값을 대체. 데이터가 무작위로 누락되지 않은 경우 편향이 발생할 수 있지만 최소한 모든 관측치가 그대로 유지되며 누락으로 인해 다른 동작이 나타날 수 있습니다.
  • 제로 분산 예측 변수 또는 거의 제로 분산 예측 변수 제거 (Y를 효율적으로 분리 할 수있는 불균형 범주가 높은 더미 변수를 제거하지 않도록주의하십시오. 중요하다고 생각되는 변수에 대한 그래프를 작성하십시오). R에서는 패키지 의 'nzv'기능을 사용할 수 있습니다 'caret'. 이렇게하면 데이터 차원이 크게 줄어 듭니다.
  • 상관 된 예측 변수를 제거합니다 . 범주 형 변수가있을 경우 구성하기에 더 적합하므로 Kendall의 상관 행렬을 사용하십시오 . 단점은 모든 명목 변수를 범주 형 변수로 변환해야한다는 것입니다.
  • 거기에 기능 선택 방법 보다 (- 당신이 ... 등 각 클러스터의 단일 대표, 올가미 회귀를 선택 클러스터링) 자신의 수를 줄일 수 있습니다. 다른 단계로 변수를 100 미만으로 줄 였기 때문에 아직 테스트 할 기회가 없었습니다.

또한 RF 대신 AdaBoost 알고리즘을 사용하는 것이 좋습니다 . 개인적으로, 내가 한 연구는이 두 가지 방법에 대해 매우 유사한 지니 계수를 제공했습니다. AdaBoost의 좋은 점은 R에서는 누락 된 관측 값을 처리한다는 것입니다. 따라서이 목록의 1 단계를 건너 뛸 수 있습니다

조금 도움이 되었기를 바랍니다. 행운을 빕니다


4

혼합 효과 모델을 고려할 수 있습니다. 그들은 높은 카디널리티 범주 형 데이터에 대한 성능으로 인해 사회 과학에서 인기가 있으며, 그것들을 사용하여 그라디언트 부스트 트리, 임의의 숲 및 탄력적 그물 정규화 된 로지스틱 회귀와 같은 인기있는 기계 학습 접근 방식을 능가하는 훌륭한 예측 모델을 만들었습니다. 가장 잘 알려진 구현은 R의 lme4 패키지입니다. 분류에 사용하는 함수는 혼합 효과 로지스틱 회귀를 구현하는 glmer입니다. 데이터 세트 확장에 문제가있을 수 있지만 15 가지 기능으로 80k 행을 너무 어려움없이 수행했습니다.


2
  1. "각 범주 형 변수에 대해 더미 변수 작성" 이라고 말하면 R이 아닌 Python을 사용하는 것처럼 들립니까? R randomforest는 기본적으로 범주 형을 처리 할 수 ​​있으며 결과적으로 메모리를 줄입니다. R을보십시오.

  2. 다음으로, 범주 수준을 수동으로 정리 / 병합 할 필요가 없습니다. 이는 큰 고통처럼 들립니다. 그리고 그렇게해도 가장 인구가 많은 카테고리가 가장 예측 적이라고 보장 할 수 없습니다. 매개 변수와 랜덤 포레스트 복잡성을 제어 nodesize : 큰 시작 nodesize , 점차적으로 감소 (이 hyperparameter 검색입니다).

  3. 변수 선택이 유용합니다. @lorelai는 좋은 추천을 제공합니다. 쓸모없는 (낮은 중요성 또는 상관 관계가 높은) 기능을 제거하십시오. 트리 구성은 피처 수에 이차적이므로 1/3을 제거하더라도 배당금을 지불합니다.


0

당신은 봐야한다 H2O.ai의 패키지로 제공된다. 인코딩을 수행하지 않고도 범주 형 변수를 즉시 처리합니다 (변수가 요인인지 확인).

모델을 빌드 한 후 변수 중요도를 볼 수 있기 때문에 특히 그라데이션 부스트 머신 (GBM) 구현이 마음에 듭니다. GBM은 또한 과적 합에 대한 저항력이 뛰어납니다.

다른 모델을 탐색하고 싶다면 GLM, Random Forest, Naive Bayes, Deep Learning 등이 있습니다.

참조 : http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html

또한 설치가 쉽고 (Windows, Linux, Mac) R, Python, Java 및 Scala를 사용하여 API로 쉽게 실행할 수 있습니다.

여러 코어를 사용하여 작업 속도를 높일 수 있습니다.

가까운 시일 내에 GPU를 지원할 것입니다.

또한 오픈 소스이며 무료입니다 (엔터프라이즈 지원 있음).

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