A floresta aleatória está super ajustada?

19

Estou experimentando florestas aleatórias com o scikit-learn e estou obtendo ótimos resultados do meu conjunto de treinamento, mas resultados relativamente ruins no meu conjunto de testes ...

Aqui está o problema (inspirado no poker) que estou tentando resolver: Dadas as cartas do jogador A, as cartas do jogador B e o flop (3 cartas), qual jogador tem a melhor mão? Matematicamente, são 14 entradas (7 cartões - um rank e um naipe para cada) e uma saída (0 ou 1).

Aqui estão alguns dos meus resultados até agora:

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%

Aqui está o código relevante usado:

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:])

Parece que, independentemente do número de árvores usadas, o desempenho no conjunto de treinamento é muito melhor do que no conjunto de testes, apesar de um conjunto de treinamento relativamente grande e de um número razoavelmente pequeno de recursos ...

Uwat
fonte
2
Não estou vendo cerca de uma dúzia de "discagens" para florestas aleatórias aqui. Validação cruzada? Priores Bayesianos? Natureza da reamostragem? Conjunto de treinamento para cada árvore? Qual a porcentagem do subconjunto de cada árvore? ... há muito mais que podem ser enumerados, mas o que quero dizer é que você tem outras informações a considerar.
EngrStudent - Reintegrar Monica
1
Você poderia explicar o problema para aqueles que não conhecem o poker .. existe um cálculo fácil para a pontuação do poker? então é mais fácil entender se existe algo fundamentalmente errado no uso da RF ... Não conheço poker, mas suspeito que a RF provavelmente seja a abordagem errada - ou seja, o primeiro passo no RF é usar apenas uma fração das entradas, considerando que me parece que não há como criar um bom classificador usando apenas um subconjunto das entradas - todas as entradas são necessárias.
precisa saber é o seguinte

Respostas:

45

Este é um erro comum de novato ao usar modelos de RF (colocarei minha mão como um autor anterior). A floresta que você constrói usando o conjunto de treinamento, em muitos casos, ajustará os dados de treinamento quase perfeitamente (como você está descobrindo) quando considerada na totalidade. No entanto, à medida que o algoritmo constrói a floresta, ele se lembra do erro de previsão out-of-bag (OOB), que é o melhor palpite para o erro de generalização.

Se você enviar os dados de treinamento de volta ao método de previsão (como está fazendo), obterá essa previsão quase perfeita (que é extremamente otimista) em vez do erro OOB correto. Não faça isso. Em vez disso, o objeto Floresta treinado deveria ter lembrado nele o erro OOB. Não estou familiarizado com a implementação do scikit-learn, mas observando a documentação aqui , parece que você precisa especificar oob_score=Trueao chamar o método de ajuste e, em seguida, o erro de generalização será armazenado comooob_score_no objeto retornado. No pacote R "randomForest", chamar o método de previsão sem argumentos no objeto retornado retornará a previsão de OOB no conjunto de treinamento. Isso permite definir o erro usando outra medida. Enviar o treinamento definido de volta ao método de previsão fornecerá um resultado diferente, pois isso usará todas as árvores. Não sei se a scikit-learnimplementação fará isso ou não.

É um erro enviar os dados de treinamento de volta ao método de previsão para testar a precisão. É um erro muito comum, portanto, não se preocupe.

Bogdanovist
fonte
1
Obrigado! No entanto, ainda tenho uma preocupação: com 400k exemplos de treinamento e 50 árvores, obtive 89,6% de correção, enquanto com tantos dados e duas vezes mais árvores obtive 89,7% de correção ... Isso sugere que a RF não é uma boa método para isso? Eu usei uma rede neural MLP no passado e atingiu uma precisão de ~ 98,5% no conjunto de testes ...
Uwat
5
Isso é possível, embora pareça que você não está usando árvores suficientes. Normalmente você precisa de milhares. Observe que o número de árvores não é um parâmetro a ser ajustado no algoritmo de RF; mais é sempre melhor, mas depois de ter o suficiente (para ser determinado empiricamente), o erro OOB não melhora com mais árvores. Mesmo para pequenos conjuntos de dados simples, nada menos que 500 árvores não é suficiente.
Bogdanovist
1
Existem algumas pequenas advertências para "mais é sempre melhor" para o número de árvores, mas entendo que você precisa de gazjilhões de árvores antes de começar a sofrer um impacto no desempenho. Na minha experiência, quantas árvores você tiver os recursos e a paciência da CPU para gerar o melhor, embora com retornos decrescentes, uma vez que os OBB (ntrees) curvam os platôs.
Bogdanovist
12

Eu acho que a resposta é o parâmetro max_features: int, string ou None, parâmetro opcional (default = ”auto”). basicamente, para esse problema, você deve defini-lo como None, para que cada árvore seja construída com todas as entradas, pois claramente você não pode criar um classificador adequado usando apenas uma fração das placas (o padrão "auto" é selecionar sqrt (nfeatures) entradas para cada árvore)

seanv507
fonte
1
Foi isso! 95% de precisão com 50 árvores e 600k exemplos de treinamento.
Uwat
2
Observe que, neste momento, você quase não está usando uma floresta aleatória, mas, como outras respostas afirmaram, não é o classificador ideal para esse problema exato.
Richard Rast