1

저는 이진 분류 작업에 sk-learn의 RandomForestClassifier를 사용하려고합니다. 내 훈련 데이터에는 sklearn.dataset의 load_svmlight_file을 사용하여로드하는 SVM 라이트 형식 (스파 스 벡터)으로 40 개의 기능이있는 1.177.245 예제가 들어 있습니다. '특성 값'(1.177.245 * 40)과 '목표 클래스'(1과 0, 1.177.245)의 배열을 하나씩 생성합니다. 이것이 걱정스러운 것인지 나는 모르지만 훈련 데이터에는 3552 가지의 긍정적 인 점이 있고 나머지는 모두 부정적입니다.scikit-learn RandomForestClassifier가 '예기치 않은'결과를 생성합니다.

sk-learn의 RFC는 스파 스 행렬을 허용하지 않으므로 .toarray()를 사용하여 스파 스 행렬을 밀도가 높은 배열로 변환합니다. 전 배열을 변환하기 전후에 행렬을 인쇄하고 괜찮을 것 같습니다.

내가 분류를 시작하고 데이터에 맞는 시작, 그것은 이렇게 오래 걸리는 :

[Parallel(n_jobs=40)]: Done 1 out of 40 | elapsed: 24.7min remaining: 963.3min 
[Parallel(n_jobs=40)]: Done 40 out of 40 | elapsed: 27.2min finished 

(즉, 출력 맞아 그 963분 약 2 반 걸릴 ...?)

그런 다음 joblib.dump를 사용하여 덤프합니다. 내가하면 를 다시로드 :

RandomForestClassifier: RandomForestClassifier(bootstrap=True, compute_importances=True, 
     criterion=gini, max_depth=None, max_features=auto, 
     min_density=0.1, min_samples_leaf=1, min_samples_split=1, 
     n_estimators=1500, n_jobs=40, oob_score=False, 
     random_state=<mtrand.RandomState object at 0x2b2d076fa300>, 
     verbose=1) 

을 그리고 실제 trainingdata에서 테스트 나는 "예기치 않은"결과를 얻을 수 (750.709 예, 훈련 데이터와 동일한 형식에서 구성). 정확히는; 테스트 데이터의 예제 중 하나만 true로 분류됩니다. 초기 훈련 데이터의 절반을 훈련하고 나머지 절반을 테스트 할 때 나는 전혀 긍정적 인 반응을 얻지 못합니다.

지금 나는 무슨 일이 일어나고 있는지에 대해 잘못된 생각을 할 이유가 전혀 없으며, 이상한 결과를 얻는다는 것뿐 아니라 그 일이 너무 빠르다고 생각합니다. 아마도 비교를하는 것은 불가능하지만, rt-rank (1500 반복을 사용하지만 코어의 절반을 사용)를 사용하여 동일한 데이터에 대해 RFClassifier를 교육하는 것은 12 시간이 걸립니다 ...

내가 가지고 있는지 여부를 나에게 밝힐 수있는 사람은 누구입니까? 뭔가를 믿을만한 어떤 이유라도 그것이 정상적으로 작동하지 않는가? 교육 자료에서 네가티브에 대한 긍정적 인 비율 일 수 있습니까? 건배.

+0

실제로 필자는이 글을 쓰고있을 때 포지티브 - 네거티브의 정확한 비율을 찾았으며 그 이유는 그만큼 나에게 그럴듯하게 보입니다. 어쩌면 내 기능은 많은 양의 네거티브와 소수의 포지티브를 구별하기에 충분하지 않을 수 있습니까? – graus

+0

[RF 분류기에서 불균형 데이터 세트 처리하기] (http://www.stat.berkeley.edu/tech-reports/666.pdf)에 대한 기술은 있지만, 나는 그들 중 어떤 것도 scikit- 배우십시오. –

답변

4

실제로이 데이터 세트는 매우 불균형합니다. 부정적인 예를 서브 샘플링하거나 (예 : 무작위로 n_positive_samples을 선택) 긍정적 인 예를 과다하게 (예 : 후자는 더 비싸지 만 더 나은 모델을 산출 할 수 있음) 조언 해주세요.

또한 모든 기능이 숫자 기능이라는 것을 알고 있습니까? (값이 클수록 실제 생활에 의미가 있습니다)? 그 중 일부가 범주 형 정수 표시자인 경우 해당 기능을 임의의 포리스트에 대한 scikit-learn 구현이 범주 형 데이터를 직접 처리 할 수 ​​없기 때문에 1-of-k 부울 인코딩으로 분해해야합니다.

+0

실제로, 극단적 인 불균형은 0 편향의 원인 인 것처럼 보입니다. 나는 네거티브를 다운 샘플링하고 긍정적 인 것을 복제함으로써 빠른 테스트를 수행했으며, 더 많은 긍정적 인 것들이 예측되었습니다. – graus

+0

@ogrisel scikit-learn에서이 다운 샘플링을 수행 할 수 있습니까? 어디에도 n_positive_samples 매개 변수가없는 것 같습니다. – MaVe

+0

scikit-learn에는 내장 리샘플링자가 아직 없지만 표준 numpy fancy indexing을 사용할 수 있습니다. – ogrisel

관련 문제