Случайный лес переоснащается?

19

Я экспериментирую со случайными лесами с помощью scikit-learn, и я получаю отличные результаты моего тренировочного набора, но относительно плохие результаты на моем тестовом наборе ...

Вот проблема (по мотивам покера), которую я пытаюсь решить: с учетом карманных карт игрока А, карманных карт игрока Б и флопа (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:])

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

Uwat
источник
2
Я не вижу здесь дюжины «циферблатов» для случайных лесов. Перекрестная проверка? Байесовские Приоры? Природа пересчета? Тренировочный набор для каждого дерева? Какой процент подмножества для каждого дерева? ... можно перечислить гораздо больше, но я хочу сказать, что у вас есть другие соображения, которые стоит рассмотреть.
EngrStudent - Восстановить Монику
1
Не могли бы вы объяснить проблему для тех, кто не знает покер? Есть ли простой расчет покерного счета? тогда легче понять, есть ли что-то принципиально неправильное в использовании RF ... Я не знаю покера, но я подозреваю, что RF, вероятно, является неправильным подходом, а именно первый шаг IN RF - использовать только часть входов, тогда как мне кажется, что нет способа построить хороший классификатор, используя только подмножество входных данных - все входные данные необходимы.
seanv507

Ответы:

45

Это распространенная ошибка новичка при использовании радиочастотных моделей (я подниму руку как предыдущий преступник). Лес, который вы строите с помощью обучающего набора, во многих случаях почти идеально соответствует данным обучения (как вы находите), если рассматривать их целиком. Тем не менее, когда алгоритм строит лес, он запоминает ошибку прогнозирования «вне пакета» (OOB), которая является его лучшим предположением об ошибке обобщения.

Если вы отправляете данные обучения обратно в метод прогнозирования (как вы это делаете), вы получаете это почти идеальное предсказание (которое крайне оптимистично) вместо правильной ошибки OOB. Не делай этого. Вместо этого обученный объект Forest должен был запомнить в нем ошибку OOB. Я не знаком с scikit учиться реализации , но , глядя на документации , здесь он выглядит как вам нужно указать oob_score=Trueпри вызове метода подходят, а затем ошибка обобщения будут сохранены вoob_score_в возвращаемом объекте. В пакете R "randomForest" вызов метода предиката без аргументов для возвращаемого объекта вернет прогноз OOB для обучающего набора. Это позволяет вам определить ошибку, используя другую меру. Отправка обучающего набора обратно в метод прогнозирования даст вам другой результат, так как при этом будут использоваться все деревья. Я не знаю, будет ли scikit-learnреализация делать это или нет.

Ошибочно отправлять обучающие данные обратно в метод прогнозирования для проверки точности. Это очень распространенная ошибка, поэтому не волнуйтесь.

богдановской
источник
1
Благодарность! Тем не менее, у меня все еще есть проблема: с 400k примерами обучения и 50 деревьями я получил правильные 89,6%, тогда как с таким большим количеством данных и вдвое большим количеством деревьев я получил правильные 89,7% ... Это говорит о том, что RF не является хорошим метод для этого? В прошлом я использовал нейронную сеть MLP и достиг точности ~ 98,5% в тестовом наборе ...
Uwat
5
Это возможно, хотя, похоже, вы не используете достаточно деревьев. Обычно вам нужны тысячи. Обратите внимание, что количество деревьев не является параметром для настройки в алгоритме RF, чем больше, тем лучше, но как только у вас «достаточно» (для определения эмпирически), ошибка OOB не улучшается при большем количестве деревьев. Даже для небольших простых наборов данных недостаточно 500 деревьев.
Богдановец
1
Есть несколько небольших предостережений относительно того, что «больше всегда лучше» в отношении количества деревьев, но, насколько я понимаю, вам нужно gazjillions деревьев, прежде чем вы начнете попадать в игру. По моему опыту, столько деревьев, сколько у вас ресурсов процессора и терпения, чтобы генерировать лучшее, хотя и с уменьшающейся отдачей, как только получаются кривые OBB (ntrees).
Богдановец
12

Я думаю, что ответом является параметр max_features: int, string или None, необязательный (default = ”auto”) параметр. в основном для этой проблемы вы должны установить его на None, чтобы каждое дерево строилось со всеми входами, поскольку очевидно, что вы не можете построить правильный классификатор, используя только часть карт (по умолчанию "auto" выбирает sqrt (nfeatures) входы для каждого дерева)

seanv507
источник
1
Вот и все! Точность 95% с 50 деревьями и 600 тыс. Тренировочных примеров.
Уват
2
Обратите внимание, что на данный момент вы почти не используете случайный лес, но, как утверждают другие ответы, это не идеальный классификатор для этой конкретной задачи.
Ричард Раст