Método de pontuação RandomForestClassifier OOB

15

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
fonte
O oob_score parâmetro do RandomForestClassifier classe não faz o que você quer?
Pierre
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?
JahKnows
^ Desculpe, mas eu realmente não me lembro agora! Eu fiz essa pergunta 1,5 anos atrás.
DarXider 17/04

Respostas:

14

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

xEu

Para implementar oob no sklearn, você deve especificá-lo ao criar seu objeto Random Forests como

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Então podemos treinar o modelo

forest.fit(X_train, y_train)
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

from sklearn import metrics
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

JahKnows
fonte
3
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_.
Sander Vanden Hautte