임의의 숲이 과적입니까?


19

나는 scikit-learn을 사용하여 임의의 숲을 실험하고 있으며 훈련 세트의 결과는 훌륭하지만 테스트 세트에서는 상대적으로 열악한 결과를 얻습니다 ...

내가 해결하려고하는 문제 (포커에서 영감을 얻음)는 다음과 같습니다 .A 플레이어의 홀 카드, B 플레이어의 홀 카드 및 플롭 (3 카드)을 고려할 때 어떤 플레이어가 가장 좋은 핸드를 가지고 있습니까? 수학적으로 이것은 14 개의 입력 (7 개의 카드-1 개의 등급과 각각에 대한 1 개의 벌)과 1 개의 출력 (0 또는 1)입니다.

지금까지 내 결과 중 일부는 다음과 같습니다.

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

사용 된 관련 코드는 다음과 같습니다.

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

사용 된 트리 수에 관계없이 훈련 세트의 성능 은 비교적 큰 훈련 세트와 상당히 적은 수의 기능에도 불구하고 테스트 세트보다 훨씬 우수합니다 ...


2
임의의 숲에 대한 12 가지 '다이얼'에 대해서는 보지 못했습니다. 교차 검증? 베이지안 우선 순위? 리샘플링의 본질? 각 나무에 대한 훈련 세트? 각 트리의 하위 집합 중 몇 퍼센트입니까? ... 열거 할 수있는 것이 더 많지만 내 요점은 고려해야 할 다른 입력 사항이 있다는 것입니다.
EngrStudent-복직 모니카

1
포커를 모르는 사람들에게 문제를 설명해 주시겠습니까? 포커 점수를 쉽게 계산할 수 있습니까? RF를 사용하는 데 근본적으로 어떤 문제가 있는지 이해하는 것이 더 쉽습니다 ... 포커를 모르지만 RF는 아마도 잘못된 접근법이라고 생각합니다. 즉, RF의 첫 단계는 입력의 일부만 사용하는 것입니다. 반면 입력의 하위 집합을 사용하여 좋은 분류기를 구축하는 방법이없는 것처럼 보입니다. 모든 입력이 필요합니다.
seanv507

답변:


45

이것은 RF 모델을 사용할 때 일반적인 신인 오류입니다 (손을 이전의 가해자로 올려 놓겠습니다). 훈련 세트를 사용하여 구축 한 포리스트는 전체적으로 고려할 때 훈련 데이터를 거의 완벽하게 (찾는대로) 맞습니다. 그러나 알고리즘이 포리스트를 구축 할 때 일반화 오류를 가장 정확하게 추측하는 OOB (Out-of-Bag) 예측 오류를 기억합니다.

훈련 데이터를 예측 방법으로 다시 보내면 (정확한) 정확한 OOB 오류 대신에 거의 완벽한 예측을 얻을 수 있습니다. 이러지 마 대신 훈련 된 Forest 개체는 OOB 오류를 기억해야합니다. 나는 scikit-learn 구현에 익숙하지 않지만 여기 에서 설명서 보면 oob_score=Truefit 메소드를 호출 할 때 지정 해야하는 것처럼 보이며 일반화 오류는 다음과 같이 저장됩니다oob_score_반환 된 객체에서. R 패키지 "randomForest"에서 리턴 된 오브젝트에 인수가없는 predict 메소드를 호출하면 학습 세트에 대한 OOB 예측이 리턴됩니다. 다른 측정 값을 사용하여 오류를 정의 할 수 있습니다. 훈련 세트를 예측 방법으로 다시 보내면 모든 트리를 사용하므로 다른 결과를 얻을 수 있습니다. scikit-learn구현 이이 작업을 수행할지 여부를 모르겠습니다 .

정확도를 테스트하기 위해 훈련 데이터를 예측 방법으로 다시 보내는 것은 실수입니다. 그러나 매우 일반적인 실수이므로 걱정하지 마십시오.


1
감사! 그러나 여전히 우려가 있습니다 .400k 훈련 예제와 50 나무로 89.6 % 정확하고 데이터와 2 배가 많으면 89.7 % 정확합니다 ... 이것은 RF가 좋지 않다는 것을 암시합니다 이것에 대한 방법? 과거에 MLP 신경망을 사용했고 테스트 세트에서 ~ 98.5 % 정확도에 도달했습니다.
Uwat

5
거의 나무를 사용하지 않는 것 같지만 가능합니다. 일반적으로 수천이 필요합니다. 트리 수는 RF 알고리즘에서 조정할 매개 변수가 아니며, 더 많은 것이 항상 더 낫지 만, '충분히'(경험적으로 결정)되면 OOB 오류는 더 많은 트리로 개선되지 않습니다. 작은 간단한 데이터 세트의 경우에도 500 개 미만의 트리만으로는 충분하지 않습니다.
Bogdanovist

1
나무의 수에 대해서는 '항상 더 낫다'는 몇 가지 사소한 경고가 있지만 성능 저하를 시작하기 전에 나무의 가젤 리언이 필요하다는 것을 이해하고 있습니다. 내 경험상 OBB (ntrees) 곡선이 한 번 돌아 오면 수익을 줄이더라도 CPU 리소스와 인내심을 가지고 더 많은 나무를 만들 수 있습니다.
Bogdanovist 2

12

대답은 max_features 매개 변수 인 int, string 또는 None, 선택적 (default =”auto”) 매개 변수라고 생각합니다. 기본적 으로이 문제의 경우 None으로 설정하여 각 트리가 모든 입력으로 빌드되도록하십시오. 카드의 일부만 사용하여 적절한 분류기를 만들 수 없으므로 명확하게 (기본 "auto"는 sqrt (nfeatures)를 선택합니다) 각 트리에 대한 입력)


1
그거였다! 50 그루의 나무와 600k 건의 훈련 예제에서 95 %의 정확도.
Uwat

2
이 시점에서는 임의의 포리스트를 거의 사용하지 않지만 다른 답변에서 언급 했듯이이 정확한 문제에 대한 이상적인 분류기는 아닙니다.
Richard Rast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.