UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ (UTFPR) Mineração de Dados 2016/3 Professores Celso e Heitor Jean Avila Rangel 1801317 - PPGCA PPGCA/UTFPR câmpus Curitiba -- CAIA003 - Mineração de Dados -- Profs. Celso Kaestner e Heitor Lopes - Trabalho Breast Cancer R ou Weka Exercício referente à aula 5: elaborar relatório técnico que relate a aplicação dos classificadores Naïve-Bayes e knn sobre a base Breast Cancer Winconsin, utilizando a linguagem R ou o ambiente Weka. Silva (2014) faz a classificação dos elementos no trabalho Data Mining sobre um dataset de Câncer de Mama: Os atributos são: Espessura dos grupos (Clump Thickness): células benignas a tendem a ser agrupadas em monocamadas, enquanto que as células cancerosas são muitas vezes agrupadas em multicamadas. Uniformidade de tamanho e forma da célula (Uniformity of Cell Size & 3 Uniformity of Cell Shape): As células cancerosas tendem a variar em tamanho e forma (como o exemplo mostrado na Figura 2). É por isso que esses parâmetros são úteis para determinar se as células são cancerosas ou não. Adesão Marginal (Marginal Adhesion): As células normais tendem a ficar juntas. As células cancerosas tendem a perder essa capacidade (como o exemplo mostrado na Figura 3). Então perda de adesão é um sinal de malignidade. Tamanho único das células epiteliais (Single Epithelial Cell Size): está relacionada com a uniformidade mencionado acima. As células epiteliais que estão significativamente aumentadas pode ser uma célula maligna. Núcleos nus (Bare Nuclei): Este é um termo usado para núcleos que não são rodeados pelo citoplasma (o resto da célula). São tipicamente vistos em tumores benignos. Suavidade da cromatina (Bland Chromatin): Descreve uma textura uniforme do núcleo visto em células benignas. Em células cancerosas, a cromatina tende a ser mais grosseira. Nucléolo normal (Normal Nucleoli): nucléolos são pequenas estruturas existentes no núcleo. Em células normais, o nucléolo é geralmente muito pequeno, quando visível. Em células cancerosas os nucléolos se tornam mais proeminentes. Mitose: Patologistas podem determinar o grau de um tumor contando o número de mitoses.
O trabalho a seguir está baseado conforme o trabalho de Silva (2014), pois ele executou praticamente os mesmos procedimentos. O último atributo (classificador) está como número 2 para benigno e 4 para maligno. Para trocar os valores, utilizamos a ferramenta Notepad++ e fizemos o localizar e substituir por expressão regular utilizando o 2$ e 4$ ($ busca o final da linha). 1) carregar os arquivos do dataset Breast Cancer para o RSTUDIO: bc<- read.csv("c:/users/jean 000/Desktop/breastcancer/jeanrangelbreast-cancer-wisconsin.data", header=f) 2) Adicionando nome para os atributos: > names(bc) <- c("samplecodenumber", "ClumpThickness", "UniformityofCellSize", "UniformityofCellShape", "MarginalAdhesion", "SingleEpithelialCellSize", "BareNuclei", "BlandChromatin", "NormalNucleoli", "Mitoses", "Class") 3) Observando o tamanho do dataset: > dim(bc) [1] 699 11 699 instâncias e 11 atributos (sendo o último, o classificador) summary(bc) Samplecodenumber ClumpThickness UniformityofCellSize UniformityofCellShape MarginalAdhesion Min. : 61634 Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.000 1st Qu.: 870688 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 1.000 Median : 1171710 Median : 4.000 Median : 1.000 Median : 1.000 Median : 1.000 Mean : 1071704 Mean : 4.418 Mean : 3.134 Mean : 3.207 Mean : 2.807 3rd Qu.: 1238298 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.000 Max. :13454352 Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.000 SingleEpithelialCellSize BareNuclei BlandChromatin NormalNucleoli Mitoses Min. : 1.000 1 :402 Min. : 1.000 Min. : 1.000 Min. : 1.000 1st Qu.: 2.000 10 :132 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000
Median : 2.000 2 : 30 Median : 3.000 Median : 1.000 Median : 1.000 Mean : 3.216 5 : 30 Mean : 3.438 Mean : 2.867 Mean : 1.589 3rd Qu.: 4.000 3 : 28 3rd Qu.: 5.000 3rd Qu.: 4.000 3rd Qu.: 1.000 Max. :10.000 8 : 21 Max. :10.000 Max. :10.000 Max. :10.000 (Other): 56 Class benigno:458 maligno:241 Podemos perceber que grande parte dos dados está nos casos BENÍGNOS. 4) Fazendo o balanceamento da base, precisamos instalar o pacote: install.packages("dmwr") e após: > library (DMwR) Carregando pacotes exigidos: lattice Carregando pacotes exigidos: grid Warning message: package DMwR was built under R version 3.3.2 > bcb <- SMOTE(Class ~., bc, perc.over = 100,perc.under=200) > table(bcb$class) 482 482 5) Para utilizarmos os algoritmos, dividimos o dataset para dados de TESTE (30%) e dados de TREINO (70%). > set.seed(1234) > ind <- sample(2,nrow(bcb), replace=true, prob=c(0.7,0.3)) > traindata <- bcb[ind==1,] > testdata <- bcb[ind==2,] > table(traindata$class)
339 335 6) Para utilizarmos o NAYVE BAYES, instalamos a biblioteca e1071 em Install Packages: install.packages("e1071"). > library(class) > library(e1071) Criar uma fórmula > library (party) > myformula <- Class ~ ClumpThickness + UniformityofCellSize + UniformityofCellShape + MarginalAdhesion + SingleEpithelialCellSize + BareNuclei + BlandChromatin + NormalNucleoli + Mitoses Para rodarmos: > mynb <- naivebayes(myformula, data=traindata) > table(predict(mynb, traindata[,-11]), traindata[,11]) benigno 322 7 maligno 17 328 Analisando o resultado, vimos que o pior caso médico (quando um doutor fala para o paciente que ele não tem câncer, mas na verdade ele tem) ocorre em porcentagem menor à 6%. Rodando no conjunto para testes, e resultado também foi satisfatório *claro, se considerarmos que aplicamos um algoritmo padrão num dado com pouco pré-processamento*:
> testpred <- predict(mynb, newdata = testdata) > table(testpred, testdata$class) testpred benigno 137 5 maligno 6 142 Acurácia = (137 + 143) / (137 + 143 + 5 + 6) 96,2% 7) Utilizando o knn: Para utilizar, devemos retirar os valores vazios (estão como? no dataset), pois o algoritmo do knn não consegue lidar com valores que não são numéricos. Obtemos os valores, onde o melhor resultado foi o obtido com o K igual a 3 (vizinhos próximos): > library(dmwr) > myknn1 <- knn(myformula, traindata, testdata, k=1) > myknn3 <- knn(myformula, traindata, testdata, k=3) > myknn5 <- knn(myformula, traindata, testdata, k=5) > myknn30 <- knn(myformula, traindata, testdata, k=30) > myknn200 <- knn(myformula, traindata, testdata, k=200) > table(testdata[,'class'], myknn5) myknn5 benigno 138 4 maligno 4 141 > table(testdata[,'class'], myknn3) myknn3 benigno 139 3 maligno 7 138 > table(testdata[,'class'], myknn1) myknn1 benigno 139 3
maligno 3 142 > table(testdata[,'class'], myknn30) myknn30 benigno 138 4 maligno 3 142 > table(testdata[,'class'], myknn200) myknn200 Matriz de confusão: benigno 138 4 maligno 13 132 Acurácia = (138 + 132) / (138 + 132 + 4 + 13) 94% Considerando que para o algoritmo KNN nós reduzimos o dataset para eliminar os dados faltantes, os resultados foram bem similares, sendo que o algoritmo NAYVE BAYES se mostrou 2% mais eficiente.