RandomForestClassifier OOB 스코어링 방법


16

scikit-learn에서 임의 포리스트 구현은 가방 외부 샘플의 일반화 오류를 추정하기 위해 평균 정확도를 스코어링 방법으로 사용합니까? 설명서에는 언급되어 있지 않지만 score () 메서드는 평균 정확도를보고합니다.

불균형이 매우 높은 데이터 집합이 있으며 그리드 검색에서 ROC의 AUC를 점수 측정 기준으로 사용하고 있습니다. 분류 자에게 OOB 샘플에 대해 동일한 스코어링 방법을 사용하도록 지시하는 방법이 있습니까?


RandomForestClassifier 클래스 의 oob_score 매개 변수가 원하는 것을 수행하지 않습니까?
피에르

AFAIK, oob_score정확성을보고하십시오. 그래도 소스 코드를 다시 봐야합니다.
darXider

그리드 검색으로 어떤 파라미터를 추정하고 있습니까?
JahKnows

^ 미안하지만, 나는 지금 정말로 기억하지 않는다! 1.5 년 전에이 질문을했습니다.
darXider

답변:


14

일반적으로 분류기의 성능은 정확도를 사용하여 비교되며 올바르게 분류 된 인스턴스 수를 총 인스턴스 수로 나눈 값입니다. 그러나 훈련 데이터를 통해 앙상블 학습 또는 배깅 기술을 사용할 때 분류기에서 예상되는 오류를 더 잘 근사화 할 수 있습니다.

가방 부족 오류

xi

sklearn에서 oob을 구현하려면 Random Forests 객체를 다음과 같이 만들 때 지정해야합니다.

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

그런 다음 모델을 훈련시킬 수 있습니다

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

점수 : 0.979921928817

예상대로 훈련 세트를 평가할 때 모델의 정확도는 매우 높습니다. 그러나 이것은 데이터를 과도하게 적합하게 만들 수 있으므로 모델이 쓰레기이기 때문에 의미가 없습니다. 그러나 우리는 가방 밖 점수를 다음과 같이 사용할 수 있습니다

print(forest.oob_score_)

0.86453272101

이것이 생략 된 트리 만 사용하여 훈련 세트에서 인스턴스를 평가하는 동안의 정확성입니다. 이제 테스트 세트의 점수를 다음과 같이 계산해 봅시다.

print('Score: ', forest.score(X_test, y_test))

점수 : 0.86517733935

oob으로 측정 한 정확도는 테스트 세트로 얻은 정확도와 매우 유사합니다. 따라서 Oob 정확도는 점수 만이 아니라 모델의 성능을 평가하기위한 더 나은 메트릭이라는 이론을 따릅니다. 이는 배깅 모델의 결과이며 다른 유형의 분류기로 수행 할 수 없습니다.

다른 메트릭을 사용하여 OOB 계산

예, 당신은 이것을 할 수 있습니다! 그러나 코드가 정확히 어떻게 구성되는지에 달려 있습니다. oob과 AUC를 cross_val_score기능 과 함께 어떻게 포함시킬 수 있는지 잘 모르겠습니다 . 그러나 교차 유효성 검사 접기를 수동으로 수행하는 경우 다음을 수행 할 수 있습니다. sklearn의 임의 포리스트 알고리즘은 다음과 같이 oob의 결정 기능을 제공합니다.

print(forest.oob_decision_function_)

클래스는 다음을 사용하여 얻을 수 있습니다

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

다음을 사용하여 AUC를 계산할 수 있습니다.

metrics.roc_auc_score(y_train, pred_train)

0.86217157846471204


4
감사! 임의 포리스트에서 OOB 프로세스가 작동하는 방식을 알고 있습니다. 나는 정확 하지 않은RandomForestClassifier OOB 점수를 반환 할 수 있는지 여부를 구체적으로 묻고 있었고 두 번째 부분은이 문제에 접근하는 방법에 대한 좋은 힌트를 제공합니다. 그러나 클래스 레이블을 사용하여 ROC 곡선의 AUC를 계산해서는 안된다는 점을 강조해야합니다. 오히려 클래스 확률을 직접 사용해야합니다. 따라서 올바른 정의는입니다 . pred_train = forest.oob_decision_function_[:, 1]
darXider

@darXider forest.oob_decision_function_.shape [0] == X_train.shape [0] 이후로이 음영이 아닙니다. == OOB 샘플 수일 것으로 예상됩니다. 샘플 수보다 작아야합니다. X_train에서? 또한 개인적으로 logloss를 계산하는 데 관심이 있었는데, 이것을하고 싶은 다른 사람들을 위해 pred_train은 = forest.oob_decision_function_이어야한다고 생각합니다.
샌더 반덴 오트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.