Método de pontuação RandomForestClassifier OOB
A implementação da floresta aleatória no scikit-learn está usando a precisão média como método de pontuação para estimar o erro de generalização com amostras prontas para uso? Isso não é mencionado na documentação, mas o método score () relata a precisão média.
Eu tenho um conjunto de dados altamente desequilibrado e estou usando a AUC do ROC como métrica de pontuação na pesquisa em grade. Existe uma maneira de dizer ao classificador para usar o mesmo método de pontuação nas amostras OOB também?
— darXider
O oob_score parâmetro do RandomForestClassifier classe não faz o que você quer?
AFAIK, oob_scorerelate a precisão. Eu preciso olhar para o código-fonte novamente.
— DarXider # 16/18
Qual parâmetro você está estimando com sua pesquisa na grade?
^ Desculpe, mas eu realmente não me lembro agora! Eu fiz essa pergunta 1,5 anos atrás.
— DarXider 17/04
Em geral, o desempenho dos classificadores é comparado com precisão, que é uma medida do número de instâncias classificadas corretamente dividido pelo número total de instâncias. No entanto, a partir dos dados de treinamento, podemos obter uma melhor aproximação do erro esperado de nosso classificador quando estivermos usando técnicas de ensemble learning ou ensacamento.
Erro fora da bolsa
xEuxEu
Para implementar oob no sklearn, você deve especificá-lo ao criar seu objeto Random Forests como
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)
Então podemos treinar o modelo
print('Score: ', forest.score(X_train, y_train))
Pontuação: 0.979921928817
Como esperado, a precisão do modelo ao avaliar o conjunto de treinamento é muito alta. No entanto, isso não faz sentido porque você pode muito bem ajustar seus dados e, portanto, seu modelo é um lixo. No entanto, podemos usar a pontuação pronta para uso como
print(forest.oob_score_)
0.86453272101
Essa é a precisão ao avaliar nossas instâncias no conjunto de treinamento usando apenas as árvores para as quais foram omitidas. Agora vamos calcular a pontuação no conjunto de testes como
print('Score: ', forest.score(X_test, y_test))
Pontuação: 0.86517733935
Vemos que a precisão medida pelo oob é muito semelhante à obtida com o conjunto de testes. Assim, segue-se a teoria de que a precisão do oob é uma métrica melhor para avaliar o desempenho do seu modelo, em vez de apenas a pontuação. Isso é uma consequência dos modelos de ensacamento e não pode ser feito com outros tipos de classificadores.
Calculando oob usando métricas diferentes
Sim, você pode fazer isso! No entanto, depende de como exatamente seu código está estruturado. Não sei como você pode incluir o oob e a AUC, todos juntos com a cross_val_scorefunção. No entanto, se você estiver executando as dobras de validação cruzada manualmente, poderá fazer o seguinte, o algoritmo de florestas aleatórias no sklearn fornece a função de decisão do oob como
print(forest.oob_decision_function_)
A classe pode ser obtida usando
pred_train = np.argmax(forest.oob_decision_function_,axis=1)
Em seguida, podemos calcular a AUC usando o seguinte
metrics.roc_auc_score(y_train, pred_train)
0.86217157846471204
Obrigado! Estou ciente de como o processo OOB funciona em florestas aleatórias. Eu estava perguntando especificamente se é RandomForestClassifierpossível retornar uma pontuação OOB que NÃO é precisão, e a segunda parte da sua resposta fornece uma dica muito boa sobre como abordar esse problema. No entanto, devo enfatizar que não se deve usar os rótulos das classes para calcular a AUC da curva ROC; pelo contrário, as probabilidades de classe devem ser usadas diretamente. Então, a definição correta seria pred_train = forest.oob_decision_function_[:, 1].
— DarXider # 17/18
@darXider Isso não é obscuro, pois forest.oob_decision_function_.shape [0] == X_train.shape [0], enquanto eu esperava que fosse == número de amostras OOB, que deveria ser menor que o número de amostras no X_train? Além disso, pessoalmente, eu estava interessado em calcular a perda de log; para outros que também querem fazer isso, acho que o pred_train deve ser = forest.oob_decision_function_.