Como alterar o limite de classificação no R randomForests?

10

Toda a literatura de Modelagem de Distribuição de Espécies sugere que, ao prever a presença / ausência de uma espécie usando um modelo que gera probabilidades (por exemplo, RandomForests), é importante escolher a probabilidade de limiar pela qual classificar uma espécie como presença ou ausência é importante e deve-se nem sempre confie no padrão de 0,5. Eu preciso de ajuda com isto! Aqui está o meu código:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

A partir disso, determinei que o limite que gostaria de usar para classificar a presença a partir das probabilidades previstas é 0,7 e não o padrão 0,5. Não entendo totalmente o que fazer com essa informação. Simplesmente uso esse limite ao criar um mapa da minha saída? Eu poderia criar facilmente uma saída mapeada com probabilidades contínuas e simplesmente reclassificar aqueles com valores maiores que 0,7 como presentes e aqueles <0,7 como ausentes.

Ou eu quero pegar essas informações e executar novamente a modelagem randomForests usando o parâmetro cut-off? O que exatamente o parâmetro de corte está fazendo? Isso muda o voto resultante? (atualmente diz que é "maioria"). Como uso esse parâmetro de corte? Eu não entendo a documentação! Obrigado!

sth
fonte
2
Eu diria que isso pode pertencer aqui: A questão de (1) estimativas de probabilidade da RF, (2) se você pode impor uma função de custo no modelo ou precisa construí-la no modelo e (3) como implementar funções de custo na RF, existem questões recorrentes que não estão simplesmente relacionadas à programação.
charles

Respostas:

7

#set limiar ou valor de corte para 0,7

cutoff=0.7

# todos os valores abaixo do valor de corte 0,7 serão classificados como 0 (presente neste caso)

RFpred[RFpred<cutoff]=0

# todos os valores maiores que o valor de corte 0,7 serão classificados como 1 (ausente neste caso)

 RFpred[RFpred>=cutoff]=1
inundação
fonte
11
Você poderia expandir um pouco sua resposta? No mínimo, seria útil anotar seu código.
Patrick Coulombe
2
FWIW, acho que isso é perfeitamente suficiente.
Sycorax diz Restabelecer Monica
Esta resposta é perfeitamente correta. Concordo.
21717 Seanosapien
7

Desculpe, você não recebeu e tenta respostas. Recomendaria o livro de Max Kuhn para a cobertura desta edição. Esta é uma questão bastante ampla. Basta adicionar alguns bits:

  1. As curvas ROC são populares, mas só fazem sentido se você estiver tentando entender o trade-off entre os resultados de Falso Negativo e Falso Positivo. Se CostFN = CostFP, não sei se eles fazem sentido. A estatística c e outras medidas derivadas ainda têm uso. Se você deseja maximizar a precisão - basta ajustar seu modelo para isso (o pacote de intercalação facilita isso), não faça uma curva ROC.
  2. Todo mundo usa as probabilidades derivadas dos modelos de RF. Eu acho que acho que algum pensamento deve ser feito para fazer isso - esses não são modelos probabilísticos, eles não foram criados para fazer isso. Muitas vezes funciona. No mínimo, eu produziria um gráfico de validação de probabilidades de RF em novos dados se estivesse realmente interessado em probabilidades
  3. A maneira mais simples seria usar "simplesmente reclassificar aqueles com valores maiores que 0,7 como presentes e aqueles <0,7 como ausentes".
  4. Se o custo (FN) não for igual ao custo (FP), será necessário tornar a RF sensível aos custos. R não facilita isso. A função de ponderação no pacote RandomForest não funciona. A melhor opção é brincar com a amostra, caso com maioria abaixo da amostra, para obter a função de custo desejada. Mas a relação entre taxa de amostra e custo não é direta. Então você pode querer ficar com (3)

Atualização sobre pesos de classe Andy Liaw:
A opção "classwt" atual no pacote randomForest existe desde o início e é diferente de como o código oficial do Fortran (versão 4 e posterior) implementa pesos de classe. pesos no cálculo do índice Gini ao dividir nós, exatamente como uma única árvore CART é feita quando recebem pesos de classe.O Prof. Breiman criou o mais novo esquema de ponderação de classes implementado na versão mais recente de seu código Fortran depois que descobrimos que simplesmente usar os pesos no índice Gini não pareciam ajudar muito em dados extremamente desequilibrados (digamos 1: 100 ou pior). Se o uso de Gini ponderado ajuda na sua situação, faça-o de qualquer maneira. Só posso dizer que no passado ele não nos deu o resultado esperado. "

Charles
fonte
Você poderia explicar sobre o sub-ponto (4) por que o argumento de ponderação não funciona?
Sycorax diz Restabelecer Monica
2
Meu entendimento era que ele foi implementado apropriadamente no código Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ), mas não no pacote R. Isso é discutido: ( stat.ethz.ch/pipermail/r-help/2011-Setember/289769.html ) e centra-se na necessidade de usar pesos em todas as etapas da construção das árvores - não apenas na divisão do Gini. Implementação R tão atual - que apenas usos pesando na divisão não funciona muito bem
charles