Я экспериментирую со случайными лесами с помощью 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:])
Похоже, что независимо от количества используемых деревьев, производительность на тренировочном наборе намного лучше, чем на тестовом наборе, несмотря на относительно большой обучающий набор и достаточно небольшое количество функций ...
Ответы:
Это распространенная ошибка новичка при использовании радиочастотных моделей (я подниму руку как предыдущий преступник). Лес, который вы строите с помощью обучающего набора, во многих случаях почти идеально соответствует данным обучения (как вы находите), если рассматривать их целиком. Тем не менее, когда алгоритм строит лес, он запоминает ошибку прогнозирования «вне пакета» (OOB), которая является его лучшим предположением об ошибке обобщения.
Если вы отправляете данные обучения обратно в метод прогнозирования (как вы это делаете), вы получаете это почти идеальное предсказание (которое крайне оптимистично) вместо правильной ошибки OOB. Не делай этого. Вместо этого обученный объект Forest должен был запомнить в нем ошибку OOB. Я не знаком с scikit учиться реализации , но , глядя на документации , здесь он выглядит как вам нужно указать
oob_score=True
при вызове метода подходят, а затем ошибка обобщения будут сохранены вoob_score_
в возвращаемом объекте. В пакете R "randomForest" вызов метода предиката без аргументов для возвращаемого объекта вернет прогноз OOB для обучающего набора. Это позволяет вам определить ошибку, используя другую меру. Отправка обучающего набора обратно в метод прогнозирования даст вам другой результат, так как при этом будут использоваться все деревья. Я не знаю, будет лиscikit-learn
реализация делать это или нет.Ошибочно отправлять обучающие данные обратно в метод прогнозирования для проверки точности. Это очень распространенная ошибка, поэтому не волнуйтесь.
источник
Я думаю, что ответом является параметр max_features: int, string или None, необязательный (default = ”auto”) параметр. в основном для этой проблемы вы должны установить его на None, чтобы каждое дерево строилось со всеми входами, поскольку очевидно, что вы не можете построить правильный классификатор, используя только часть карт (по умолчанию "auto" выбирает sqrt (nfeatures) входы для каждого дерева)
источник