Mulan: Uma Biblioteca Java para Aprendizado Multirrótulo Victor Freitas Rocha Vitória, 28 de março de 2014 Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 1 / 20 Weka Waikato Environment for Knowledge Analysis Software de mineração de dados feito em Java Começou em 1993 Coleção de algoritmos de aprendizado de máquina Código aberto Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 2 / 20 Weka Waikato Environment for Knowledge Analysis Contém ferramentas para: I Pré-processamento de dados I Classificação I Regressão I Clustering I Regras de associação I Visualização Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 3 / 20 Weka Waikato Environment for Knowledge Analysis Weka permite especificar apenas um único atributo de classe I Não tem suporte a classificação multirrótulo Muitos problemas reais são multirrótulo Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 4 / 20 Classificação unirótulo vs Classificação multirrótulo Exemplo de classificação unirótulo: I Classificação indicativa de um filme: Livre, 10 anos, 12 anos, 14 anos, 16 anos, 18 anos Exemplo de classificação multirrótulo: I Gênero de um filme: Ação, Animação, Aventura, Comédia, Documentário, Musical, Terror, Romance, Esporte Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 5 / 20 Classificação unirótulo vs Classificação multirrótulo Exemplo de classificação unirótulo: I Classificação indicativa de um filme: Livre, 10 anos, 12 anos, 14 anos, 16 anos, 18 anos Exemplo de classificação multirrótulo: I Gênero de um filme: Ação, Animação, Aventura, Comédia, Documentário, Musical, Terror, Romance, Esporte Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 5 / 20 Mulan Extensão do Weka Oferece suporte a base de dados multirrótulo Oferece apenas uma interface de programação I Não possui interface gráfica Não é possível utilizar a biblioteca via linha de comando Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 6 / 20 Mulan Possui uma grande variedade de algoritmos para a execução das principais tarefas de aprendizagem multirrótulo: Classificação Raqueamento Classificação e Ranqueamento Além disso, a biblioteca oferece os seguintes recursos: Seleção de características Avaliação de desempenho Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 7 / 20 Tarefas multirrótulo Exemplo: Possíveis gêneros (rótulos): Ação, Animação, Aventura, Comédia, Documentário, Musical, Terror, Romance, Esporte Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 8 / 20 Tarefas multirrótulo Exemplo: Possíveis gêneros (rótulos): Ação, Animação, Aventura, Comédia, Documentário, Musical, Terror, Romance, Esporte Classificação I Comédia, Ação, Musical, Animação Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 8 / 20 Tarefas multirrótulo Exemplo: Possíveis gêneros (rótulos): Ação, Animação, Aventura, Comédia, Documentário, Musical, Terror, Romance, Esporte Classificação I Comédia, Ação, Musical, Animação Raqueamento I Animação, Ação, Comédia, Musical, Aventura, Romance, Documentário, Esporte, Terror Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 8 / 20 Requerimentos para executar o Mulan Mulan 1.4.0 1.3.0 1.2.0 Weka 3.7.6 3.7.3 3.7.1 Victor Freitas Rocha (NINFA) Java 1.6 ou mais recente 1.5 ou mais recente 1.5 ou mais recente Junit 4.10 ou mais recente 4.5 ou mais recente 4.5 ou mais recente Vitória, 28/03/2014 9 / 20 Formatação dos dados Mulan requer dois arquivos de especificação de uma base de dados multirrótulo. Arquivo ARFF: @relation MultiLabelExample @attribute @attribute @attribute @attribute @attribute @attribute @attribute @attribute feature1 numeric feature2 numeric feature3 numeric label1 {0, 1} label2 {0, 1} label3 {0, 1} label4 {0, 1} label5 {0, 1} @data 2.3,5.6,1.4,0,1,1,0,0 Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 10 / 20 Formatação dos dados Arquivo XML: <labels xmlns="http://mulan.sourceforge.net/labels"> <label name="label1"></label> <label name="label2"></label> <label name="label3"></label> <label name="label4"></label> <label name="label5"></label> </labels> Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 11 / 20 Formatação dos dados Arquivo XML: <labels xmlns="http://mulan.sourceforge.net/labels"> <label name="label1"></label> <label name="label2"></label> <label name="label3"></label> <label name="label4"></label> <label name="label5"></label> </labels> Note que a ordem não importa em nenhum dos dois arquivos Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 11 / 20 Formatação dos dados Os dois arquivos seguintes também constituem uma representação perfeitamente aceitável dos mesmos dados. Arquivo ARFF: @relation MultiLabelExample @attribute @attribute @attribute @attribute @attribute @attribute @attribute @attribute feature1 numeric label3 {0, 1} feature2 numeric label1 {0, 1} feature3 numeric label4 {0, 1} label5 {0, 1} label2 {0, 1} @data 2.3,1,5.6,0,1.4,0,0,1 Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 12 / 20 Formatação dos dados Arquivo XML: <?xml version="1.0" encoding="utf-8"?> <labels xmlns="http://mulan.sourceforge.net/labels"> <label name="label5"></label> <label name="label1"></label> <label name="label3"></label> <label name="label2"></label> <label name="label4"></label> </labels> Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 13 / 20 Formatação dos dados Hierarquias de rótulos podem ser representadas no XML: Arquivo XML: <?xml version="1.0" encoding="utf-8"?> <labels xmlns="http://mulan.sourceforge.net/labels"> <label name="sports"> <label name="football"></label> <label name="basketball"></label> </label> <label name="arts"> <label name="sculpture"></label> <label name="photography"></label> </label> </labels> Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 14 / 20 Criação de um experimento de avaliação empírica Exemplo: MulanExp1.java Carregando a base da dados: String arffFilename = Utils.getOption("arff", args); String xmlFilename = Utils.getOption("xml", args); MultiLabelInstances dataset = new MultiLabelInstances(arffFilename, xmlFilename); Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 15 / 20 Criação de um experimento de avaliação empírica Criação de uma instancia para cada algoritmo que será avaliado LabelPowerset learner1 = new LabelPowerset(new J48()); MLkNN learner2 = new MLkNN(); Criação de um avaliador: Evaluator eval = new Evaluator(); MultipleEvaluation results; Definição das métricas que serão utilizadas: List<Measure> measures = new ArrayList<Measure>(5); measures.add(new ExampleBasedAccuracy()); measures.add(new ExampleBasedPrecision()); measures.add(new ExampleBasedRecall()); measures.add(new HammingLoss()); measures.add(new SubsetAccuracy()); Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 16 / 20 Criação de um experimento de avaliação empírica Para a avaliação será usada validação cruzada: int numFolds = 10; results= eval.crossValidate(learner1, dataset, measures, numFolds); System.out.println(results); results= eval.crossValidate(learner2, dataset, measures, numFolds); System.out.println(results); Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 17 / 20 Obtenção de previsões para um conjunto de dados não rotulados Exemplo: MulanExp2.java Carregando a base da dados: String arffFilename = Utils.getOption("arff", args); String xmlFilename = Utils.getOption("xml", args); MultiLabelInstances dataset = new MultiLabelInstances(arffFilename, xmlFilename); Criar uma instância do algoritmo de aprendizagem que queremos treinar, a fim de construir um modelo e obter previsões: LabelPowerset model = new LabelPowerset(new J48()); Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 18 / 20 Obtenção de previsões para um conjunto de dados não rotulados Treinar o classificador com os dados: model.build(dataset); Carregar o conjunto de dados não rotulados: String unlabeledFilename = Utils.getOption("unlabeled", args); FileReader reader = new FileReader(unlabeledFilename); Instances unlabeledData = new Instances(reader) Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 19 / 20 Obtenção de previsões para um conjunto de dados não rotulados A etapa seguinte é realizar uma previsão para cada instância do conjunto de dados: int numInstances = unlabeledData.numInstances(); for (int instanceIndex=0; instanceIndex < numInstances; instanceIndex++) { Instance instance = unlabeledData.instance(instanceIndex); MultiLabelOutput output = model.makePrediction(instance); System.out.println(output); } Victor Freitas Rocha (NINFA) Vitória, 28/03/2014 20 / 20