Classificação Multirrótulo: Calculando Similaridades entre Rótulos - Parte 10
Oi galera! Estou de volta! Vamos dar uma organizada em nosso projeto R e dar seguimento para as medidas de similaridades propriamente ditas. Partiu?!
ORGANIZANDO O PROJETO R
Pessoal, fizemos um monte de coisas em nosso script main.R e convenhamos que ele ficou meio bagunçado né! Aliás, segue aqui o link para você baixar a versão mais atualizada. Faça isso antes de continuarmos.
Em nosso projeto vamos criar os seguintes novos scripts: funcoes.R, bibliotecas.R e similaridades.R. Copie todo o código do script main.R para um arquivo de texto como sublimetext, notepad, notepad++, ou outro editor de sua preferência. Vamos deixar nosso script main.R vazio. Em todos os scripts, as três primeiras linhas serão as seguintes:
FolderRoot = "~/Multirrotulo-Similaridade"
FolderScripts = "~/Multirrotulo-Similaridade/R"
setwd(FolderScripts)
Dessa forma garantimos que os nossos scripts funcionarão corretamente. setwd() fixa o diretório que estamos usando para executar os scripts. Em nosso caso é o FolderScripts. No script bibliotecas.R vamos colocar todos os pacotes R que precisamos para executar nosso código. Veja como fica:
FolderRoot = "~/Multirrotulo-Similaridade"
FolderScripts = "~/Multirrotulo-Similaridade/R"
setwd(FolderScripts)
library(progress)
library(tidyverse)
No script funcoes.R vamos colocar todas as funções que criamos. Aproveitei para deixar tudo em português brasileiro, já que estamos aqui no Brasil e tenho como objetivo popularizar a ciência por aqui. Nomes de variáveis, funções, etc., passei tudo para a nossa língua mãe!
Para não ocupar muito espaço aqui, vou pedir para que vocês façam download do script clicando aqui, assim vocês podem ver como ele ficou. Nesse script funções.R não vamos colocar nada além das funções, as chamadas ficarão no main.R
Ótimo! O nosso script similaridades.R conterá todas as funções de cálculo das medidas de similaridades que vamos ver a partir de hoje. A partir de agora nosso projeto está funcionando em MÓDULOS! Eita, mais uma palavra nova por aqui.
O que estamos fazendo neste momento é modularizar nosso código, isto é, estamos definindo arquivos que tem um objetivo específico, algo bem parecido com as funções. Enquanto cada função executa uma tarefa específica, um módulo contém funções que fazem parte de um mesmo escopo.
Vocês podem seguir esse padrão nos projetos de vocês se quiserem:
bibliotecas.R = contém todos os pacotes R
script_1.R = conjunto de funções de um escopo X
script_2.R = conjunto de funções de um escopo Y
script_N.R = conjunto de funções de um escopo N
main.R = programa principal
Em nosso script main.R devemos importar todos os nossos scripts, isto disponibilizará as funções dos outros scripts para serem usadas aqui. Por enquanto, ficará assim:
FolderRoot = "~/Multirrotulo-Similaridade"
FolderScripts = "~/Multirrotulo-Similaridade/R"
# carregando os outros scripts que criamos
setwd(FolderScripts)
source("bibliotecas.R")
source("funcoes.R")
source("similaridades.R")
# abrindo o espaço de rótulos
FolderData = paste(FolderRoot, "/Data", sep="")
setwd(FolderData)
dataset = data.frame(read.csv("dataset.csv"))
dataset = dataset[,-1]
O comando source() é responsável por carregar os outros scripts! Note que eu criei uma string chamada FolderData a qual contém o diretório de onde nossos dados estão salvos. Fiz dessa forma para que esse caminho absoluto do diretório possa ser reutilizado quantas vezes forem necessárias dentro do script main.R. Sem contar que é um pouco ruim ficar digitando o caminho inteiro toda vez que você precisar mudar a pasta que está trabalhando!
MEDIDAS DE SIMILARIDADE
Como eu comentei no início desta série de artigos, as medidas de similaridade baseadas em dados categóricos usam a tabela de contingência. Com base nas pesquisas que eu fiz durante o meu doutorado, eu elaborei todas essas funções para serem usadas em um script R.
Não entrarei em detalhes sobre cada uma delas. Meu objetivo é que vocês sejam capazes de calcular essas medidas para conjuntos de dados multirrótulo. O conhecimento teórico terá de ficar para outro momento, caso contrário esta série nunca terá fim!
No entanto, existem muitos artigos científicos que vocês podem ler a respeito desse assunto. Recomendo pesquisar sobre nas bases IEEE e ACM. Além disso, segue aqui os principais artigos que eu consultei para escrever esta série:
Cha, Sung-Hyuk. “Comprehensive Survey on Distance/Similarity Measures between Probability Density Functions.” (2007).
Irani, Jasmine Khushro, et al. “Clustering Techniques and the Similarity Measures used in Clustering: A Survey.” International Journal of Computer Applications 134 (2016): 9-14.
Choi, Seung-Seok, et al. “A Survey of Binary Similarity and Distance Measures.” Journal on Systemics, Cybernetics and Informatics 8 (2010): 43-48.
Gjorgjioski, Valentin, et al. “Comparison of Distances for Multi-Label Classification with PCTs.” (2011).
Garg, Ankit, et al. “On Asymmetric Similarity Search.” 2015 IEEE 14th International Conference on Machine Learning and Applications (ICMLA) (2015): 649-654.
Warrens, Matthijs Joost. “Similarity Coefficients for Binary Data. Properties of Coefficients, Coefficient Matrices, Multi-way Metrics, and Multivariate Coefficients.” Dissertation Leiden University. ISBN 978-90-8891-0524. 2008.
Lista das medidas de similaridade:
Sei que algumas funções não ficaram totalmente legíveis aqui, mas acredito que fazendo download da imagem e dando zoom vocês conseguirão ver melhor. O que precisamos fazer é converter esses cálculos para funções. Vou mostrar como converter uma delas e as outras vocês podem tentar fazer por conta. De qualquer forma, todas elas estarão disponíveis na versão final do nosso projeto. Vamos fazer a vari, segue a primeira versão dela:
vari_v1 <- function(a, b, c, d){
d1 = (b+c)
d2 = (4 * (a + b + c + d))
d3 = (d1/d2)
return(d3)
}
Essa medida usa os quatro parâmetros da tabela de contingência, então passamos os quatro como parâmetros pra ela. Em seguida eu dividi o cálculo em partes para ficar fácil o entendimento, mas você poderia fazer tudo numa linha só, e assim temos uma segunda versão dessa função:
vari_v2 <- function(a, b, c, d){
return((b+c) / (4 * (a + b + c + d)))
}
Bom, agora é seguinte, tem 3 formas diferentes da gente calcular a matriz de similaridade para as funções de similaridade. Pois é! Tem o jeito fácil, que é pra quando a gente vai fazer tudo direto, e tem o jeito mais difícil que é pra quando a gente quer calcular automaticamente TODAS as medidas de similaridade de uma vez só, ou uma parte delas que seja.
Exemplo, temos quase 70 medidas de similaridade implementadas neste código. Eu posso mandar executar de uma vez só os cálculos para 30 delas! Ficou curioso? Então, se liga no próximo artigo tá bom! Vou explicar tudo isso lá.
DOWNLOAD
Baixe aqui o projeto atualizado.
Este artigo foi escrito por Elaine Cecília Gatto - Cissa e publicado originalmente em Prensa.li.