Criando uma "pontuação de certeza" a partir dos votos em florestas aleatórias?

36

Eu estou procurando treinar um classificador que discrimine Type Ae Type Bobjetos com um conjunto de treinamento razoavelmente grande de aproximadamente 10.000 objetos, aproximadamente metade dos quais são Type Ae metade deles Type B. O conjunto de dados consiste em 100 recursos contínuos detalhando as propriedades físicas das células (tamanho, raio médio, etc.). Visualizar os dados em gráficos de dispersão em pares e gráficos de densidade nos diz que há uma sobreposição significativa nas distribuições das células cancerígenas e normais em muitos dos recursos.

Atualmente, estou explorando florestas aleatórias como um método de classificação para esse conjunto de dados e tenho visto bons resultados. Usando R, as florestas aleatórias conseguem classificar corretamente cerca de 90% dos objetos.

Uma das coisas que queremos tentar é criar uma espécie de "índice de certeza" que quantifique a confiança que temos com a classificação dos objetos. Sabemos que nosso classificador nunca será 100% preciso e, mesmo que seja alcançada alta precisão nas previsões, desejaremos técnicos treinados para identificar quais objetos são realmente Type Ae Type B. Portanto, em vez de fornecer previsões intransigentes de Type Aou Type B, queremos apresentar uma pontuação para cada objeto que descreva como Aou é Bum objeto. Por exemplo, se concebermos uma pontuação que varia de 0 a 10, uma pontuação de 0 pode indicar que um objeto é muito semelhante a Type Aobjetos, enquanto uma pontuação de 10 indica que um objeto é muito parecido Type B.

Eu estava pensando que poderia usar os votos dentro das florestas aleatórias para conceber essa pontuação. Como a classificação em florestas aleatórias é feita por maioria de votos na floresta de árvores geradas, eu assumiria que os objetos que foram votados por 100% das árvores Type Aseriam diferentes dos objetos que foram votados por, digamos, 51% das árvores para ser Type A.

Atualmente, tentei definir um limite arbitrário para a proporção de votos que um objeto deve receber para ser classificado como Type Aou Type B, e se o limite não for ultrapassado, ele será classificado como Uncertain. Por exemplo, se eu forçar a condição de que 80% ou mais das árvores devem concordar com a decisão de aprovação de uma classificação, constatarei que 99% das previsões de classe estão corretas, mas cerca de 40% dos objetos estão no lixo como Uncertain.

Faria sentido, então, tirar proveito das informações de votação para pontuar a certeza das previsões? Ou estou indo na direção errada com meus pensamentos?

ialm
fonte
Verifique se você possui conjuntos de dados de treinamento e teste separados. Certifique-se de usar o conjunto de testes o mínimo possível (idealmente apenas uma vez).
Boris Gorelik
@bgbg Estou usando um esquema de treinamento / validação / teste, em uma divisão de 70/20/10. Estou treinando um modelo com 70% dos dados e ajustando os parâmetros com base nos resultados do conjunto de validação de 20%. Depois de ajustar os parâmetros nesses dois conjuntos, avalio o modelo no conjunto de teste de 10%. Embora Breiman afirme que a taxa de erro OOB integrada torna redundante um conjunto de testes separado, desconfio de sua afirmação.
Ialm 28/06

Respostas:

19

Faz todo o sentido, e todas as implementações de florestas aleatórias com as quais trabalhei (como as do MATLAB) também fornecem resultados probabilísticos para fazer exatamente isso.

Eu não trabalhei com a implementação do R, mas ficaria chocado se não houvesse uma maneira simples de obter resultados positivos dos votos e da decisão difícil.

Edit: Basta olhar para R e prever.randomForest também gera probabilidades de saída.

Benhamner
fonte
1
Obrigado por sua resposta. Você está certo, eu criei um script que produzirá a proporção de votos que cada objeto recebe. Pergunto-me, porém, quão úteis serão esses votos? Existem próximas etapas que você recomenda? Devo examinar a variabilidade das proporções de votação através de execuções adicionais de RF? Entendo que a RF tem um elemento estocástico. Há algum diagnóstico que eu deva olhar?
Ialm
3
@ Jonathan Você pode tentar olhar para um gráfico que mostre a fração do objeto real de alguma classe em função de uma fração de votos dessa floresta na classe. Eu estava trabalhando em um problema que exigia pontuação de confiança e, por fim, consegui obter uma curva logística muito boa.
@mbq Desculpe, você pode esclarecer o que você quer dizer com isso? Estou interessado na sua sugestão e vou acompanhá-la amanhã!
Ialm
1
Além disso, a variabilidade em uma RF ocorre no estágio de treinamento, portanto, executar amostras de teste várias vezes através da RF não altera os resultados. Eu examinaria a AUC versus o número de árvores na RF, para garantir que você tenha árvores suficientes e, em seguida, otimizaria o parâmetro mínimo de folha de acordo com a AUC.
benhamner
2
@ Jonathan Acho que o mbq está se referindo a algo chamado calibração (embora possa haver outros nomes). Veja, por exemplo, estas perguntas: Calibrando um classificador otimizado para várias classes . A que “valores reais” se refere na classificação supervisionada?
Steffen
17

Se você estiver usando R, o pacote de intercalação o impedirá de reinventar a roda. Por exemplo, o código a seguir usa a validação cruzada para escolher os parâmetros de ajuste para um modelo de floresta aleatório e, em seguida, gera a média e o desvio padrão de precisão para cada dobra de validação cruzada. Por fim, calcula as probabilidades de classe para o modelo.

library(caret)
library(PerformanceAnalytics)
data(iris)

#Make a yes/no dataset
Dataset <- iris
Dataset$Class <- ifelse(Dataset$Species=='versicolor','Yes','No')
Dataset$Class  <- as.factor(Dataset$Class)
Dataset$Species<- NULL
chart.Correlation(Dataset[-5], col= Dataset$Class)

#Fit an RF model
model <- train(Class~.,Dataset,
                method='rf',TuneLength=3,
                trControl=trainControl(
                    method='cv',number=10,
                    classProbs = TRUE))
model$results

#Predict class probabilities (i.e. 'certainty' scores)
pred <- predict(model,iris,"prob")
head(pred)

O bom do sinal de intercalação é que facilita muito a comparação de diferentes modelos preditivos. Por exemplo, se você quiser tentar uma SVM, você pode substituir o texto method='rf'com method='svmLinear'ou method='svmRadial'. Você também pode escolher seus parâmetros de ajuste com base na AUC , em vez de precisão, adicionando uma linha para o parâmetro trainControl: summaryFunction=twoClassSummary.

Por fim, há um pouco de código no pacote PerformanceAnalytics chart.Correlation(Dataset[-5], col= Dataset$Class), que não é necessário para criar o modelo, mas fornece uma boa visualização do seu conjunto de dados.

Zach
fonte
Você está me fazendo um fã do pacote de ajuda. Eu acho que manterei um segundo thread R aberto apenas para tentar diferentes métodos de classificação e fazer com que o cursor faça CV e ajuste de parâmetros por si só e veja se obtive resultados comparáveis.
Ialm 28/06
@ Jonathan feliz em ouvi-lo! É um pacote maravilhoso. Experimente o modelLookup()comando para obter uma lista do que é possível.
Zach
O probtipo de predicttambém está disponível usando randomForestpara treinar seu modelo (com ou sem o uso de outros pacotes como caretou PerformanceAnalytics).
Hack-R
2

O pacote randomForest no R é um pacote bastante decente para obter mais detalhes sobre sua análise. Ele fornece os votos (como uma fração ou contagem bruta) e oferece capacidade incorporada para ajuste e validação cruzada e também pode fornecer mais informações sobre seus recursos (se você quiser saber quais dos seus 100 são o mais importante na análise).

Se você já está usando esse pacote, talvez queira dar uma olhada mais de perto e, se não estiver, talvez dê uma olhada.

user4673
fonte