Qual é uma boa nota para florestas aleatórias com classificação sklearn de três classes? [duplicado]


8

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 ginicomo 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).


2
Esclarecer. Você está usando o scikit learn ? E está relatando uma pontuação oob <0,001? Em seguida, usando a função .score nos novos dados que você obtém .63? Em geral, descobri que as pontuações de referência refletem ou subestimam ligeiramente as pontuações de validação cruzada. Acho que as pontuações na classificação de aprendizado do scikit têm precisão média nas classes (se eu estiver lendo os documentos, certo?), Portanto, elas não devem ser comparadas diretamente com a precisão geral / não média, mas isso depende da implementação e não deve causar isso. grande discrepância.
Ryan Bressler

Sim, estou usando o scikit learn, a pontuação noob ficou um pouco abaixo de 0,01 e a pontuação nos dados do teste foi de cerca de 0,63.
Bach

Suas linhas são independentes ou você tem medidas repetidas do mesmo caso (ou dados hierárquicos / agrupados)? Além disso: por favor, esclareça: a sua pontuação máxima é uma medida de erro ou de concordância?
Cbeleites descontente com SX

Minhas linhas não estão se repetindo, mas podem ser dependentes. Eu acredito scikit's oob_scoreé uma pontuação, ou seja, uma medida de acordo. Não consegui encontrá-lo documentado, no entanto.
Bach

Uma pesquisa rápida me levou à página de manual da floresta aleatória, onde diz "oob_score: bool Se usar amostras prontas para estimar o erro de generalização", para que isso pareça uma medida de erro para mim. Se isso for verdade, sua estimativa oob é altamente super otimista - o que seria um "sintoma" esperado de linhas dependentes.
cbeleites descontente com SX

Respostas:


4

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:

  1. 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 exemplo max_features=0.33(como R's mtry) e execute novamente. Conte-nos as novas pontuações.

  2. "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?

  3. 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?


6
Apenas para sua informação, no scikit 0.16.1, o padrão para max_features é "auto" e não 1, onde "auto" se traduz no sqrt (number_features).
precisa

1

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 .


0

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.


0

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?)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.