Analisi discriminante in R Strumenti quantitativi per la gestione
Transcript
Analisi discriminante in R Strumenti quantitativi per la gestione
4/15/2015 Analisi discriminante in R Analisi discriminante in R Strumenti quantitativi per la gestione Emanuele Taufer Default data LDA con R Output Plot Previsione Tabella di classificazione Cambiare il criterio di classificazione Costruire la curva ROC Crossvalidazione LOOCV Stima del test error rate con LOOCV QDA LOOCV per QDA Confronto LDA QDA Confronto LDA QDA con la curva ROC Riferimenti bibliografici Default data Carichiamo il data set Default library(ISLR) data(Default) head(Default) default student balance income 1 No No 729.5265 44361.625 2 No Yes 817.1804 12106.135 3 No No 1073.5492 31767.139 4 No No 529.2506 35704.494 5 No No 785.6559 38463.496 6 No Yes 919.5885 7491.559 LDA con R La funzione lda() , presente nella libreria MASS , permette di affrontare problemi di classificazione con LDA. La sintassi è analoga a quella che si usa nelle funzioni lm e glm file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 1/9 4/15/2015 Analisi discriminante in R library(MASS) lda.fit=lda(default~balance+income+student,data=Default) Output lda.fit Call: lda(default ~ balance + income + student, data = Default) Prior probabilities of groups: No Yes 0.9667 0.0333 Group means: balance income studentYes No 803.9438 33566.17 0.2914037 Yes 1747.8217 32089.15 0.3813814 Coefficients of linear discriminants: LD1 balance 2.243541e‐03 income 3.367310e‐06 studentYes ‐1.746631e‐01 Plot plot(lda.fit) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 2/9 4/15/2015 Analisi discriminante in R Previsione La classificazione delle unità training (o test) può essere fatta con la funzione predict() L’output di predict() contiene una serie di oggetti, utilizziamo la funzione names() per vedere quali sono e, per poterli analizzare ed utilizzare, mettiamo il tutto in un data.frame . lda.pred=predict(lda.fit, Default) names(lda.pred) [1] "class" "posterior" "x" previsione<‐as.data.frame(lda.pred) head(previsione) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 3/9 4/15/2015 Analisi discriminante in R class posterior.No posterior.Yes LD1 1 No 0.9967765 0.003223517 ‐0.14953711 2 No 0.9973105 0.002689531 ‐0.23615933 3 No 0.9852914 0.014708600 0.57988235 4 No 0.9988157 0.001184329 ‐0.62801554 5 No 0.9959768 0.004023242 ‐0.04346935 6 No 0.9957918 0.004208244 ‐0.02194120 Tabella di classificazione Costruiamo ora un data.frame , Default.LDA, che contiene i dati training e le previsioni della LDA. Costruiamo inoltre una tabella di classificazione Default.LDA<‐cbind(Default, "pred.def"=lda.pred$class, "pr.def"=round(lda.pred$posterio r,digits=4)) head(Default.LDA) default student balance income pred.def pr.def.No pr.def.Yes 1 No No 729.5265 44361.625 No 0.9968 0.0032 2 No Yes 817.1804 12106.135 No 0.9973 0.0027 3 No No 1073.5492 31767.139 No 0.9853 0.0147 4 No No 529.2506 35704.494 No 0.9988 0.0012 5 No No 785.6559 38463.496 No 0.9960 0.0040 6 No Yes 919.5885 7491.559 No 0.9958 0.0042 attach(Default.LDA) addmargins(table(default,pred.def)) pred.def default No Yes Sum No 9645 22 9667 Yes 254 79 333 Sum 9899 101 10000 Cambiare il criterio di classificazione Costruiamo una nuova variabile lda.pred.2 che classifica le unità come default=Yes se la probabilità di default stimata dal modello di LDA è maggiore di 0.2 lda.pred.2=rep("No",nrow(Default)) lda.pred.2[Default.LDA$pr.def.Yes>0.2]="Yes" addmargins(table(default,lda.pred.2)) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 4/9 4/15/2015 Analisi discriminante in R lda.pred.2 default No Yes Sum No 9435 232 9667 Yes 140 193 333 Sum 9575 425 10000 Costruire la curva ROC Per costuire la curva ROC è necessario installare la libreria ROCR . Le tre righe di istruzioni indicate sotto fanno il resto library(ROCR) pred <‐ prediction(Default.LDA$pr.def.Yes, default) perf <‐ performance(pred, measure = "tpr", x.measure = "fpr") plot(perf, colorize=T,lwd=3) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 5/9 4/15/2015 Analisi discriminante in R Crossvalidazione LOOCV L’opzione CV=TRUE nella funzione lda() produce un LOOCV sui dati. In questo caso l’output contiene la classificazione prodotta e le probailità a posteriori (per ciascuna unità esclusa dal data set), per vederne solo una parte è opportuno mettere i risultati in un data.frame lda.fit=lda(default~balance+income+student,data=Default,CV=T) names(lda.fit) [1] "class" "posterior" "terms" "call" "xlevels" lda.LOOCV<‐data.frame(lda.fit$class,lda.fit$posterior) head(lda.LOOCV) lda.fit.class No Yes 1 No 0.9967755 0.003224456 2 No 0.9973093 0.002690741 3 No 0.9852851 0.014714856 4 No 0.9988154 0.001184632 5 No 0.9959757 0.004024296 6 No 0.9957890 0.004210951 Stima del test error rate con LOOCV Calcoliamo una tabella di classificazione ( default=Yes se la probabilità di default stimata dal modello di LDA è maggiore di 0.2 ) in base ai risultati della LOOCV lda.cv.pred.2=rep("No",nrow(Default)) lda.cv.pred.2[lda.LOOCV$Yes>0.2]="Yes" addmargins(table(default,lda.cv.pred.2)) lda.cv.pred.2 default No Yes Sum No 9435 232 9667 Yes 140 193 333 Sum 9575 425 10000 QDA L’analisi discriminante quadratica può essere fatta utilizzando la funzione qda() qda.fit<‐qda(default~balance+income+student,data=Default) qda.fit file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 6/9 4/15/2015 Analisi discriminante in R Call: qda(default ~ balance + income + student, data = Default) Prior probabilities of groups: No Yes 0.9667 0.0333 Group means: balance income studentYes No 803.9438 33566.17 0.2914037 Yes 1747.8217 32089.15 0.3813814 LOOCV per QDA Analogamente a quanto visto per la LDA, una LOOCV può essere effettuata semplicemente inserendo l’opzione CV=TRUE qda.fit<‐qda(default~balance+income+student,data=Default,CV=TRUE) names(qda.fit) [1] "class" "posterior" "terms" "call" "xlevels" qda.LOOCV<‐data.frame(qda.fit$class,qda.fit$posterior) head(qda.LOOCV) qda.fit.class No Yes 1 No 0.9993994 0.0006005886 2 No 0.9994829 0.0005170994 3 No 0.9900671 0.0099329377 4 No 0.9998886 0.0001113890 5 No 0.9989423 0.0010577454 6 No 0.9986900 0.0013100168 qda.cv.pred.2=rep("No",nrow(Default)) qda.cv.pred.2[qda.LOOCV$Yes>0.2]="Yes" addmargins(table(default,qda.cv.pred.2)) qda.cv.pred.2 default No Yes Sum No 9336 331 9667 Yes 121 212 333 Sum 9457 543 10000 file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 7/9 4/15/2015 Analisi discriminante in R Confronto LDA QDA Utilizzando i risultati ottenuti, confrontiamo LDA e QDA comparando le stime del test error rate ottenute dalla LOOCV LDA La sensitività è pari al 57.96 % ( 193/333) La specificità è pari al 97.6% (9435/9667 ) QDA La sensitività è pari al 63.66 % ( 212/333) La specificità è pari al 96.58 % (9336/9667 ) Confronto LDA QDA con la curva ROC lda.pred <‐ prediction(lda.LOOCV$Yes, default) lda.perf <‐ performance(lda.pred, measure = "tpr", x.measure = "fpr") qda.pred <‐ prediction(qda.LOOCV$Yes, default) qda.perf <‐ performance(qda.pred, measure = "tpr", x.measure = "fpr") plot(lda.perf, col="blue",lwd=2) plot(qda.perf, col="red",lwd=2,add=TRUE) legend(0.6,0.6,c('LDA','QDA'),col=c('blue','red'),lwd=3) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 8/9 4/15/2015 Analisi discriminante in R Riferimenti bibliografici An Introduction to Statistical Learning, with applications in R. (Springer, 2013) Alcune delle figure in questa presentazione sono tratte dal testo con il permesso degli autori: G. James, D. Witten, T. Hastie e R. Tibshirani Tobias Sing, Oliver Sander, Niko Beerenwinkel, Thomas Lengauer. ROCR: visualizing classifier performance in R. Bioinformatics 21(20):39403941 (2005). file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4__LDA.html 9/9