Eu tenho dados de aprendizagem que consistem em ~ 45k amostras, cada uma com 21 recursos. Estou tentando treinar um classificador de floresta aleatório nesses dados, que é rotulado como 3 classes (-1, 0 e 1). As classes são mais ou menos iguais em seus tamanhos.
Meu modelo de classificador aleatório de floresta está usando gini
como critério de qualidade de divisão, o número de árvores é 10 e não limitamos a profundidade de uma árvore.
A maioria dos recursos mostrou importância insignificante - a média é de cerca de 5%, um terço deles é de importância 0, e um terço deles é de importância acima da média.
No entanto, talvez o fato mais impressionante seja a pontuação oob (fora da bolsa): um pouco menos de 1%. Isso me fez pensar que o modelo falha e, de fato, testando o modelo em um novo conjunto independente de tamanho ~ 40k, obtive pontuação de 63% (parece bom até agora), mas uma inspeção mais profunda da matriz de confusão me mostrou que o o modelo é bem-sucedido apenas para a classe 0 e falha em cerca de 50% dos casos quando se trata de decidir entre 1 e -1.
Saída do Python anexada:
array([[ 7732, 185, 6259],
[ 390, 11506, 256],
[ 7442, 161, 6378]])
Isso ocorre naturalmente porque a classe 0 possui propriedades especiais, o que facilita muito a previsão. No entanto, é verdade que a pontuação oob que encontrei já é um sinal de que o modelo não é bom? Qual é uma boa pontuação de oob para florestas aleatórias ? Existe alguma regra prática que ajude a determinar se um modelo é "bom", usando a pontuação oob sozinha ou em combinação com alguns outros resultados do modelo?
Editar: após remover dados incorretos (cerca de um terço dos dados), os rótulos eram mais ou menos 2% para 0 e 49% para cada um de -1 / + 1. A pontuação oob foi de 0,011 e a pontuação nos dados do teste foi de 0,49, com a matriz de confusão dificilmente enviesada para a classe 1 (cerca de 3/4 das previsões).
scikit
'soob_score
é uma pontuação, ou seja, uma medida de acordo. Não consegui encontrá-lo documentado, no entanto.Respostas:
O RF do sklearn
oob_score_
(observe o sublinhado à direita) não é muito inteligível comparado aos Rs, depois de ler o documento e o código-fonte do sklearn. Meu conselho sobre como melhorar seu modelo é o seguinte:O RF do sklearn costumava usar o terrível padrão de
max_features=1
(como em "tente todos os recursos em cada nó"). Então não está mais fazendo a seleção aleatória da coluna (/ feature) como uma floresta aleatória. Altere para, por exemplomax_features=0.33
(como R'smtry
) e execute novamente. Conte-nos as novas pontuações."A maioria dos recursos mostrou importância insignificante" . Então você precisa fazer a Seleção de Recursos, conforme o documento - para classificação. Consulte o documento e outros artigos aqui no CrossValidated.SE. Faça o FS em um conjunto diferente (digamos 20 a 30%) do que no restante do treinamento, usando, por exemplo
sklearn.cross_validation.train_test_split()
(sim, o nome é um pouco enganador). Agora, conte-nos a pontuação que você obtém após o FS?Você disse que "após remover dados incorretos (cerca de um terço dos dados), os rótulos eram mais ou menos 2% para 0 e 49% para cada um de -1 / + 1" ; então você tem um desequilíbrio de classe grave . Além disso: "matriz de confusão mostra que o modelo só é bem-sucedido na classe 0 e falha em cerca de 50% dos casos entre +1 e -1" . Este é um sintoma do desequilíbrio de classe. Você usa amostragem estratificada ou treina um classificador com exemplos para as classes +1 e -1. Você pode fazer um classificador OAA (One-Against-All) ou OAO (One-Against-One). Tente três classificadores OAA, um para cada classe. Finalmente, conte-nos essas pontuações?
fonte
Não existe oob_score bom, é a diferença entre valid_score e oob_score que importa.
Pense no oob_score como uma pontuação para algum subconjunto (por exemplo, oob_set) do conjunto de treinamento. Para saber como é criado, consulte isso .
oob_set é retirado do seu conjunto de treinamento. E você já tem seu conjunto de validação (por exemplo, valid_set).
Vamos assumir um cenário em que, seu validation_score é 0.7365 e oob_score é 0.8329
Nesse cenário, seu modelo está apresentando melhor desempenho no oob_set, obtido diretamente do seu conjunto de dados de treinamento. Indicando, validation_set é para um período de tempo diferente. (diga que training_set possui registros para o mês de "janeiro" e validation_set possui registros para o mês de "julho"). Portanto, mais do que um teste para o desempenho do modelo, oob_score é um teste para "quão representativo é o seu conjunto de validação".
Você deve sempre garantir um bom representante validation_set, pois sua pontuação é usada como um indicador do desempenho do nosso modelo. Portanto, seu objetivo deve ser o de ter a menor diferença possível entre oob_score e valid_score.
Eu geralmente uso oob_score com validation_score para ver quão bom é o meu validation_set. Eu aprendi essa técnica com Jeremy Howard .
fonte
P: Qual é a boa pontuação de florestas aleatórias com sklearn, classificação de três classes?
A: Depende. Na minha opinião, se amostras de aprendizado e teste são extraídas da mesma distribuição, então, na minha opinião, o OOB é igual a aproximadamente três vezes a validação cruzada. Portanto, se repetirmos a mesma pergunta, mas com "validação cruzada três vezes", a resposta seria a mesma, que é "geralmente, quanto maior a precisão, melhor, a menos que você tenha medo de superestimar seu conjunto de aprendizado porque alguém lhe disse que" as amostras de teste verdadeiras têm uma distribuição diferente ".
Você pode me dar seu conjunto de dados? Posso me divertir um pouco e dizer o que consigo fazer de graça.
fonte
uma opinião diferente sobre a questão: para começar, você deve associar uma perda a cada classificação incorreta que fizer. Esse preço pago / perda / penalidade por classificação incorreta (provavelmente) seria diferente para Falso Positivo (FP) vs Falso Negativo (FN). Algumas classificações, dizem a detecção do câncer, preferem ter mais PFs do que FNs. Alguns outros, como filtro de spam, preferem permitir certos spams (FN) do que bloquear emails (FP) do seu amigo. Com base nessa lógica, você pode usar a pontuação F1 ou a precisão, o que for mais adequado ao seu objetivo (por exemplo, eu ficaria feliz se meu filtro de spam não tivesse FPs e uma pontuação de 0,1, pois tenho 10% menos spams para me preocupar Por outro lado, alguém pode estar descontente com 0,9 (90% de spams filtrados). O que seria uma boa pontuação então?)
fonte