Como interpretar OOB e matriz de confusão para floresta aleatória?

35

Eu recebi um script R de alguém para executar um modelo de floresta aleatório. Modifiquei e executei com alguns dados de funcionários. Estamos tentando prever separações voluntárias.

Aqui estão algumas informações adicionais: este é um modelo de classificação em que 0 = funcionário permaneceu, 1 = funcionário desligado, atualmente estamos apenas olhando para uma dúzia de variáveis ​​preditivas, os dados são "desequilibrados", pois os registros do termo compõem cerca de 7 % do conjunto total de registros.

Eu corro o modelo com várias seleções mtry e ntree, mas resolvi o seguinte. O OOB é 6,8%, o que eu acho bom, mas a matriz de confusão parece contar uma história diferente para a previsão de termos, já que a taxa de erro é bastante alta em 92,79%. Estou certo ao supor que não posso confiar e usar esse modelo porque a alta taxa de erro para prever termos? ou há algo que eu possa fazer para usar a RF e obter uma taxa de erro menor para prever termos?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908
daniellopez46
fonte

Respostas:

20

A matriz de confusão é calculada em um ponto específico determinado pelo ponto de corte dos votos. Dependendo das suas necessidades, ou seja, melhor precisão (reduzir falsos positivos) ou melhor sensibilidade (reduzir falsos negativos), você pode preferir um ponto de corte diferente.

Para esse propósito, recomendo plotar (i) uma curva ROC , (ii) uma precisão de recall e (iii) uma curva de calibração para selecionar o ponto de corte que melhor se adapta às suas finalidades. Tudo isso pode ser facilmente plotado usando as 2 funções a seguir da biblioteca ROCR R (disponível também no CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Por exemplo:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);
Itamar
fonte
Estou interessado em sua resposta, plotei com o código que você compartilhou. por favor, me dê alguns recursos para encontrar um pouco de detalhes sobre o enredo que você sugeriu. ou escreverá algumas frases sobre como interpretá-lo. Muito obrigado antecipadamente.
MKS
Eu sugiro que você comece com a entrada para a curva ROC vinculada a outras entradas mencionadas acima.
Itamar
A resposta não aborda diretamente a limitação da árvore de decisão em um conjunto de dados altamente inclinado.
SmallChess 27/10/16
19

Seu aparelho está bastante desequilibrado - a RF geralmente falha nesse cenário (ou seja, prediz bem apenas a classe maior).

Você deve tentar equilibrar seu conjunto amostrando a classe "0" apenas para ter o mesmo tamanho da classe "1" ou tocando com o classwtparâmetro


fonte
11
Apesar de existir um classwtparâmetro, acho que ele ainda não está implementado na randomForest()função do randomForestpacote em R. Per Link . Você já usou isso antes? Eu tentei com valores diferentes, mas obtive resultados idênticos ao padrão classwt=NULL.
Zhubarb 23/09/2015
9

Com base na sua matriz de confusão, você possui 5.908 pontos de dados e a vasta e vasta maioria deles é do tipo 0 ('funcionário ficou'). O classificador pode, portanto, ser "preguiçoso" e escolher a classe majoritária, a menos que seja absolutamente certo que um exemplo pertence à outra classe. Observe que sua taxa de erro geral é de ~ 7%, o que é bastante próximo da porcentagem de exemplos da Classe 1!

Você tem algumas opções:

  • Descarte exemplos de Class0 até ter classes aproximadamente equilibradas. Não sei se há literatura sobre como escolher um subconjunto idealmente representativo (talvez alguém possa pesar?), Mas você pode começar soltando exemplos aleatoriamente. Você pode passar um subsetargumento para randomForest, o que deve tornar esse teste trivial.

  • Ajuste seus pesos de função / classe de perda para compensar o número desproporcional de Class0. Você quer essencialmente tornar muito mais caro para o classificador classificar incorretamente um exemplo de Classe1 do que um de Classe0. Pode fazer sentido tentar Class0 = 1 / 0.07 ~ = 14x Class1 para iniciar, mas convém ajustar isso com base nas demandas de seus negócios (quanto pior é um tipo de erro). Eu acho que o classwtparâmetro é o que você está procurando aqui.

  • Use amostragem estratificada para garantir que você tenha exemplos de ambas as classes nos dados de treinamento das árvores. É possível que algumas de suas árvores tenham sido treinadas apenas nos dados da Classe 0, o que obviamente será um mau presságio para o desempenho de generalização. Confira o strataargumento.

Matt Krause
fonte
A seleção aleatória da classe dominante parece razoável. Eles não precisam ser iguais: mesmo uma proporção de 1: 5 deve ser uma melhoria.
Itamar
@ Itmar, é definitivamente o que eu tentaria primeiro. No entanto, parece que deve haver alguma maneira de garantir que os exemplos que você retenha sejam representativos do conjunto de dados maior.
Matt Krause
11
Uma opção poderia ser executar o PCA (análise de componentes principais) em um conjunto maior, agrupar os pontos de acordo com o primeiro componente principal e escolher uma amostra de cada cluster.
Itamar