2013-07-16 3 views
7

나는 scikit에서 RandomForest 메서드를 사용하여 3D 점 식별에 대해 작업하고 있습니다. 제가 계속해서 겪고있는 문제 중 하나는 특정 클래스가 다른 클래스보다 자주 존재한다는 것입니다. 이는 훈련 된 분류기로부터 예측을 생성하는 과정에서 분류기가 포인트 클래스에 대해 불확실한 경우 덜 일반적인 클래스가 아닌 공통 클래스 중 하나에 속한다고 가정합니다.RandomForest 구현에서 클래스를 가중하는 방법

scikit 설명서 for random forests에는 fit 메소드에 sample_weight 매개 변수가 있습니다. 내가 말할 수있는 것에서는 특정 전체 샘플의 무게를 측정 할 수 있습니다 (예를 들어, 나는 50 개의 파일을 가지고 있으며, 첫 번째 샘플을 두 번 겹치게합니다.) 최소한의 공통 클래스는 거의 모든 샘플에서 드물기 때문에 문제가 해결되지 않습니다. 그것은 그 특정한 클래스의 성격 일뿐입니다.

나는 균형 잡힌 임의의 숲과 가중치가있는 임의의 숲에 대한 논문을 발견했습니다. 그러나 나는 이것을 scikit에서 어떻게 사용하는지 아무 것도 보지 못했습니다. 내가 틀렸 으면 좋겠다. - 무게 클래스를 내장 할 방법이 있는가? 내 샘플에서 다른 클래스의 가중치를 인위적으로 늘리는 무언가를 별도로 작성해야합니까?

* sample_weight * 의 Sample_weight에 대한 나의 이해를 명확히하기위한 EDIT는 클래스 가중치가 아닌 샘플을 나타내는 것으로 보입니다. 그래서 파일 A, B 및 C와 클래스 1, 2, 3 을 가지고있는 경우의 말을하자

A = [1 1 1 2] 
B = [2 2 1 1] 
C = [3 1 1 1] 

을 우리가 비교 클래스 3의 거의 보유하고있는 상황을 매우 단순화를 가지고 위의 찾고 다른 클래스. 내 상황은 8 개의 클래스로 구성되어 있으며 수백만 포인트의 포인트를 가지고 있지만 비율은 여전히 ​​두 개의 특정 클래스에 비해서 매우 비뚤어져 있습니다.

크기가 m 인 배열 (m은 샘플 수임)을 사용하는 sample_weight를 사용하면 세 파일 중 어느 파일이 얼마나 많이 작동 하는지를 가중시킬 수 있습니다. 그래서 필자는 sample_weight = [1 1 2]를 사용하여 샘플 C를 다른 두 샘플보다 두 배 강하게 만들 수 있다는 것을 이해했습니다. 하지만 내 문제는 클래스 3이 매우 희귀하기 때문에 실제로 도움이되지 않습니다 (실제 데이터에서는 12 만 개 중 1 만 개가 아니라 수백만 개를 가리 킵니다). 주어진 샘플의 가중치를 늘리더라도 샘플이 거의 모든 특정 클래스로 구성되어있는 일부 데이터를 위조하지 않으면 특정 클래스의 가중치가 증가하지 않습니다.

설명서에 sklearn.preprocessing.balance_weights(y)이 발견되었지만 사용중인 사람을 찾을 수 없습니다. 이론적으로는 필요한 작업을 수행하지만, 무작위로 포 울트에 가중치 배열을 다시 맞출 수는 없습니다.

+4

나는 다음과 같은 내용을 이해하지 못한다 : "최소한의 공통 클래스는 거의 모든 샘플에서 희귀하기 때문에 문제가 해결되지 않습니다. 단지 특정 클래스의 특성입니다." 샘플 가중치를 'sample_weight = (1/n_samples_in_same_class)'에 넣으면 클래스 가중치에 적합한 값을 얻을 수 있습니다. – ogrisel

+0

샘플에 따른 sample_weight는 클래스 가중치가 아닌 샘플을 나타내는 것으로 보입니다. – Nahkki

+1

네,하지만 동일한 클래스의 모든 샘플에 동일한 샘플 가중치를 할당 할 수 있으며 클래스 가중치를 제공 한 것처럼 효과적으로 가중치를 부여합니다. 샘플 가중치를 제공하여 클래스 가중치를 시뮬레이션 할 수는 있지만 다른 방법은 사용할 수 없습니다. – ogrisel

답변

2

나는 이것이 scikit-learn의 최신 버전에만 적용된다고 생각하지만, 이제 이것을 사용할 수 있습니다.

rf = RandomForestClassifier(class_weight="balanced") 
관련 문제