Випадковий ліс є надмірним?


19

Я експериментую з випадковими лісами з scikit-learn, і я отримую чудові результати свого навчального набору, але порівняно погані результати на моєму тестовому наборі ...

Ось проблема (натхненна покером), яку я намагаюся вирішити: Враховуючи дірові карти гравця A, картки гравців B з дірками та флоп (3 карти), який гравець має найкращу руку? Математично це 14 входів (7 карток - один ранг і один костюм на кожну) і один вихід (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
Я не бачу тут близько десятка "циферблатів" для випадкових лісів. Перехресна перевірка? Байєсські Пріори? Характер перестановки? Набір для навчання для кожного дерева? Який відсоток підмножини до кожного дерева? ... Є багато іншого, що можна було б перерахувати, але я можу сказати, що у вас є інші дані, які слід врахувати.
EngrStudent

1
Чи можете ви пояснити проблему тим, хто не знає покер? Чи є простий розрахунок для оцінки покеру? то простіше зрозуміти, чи є щось принципово не так у використанні RF ... Я не знаю покеру, але я підозрюю, що РФ, ймовірно, є неправильним підходом, а саме перший крок IN RF - це використовувати лише частину входів, тоді як мені здається, що немає способу побудувати хороший класифікатор, використовуючи лише підмножину входів - всі входи потрібні.
seanv507

Відповіді:


45

Це поширена помилка новичка при використанні моделей РФ (я підняв руку як попередній злочинець). Ліс, який ви будуєте за допомогою навчального набору, у багатьох випадках майже повністю ідеально підходить до даних тренувань (як ви виявили), якщо розглядати їх у сукупності. Однак, коли алгоритм будує ліс, він запам'ятовує помилку передбачення поза мешком (OOB), яка найкраще здогадується про помилку узагальнення.

Якщо ви повернете дані тренінгу назад у метод прогнозування (як ви робите), ви отримаєте це майже ідеальне передбачення (яке дико оптимістично) замість правильної помилки OOB. Не робіть цього. Натомість підготовлений лісовий об’єкт мав би запам'ятати в ньому помилку OOB. Мені незнайома реалізація scikit-learn, але дивлячись на документацію тут, схоже, вам потрібно вказати oob_score=Trueпри виклику методу fit, і тоді помилка генералізації буде збережена якoob_score_у поверненому об’єкті. У пакеті R "randomForest" виклик методу прогнозування без аргументів на поверненому об'єкті поверне передбачення OOB на навчальному наборі. Це дозволяє визначити помилку за допомогою іншої міри. Передача навчального набору в метод прогнозування дасть вам інший результат, оскільки для цього будуть використані всі дерева. Я не знаю, scikit-learnреалізація зробить це чи ні.

Помилково повертати дані тренінгу назад у метод прогнозування, щоб перевірити точність. Хоча це дуже поширена помилка, тому не хвилюйтеся.


1
Спасибі! Однак у мене все ще виникає занепокоєння: маючи приклади тренувань 400k та 50 дерев, я отримав 89,6% правильних, тоді як з такою кількістю даних та вдвічі більше дерев я отримав 89,7% правильних ... Чи це говорить про те, що РФ не є хорошим метод для цього? Раніше я використовував нейронну мережу MLP і досягнув точності ~ 98,5% на тестовому наборі ...
Uwat

5
Це можливо, хоча, схоже, ви не використовуєте майже достатню кількість дерев. Зазвичай вам потрібно тисячі. Зауважте, що кількість дерев не є параметром, який слід налаштовувати в алгоритмі RF, більше завжди краще, але як тільки у вас є «достатня кількість» (визначається емпірично), помилка OOB не покращується при більшій кількості дерев. Навіть для невеликих простих наборів даних нічого менше 500 дерев майже не достатньо.
Богдановіст

1
Є кілька незначних застережень щодо того, що «більше завжди краще» щодо кількості дерев, але я розумію, що вам потрібні газильйони дерев, перш ніж ви почнете брати участь у виконанні. На мій досвід, стільки дерев, скільки у вас є ресурсів процесора та терпіння, щоб генерувати краще, хоча і зі зменшенням повертається, коли OBB (ntrees) криві плато.
Богдановіст

12

Я думаю, що відповідь - це параметр max_features: int, string або None, необов'язковий (за замовчуванням = "auto") параметр. в основному для цієї проблеми слід встановити її на None, так що кожне дерево будується з усіма входами, оскільки, очевидно, ви не можете створити належний класифікатор, використовуючи лише частину карт (за замовчуванням "auto" - це вибір sqrt (nfeatures) вхідні дані для кожного дерева)


1
Це було все! 95% точність з 50 дерев та 600 к. Прикладів навчання.
Уват

2
Зауважте, що на даний момент ви навряд чи використовуєте випадковий ліс, але, як заявили інші відповіді, це не ідеальний класифікатор для цієї точної проблеми.
Річард Раст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.