Classificação Multirrótulo: Propriedades dos Dados Multirrótulo - Parte 2
Olá pessoal! De volta aqui para continuarmos mais uma série de artigos sobre Classificação Multirrótulo. Hoje vamos começar a entender as propriedades dos dados multirrótulo. Preparados?
ABRINDO E EXPLORANDO O DATASET
Antes de mais nada, precisamos abrir o dataset multirrótulo que vamos usar como base para o nosso aprendizado aqui nesta série de artigos. Entre no seu projeto do RStudio, crie um novo script R e salve-o com o nome de teste.R. Nesse script a gente vai testando umas coisas e depois organiza tudo! Vamos começar setando a pasta de trabalho:
FolderRoot = "~/Propriedades-Multirrotulo"
FolderScripts = "~/Propriedades-Multirrotulo/R"
setwd(FolderRoot)
Ótimo! Agora, para executar esses comandos, você precisa selecionar as linhas e apertar CTRL+ENTER. A partir de agora, sempre que aparecer EXECUTAR no texto, entenda como selecionar a(s) linha(s) de código e apertar CTRL+ENTER, fechado?
Neste vídeo eu mostro como isso acontece, dê uma conferida antes de prosseguir pois assim você não ficará com dúvidas. Se você não baixou o dataset ainda, então clique aqui! Agora, vamos definir uma string que conterá o endereço de onde estão salvos os dados:
FolderDados = "~/Propriedades-Multirrotulo/Dados"
Lembre-se de executar o comando para que tenha efeito. Vamos agora definir uma string que conterá o o nome do dataset junto com o endereço da pasta onde ele está salvo:
nome.arff = paste(FolderDados, "/flags.arff", sep="")
Execute! Para prosseguir, precisamos instalar um pacote para poder abrir um arquivo do tipo ARFF:
install.packages("foreign", dependencies = TRUE)
Execute! Terminada a instalação podemos usar o pacote através do seguinte comando:
library(foreign)
Execute! Finalmente, somos capazes de abrir o arquivo:
flags = data.frame(read.arff(nome.arff))
Execute! Estou salvando o conteúdo de flags.arff na variável chamada flags que é do tipo dataframe. Portanto, tudo o que está dentro do arquivo flags.arff foi copiado para um espaço na memória que eu chamei de flags. Dataframe é uma estrutura de dados que nos permite manipular uma tabela. Para ver apenas as primeiras linhas do arquivo execute:
head(flags)
Para saber quantas linhas tem o arquivo execute o seguinte comando:
nrow(flags)
Para saber quantas colunas tem o arquivo execute o seguinte comando:
ncol(flags)
Note que, tanto para nrow(), quanto para ncol(), o único parâmetro necessário é o nome do dataframe. Quero dizer que, dentro do parênteses desses comandos, obrigatoriamente devemos passar alguma informação que esteja no formato tabular.
Vale dizer que o "n" vem de number, row significa linhas e col significa colunas. Assim fica fácil se lembrar desses comandos né?!! Para visualizar o dataset inteiro tabulado execute:
View(flags)
Com isso agora sabemos que este dataset tem 194 linhas, que correspondem às entradas do conjunto de dados multirrótulo, e também 26 colunas que correspondem aos atributos. Este dataset tem 7 rótulos e eles estão ao final do dataframe (tabela), são as colunas red, green, blue, yellow, white, black e orange.
O dataset FLAGS contém dados de países e suas respectivas bandeiras, e a TAREFA de classificação multirrótulo consiste em predizer as cores que aparecem na bandeira de um país. O domínio de aplicação, portanto, é o de imagem! Para saber mais detalhes sobre como este dataset foi construído, consulte o artigo científico original aqui!
Este dataset já foi tratado, por isso, não precisamos nos preocupar com valores faltantes, isto é, não há NAs ou NANs. Bom, mas o que mais conseguimos de informação sobre esse dataset? A gente pode executar o seguinte comando:
summary(flags)
Esse comando retorna para nós informações estatísticas básicas como os valores mínimos, máximos, média, mediana, primeiro e terceiro quadrantes de cada atributo (coluna). Esse comando não retorna o desvio padrão, nem a soma, por exemplo. No entanto, se quiser obter o desvio padrão, é possível através do seguinte comando:
apply(flags, 2, sd)
Onde sd significa standart deviation e apply é uma função para manipulação de dataframe. O primeiro argumento dessa função é um dataframe que queremos aplicar um cálculo, o segundo argumento é o local onde será feito esse cálculo (1 - linhas, 2 - colunas), e, por fim, o terceiro argumento é qual cálculo será realizado, exemplos: sum = soma, mean = média, median = mediana, max = valor máximo, mín = valor mínimo.
Ok, beleza! Já temos várias informações legais aqui, mas agora eu quero ter mais informações sobre os rótulos, que estão lá nas últimas colunas. Vou separar aqui o espaço de rótulos dos outros atributos. O dataset tem 26 colunas e 7 rótulos, então a faixa dos rótulos está nas colunas de 20 a 26. Execute o seguinte comando:
labels = flags[,c(20:26)]
Vamos entender o comando acima. O dataframe é formado por linhas e colunas e podemos acessá-las da seguinte forma dataframe[ linha , coluna ]. Dessa forma, execute os seguintes comandos:
flags[1,1]
flags[1,]
flags[,1]
Note que o primeiro comando vai retornar para a gente o valor da primeira linha com a primeira coluna do dataset flags. O segundo comando vai retornar os dados da primeira linha apenas, enquanto o terceiro comando retorna os dados da primeira coluna. E é assim que conseguimos acessar os dados das linhas e colunas.
O comando c() cria um vetor. Os dois pontos entre 20 e 26 indica que queremos selecionar uma sequência que está entre 20 e 26. Em nosso caso, queremos selecionar todas as colunas que estão entre as colunas 20 e 26. Portanto, flags[,c(20:26)] seleciona as colunas 20, 21, 22, 23, 24, 25 e 26 do dataframe flags.
Se quisermos selecionar uma sequência de linhas, basta fazer dataframe[c(__:__), ]. Também podemos selecionar colunas e linhas distantes, basta separar os valores por vírgula:
flags[, c(1, 5, 10)]
flags[c(6, 50, 80), ]
Vamos usar o comando summary para obter o sumário do espaço de rótulos:
summary(labels)
O interessante aqui é que os valores 1 e 0 não estão listados como numéricos, mas sim como "factors". Como sei disso? Bem, podemos usar o seguinte comando para descobrir o tipo dos objetos em R, vejam:
class(flags) # retorna que é dataframe
class(labels) # retorna que é dataframe
class(flags$zone) # retorna que é "factor"
class(flags$bars) # retorna que é numérico
Se quisermos somar, subtrair ou realizar outra operação matemática com os dados que são do tipo FACTOR, isto é, são dados do tipo categórico, algo parecido com uma string, mas não exatamente. Devemos então convertê-los para numéricos. Este é o caso do espaço de rótulos, onde todas as colunas são FACTOR. O comando para converter várias colunas de uma única vez é o seguinte:
labels2 = data.frame(apply(labels, 2, as.numeric))
Para verificar, execute os seguintes comandos:
class(labels2)
class(labels2$red)
Agora execute novamente o comando a seguir:
summary(labels2)
Note que a saída no console é totalmente diferente! Vamos somar as colunas, isto é, os labels?
soma = data.frame(apply(labels2, 2, sum))
View(soma)
A variável soma armazena o resultado da soma de todas as colunas do dataframe labels2. A partir da soma a gente consegue saber quantas vezes o rótulo aparece sozinho no dataset, isto é, a gente consegue responder à seguinte pergunta:
Quantas instâncias pertencem à cada rótulo?
Resposta: RED =153; GREEN = 91, BLUE = 99, YELLOW = 91, WHITE, 146, BLACK = 52; ORANGE = 26.
Podemos concluir disto que o rótulo menos frequente no dataset é o ORANGE, pois ele aparece sozinho menos vezes do que todos outros, enquanto que o rótulo mais frequente é o RED.
Vejam, a partir de continhas básicas conseguimos responder a várias perguntas que são importantes. É sempre bom conhecermos bem o dataset antes de usá-lo, ou seja, é importante fazer uma análise exploratória dos dados!
CONCLUSÃO
Pessoal, vou encerrando por aqui. No próximo artigo darei continuidade a esta analise exploratória e vamos ver também outras características importantes dos datasets multirrótulo. Espero vocês lá!
Este artigo foi escrito por Elaine Cecília Gatto - Cissa e publicado originalmente em Prensa.li.