Testando Classificação
Este exemplo mostra como fazer validação cruzada (leave-one-out) de uma classificação qualquer utilizando três alternativas:
Função que faz a análise
Argumentos da função testa.classificacao():
- dad - data.frame com variáveis numéricas (e.g. morfológicas, NIR, shape, etc) e apenas 1 coluna categórica com a classificação a ser testada
- colgrp - o nome da coluna categórica em dad
Retornar uma lista com três objetos:
- BRUTOS - data.frame com a validação de cada amostra individualmente (três linhas por amostra, uma para cada método)
- RESUMOS - lista com três matrizes de confusão, uma para cada método de classificação (SVM,BAYES,LDA)
- ANALISES.RES - uma tabela resumindo o resultado global de cada método de classificação (SVM,BAYES,LDA)
funcoesnecessarias.r - arquivo com várias funções usadas neste e demais scripts
Aplicando a função
dad #contém meus dados conforme indicado acima colgrp #nome da coluna que tem a classificacao a ser testada #chama as funcoes source("funcoesNecessarias.R") #testa a classificação testa.classificacao(dad,colgrp=colgrp, analises=c("svm","bayes","lda"),method=c("loo","perc"),perc=30) #pode modificar os argumentos analises, method. O padrão acima irá fazer as tres analises e usar loo e perc é ignorado. #Porcentagem de Acertos por espécie e total para cada analise oteste$ANALISES.RES #salva isso num arquivo #write.table(final$ANALISES.RES,file='resumo_das_analises.csv',sep='\t',row.names = T) #Plota as Matrizes de Confusão de Cada Análise tbs = oteste$RESUMOS l=1 pdf(file='GruposApriori_confusao.pdf',width=7,height=10) par(mar=c(1,12,12,1),mfrow=c(3,1)) for(l in 1:length(tbs)) { tb = tbs[[l]] nn = sort(colnames(tb)) tb = tb[nn,nn] qual = names(tbs)[l] #define cores do backgroun e texto bg.cols= tb txt.cols = tb #se for 0 é branco bg.cols[tb==0] = gray(level=1) txt.cols[tb==0] = gray(level=1) #se for 1 é cinza claro bg.cols[tb==1] = gray(level=0.8) txt.cols[tb==1] = gray(level=0) #se for entre 1 e 5 é um pouco mais escuro bg.cols[tb>1 & tb<=5] = gray(level=0.6) txt.cols[tb>1 & tb<=5] = gray(level=0) bg.cols[tb>5 & tb<=10] = gray(level=0.4) txt.cols[tb>5 & tb<=10] = gray(level=1) #se for > 10 o fundo é preto e o texto branco bg.cols[tb>10] = gray(level=0) txt.cols[tb>10] = gray(level=1) #one for 0 coloca NA, isso não é plotado tb[tb==0] = NA plotamatriz(tb,bg.cols=bg.cols,txt.cols=txt.cols,valcex=0.8, cexaxis = 0.8) mtext(side=3,text = qual,adj=0,cex=0.8,line=7) } dev.off()