Para esta tarefa de predição foram utilizadas as mesmas métricas e conjunto de algoritmos da predição de bugs de código. As simulações dos modelos anteriores serviram como expertise para construção do(s) modelo(s) de predição para os bugs funcionais. O processo de extração e análise dos dados é mostra na Figura 5.1.
Figura 5.1: Processo de extração e análise dos dados para bugs funcionais
Com relação aos erros reportados pela equipe, e de acordo com a Figura 5.1 na etapa 39
(a) tem-se o levantamento dos dados históricos de bugs de sistema, bem como as versões do sistema a serem utilizadas. Em (b) a extração das métricas de código pelo SQ. A etapa (c) consiste na tarefa de rastreabilidade dos bugs e tem o intuito de determinar os defeitos de sistema reportados pelo time. Foi realizada, então, a ligação do erro a uma ou mais classes Java do sistema. São os bug funcionais. Assim, cada classe modificada devido à correção do erro recebeu um rótulo bug. Percebeu-se que parte dos erros cadastrados estavam ligados apenas a uma classe do sistema, mas existiam ainda situações que um bug reportando e corrigido alterava mais de uma classe. Diante disso, em nosso mapeamento, o rótulo bug foi atribuído a uma ou mais classes Java que tenham sido alteradas devido à correção do erro reportado pelo time.
Na fase de pré-processamento (d), de forma equivalente a predição de bugs de código, também foi realizada uma limpeza dos dados extraídos e retirada de possíveis dependências.
As etapas seguintes (e, f e g) seguiram de forma análoga os mesmos procedimentos realiza-dos nas etapas do capítulo 4. Porém, a tarefa foi modificada no aspecto que o objetivo, neste momento, é prever os erros funcionais. Ou seja, a classificação das instâncias deveria ser realizada em apenas duas classes: com erros e sem erros.
Figura 5.2: Distribuição das instâncias nas bases de treinamento e testes para as duas classes possui e não possui bugFuncional mostrando o alto nível de desbalanceamento com total de instâncias
Diferentemente do que ocorre com a predição dos bugs do SQ, o uso de uma base desba-lanceada 5.2 não retorna uma boa predição, como mostrado na Tabela 5.1. As seis primeiras versões (2-12-0 até 2-17-0) foram utilizadas para compor a base de treinamento, sendo que
5.1 Abordagem das Simulações para Bugs Funcionais 41
apenas os dados duplicados foram retirados. Deste modo foram usadas 6070 instâncias, das quais 86 possuíam bugs funcionais. As duas últimas versões (2-18-0 e 2-19-0) foram utiliza-das para compor a base de testes, também com a retirada dos dados duplicados. Neste caso tivemos um total de 5369 instâncias, das quais 22 possuíam bugs funcionais. De acordo com a Tabela 5.1, alguns preditores (J48, OneR e Ibk) não foram capazes de fazer uma predição mínima na base de teste proposta. Ou seja, parte dos algoritmos erraram todas as instâncias da classe minoritária.
Tabela 5.1: Resultados da execução dos algoritmos de predição para as duas últimas versões do sistema usando o total de instâncias – Bugs Funcionais
J48 OneR Ibk(5) RNA NB
CC 99,59% 99,59% 99,57% 99,51% 95,66%
MAE 0,0181 0,0041 0,0165 0,0187 0,0439
RMSE 0,0647 0,0640 0,0809 0,0704 0,2033
TPR 0 1,0000 1,0000 1,0000 0,9999 0,9590 TPR 1 0,0000 0,0000 0,0000 0,1360 0,364 MPTPR 0,9960 0,9960 0,9960 0,9950 0,957 MATPR 0,5000 0,5000 0,5000 0,5679 0,6615
CC: Instâncias Classificadas Corretamente, MAE: Erro Médio Absoluto, RMSE: Erro Quadrático Médio, TPR 0: Taxa de Verdadeiros Positivos para a Classe Sem Bugs, TPR 1: Taxa de Verdadeiros Positivos para a Classe Com Bugs, MPTPR: Média Ponderada da Taxa de Verdadeiros Positivos, MATPR: Média Aritmética da Taxa de Verdadeiros Positivos
Para corrigir este problema, abordamos a mesma técnica utilizada no modelo de clas-sificação utilizado na predição de bugs de código (SQ) de forma que apenas as instâncias classificadas nas classes b e c (as quais podem ou não ter bugs funcionais) e as instâncias que possuem bugs funcionais (mas não pertencem às classes b e c) serão utilizadas no treina-mento de um modelo para a previsão de bugs funcionais. Note que se o objetivo da simulação anterior fosse apenas indicar se a instância não possui (classe a) ou possui (classe b e c) erro, ou seja, a classe b e c fossem unidas, o classificador OneR teriam uma acurácia máxima.
Para avaliarmos esta abordagem, fixamos os números de instâncias com bugs funcionais na base de treinamento (86) e na base de testes (22) e realizamos simulações (Tabela 5.2) apenas com instâncias que possuíam bugs de código. Assim todas nossas instâncias apresentam ao menos um tipo de erro, bug de código ou funcional, ou ainda, ambos.
Tabela 5.2: Número de instâncias com bugs de código na base de treinamento e de testes para a execução das simulações de previsão de bugs funcionais. Os resultados para cada combinação se encontram nas tabelas de 5.3 a 5.8
Tabela com os resultados das simulações
5.3 5.4 5.5 5.6 5.7 5.8
Treinamento 534 381 300 250 200 100
Teste 472 337 300 250 200 100
A primeira simulação indicado na Tabela 5.2 utiliza o maior número de instâncias com bugs de código nas bases de treinamento e testes (534/472). O resultado é mostrado na Tabela 5.3. As demais simulações, respectivamente, fazem uma seleção aleatória das instân-cias (undersampling) de modo a se obter cada vez mais um número próximo a um melhor balanceamento. O objetivo é verificar se a questão do balanceamento tem uma conotação significante neste cenário, onde apenas instâncias com bugs são utilizadas. Os resultados são mostrados da Tabela 5.4 a 5.8.
Tabela 5.3: Resultados da execução dos algoritmos de predição, simulação (534/472) – Bugs Funcionais
J48 OneR Ibk(5) RNA NB
CC 95,55% 98,18% 95,55% 97,17% 71,66%
MAE 0,1691 0,0182 0,1073 0,3390 0,3244
RMSE 0,2259 0,1350 0,2250 0,1555 0,4720
TPR 0 1,0000 1,0000 0,9960 0,9890 0,7330 TPR 1 0,0000 0,5910 0,0910 0,5910 0,3640 MPTPR 0,9550 0,9820 0,9550 0,9720 0,7170 MATPR 0,5000 0,7955 0,5435 0,7900 0,5480
CC: Instâncias Classificadas Corretamente, MAE: Erro Médio Absoluto, RMSE: Erro Quadrático Médio, TPR 0: Taxa de Verdadeiros Positivos para a Classe Sem Bugs, TPR 1: Taxa de Verdadeiros Positivos para a Classe Com Bugs, MPTPR: Média Ponderada da Taxa de Verdadeiros Positivos, MATPR: Média Aritmética da Taxa de Verdadeiros Positivos
5.1 Abordagem das Simulações para Bugs Funcionais 43
Tabela 5.4: Resultados da execução dos algoritmos de predição, simulação (381/337) – Bugs Funcionais
J48 OneR Ibk(5) RNA NB
CC 91,36% 97,49% 92,76% 90,81% 82,17%
MAE 0,2167 0,0251 0,1438 0,1164 0,2179
RMSE 0,2835 0,1583 0,2690 0,2639 0,4098
TPR 0 0,9670 1,0000 0,9790 0,9290 0,8580 TPR 1 0,0910 0,5910 0,1360 0,5910 0,2730 MPTPR 0,9140 0,9750 0,9280 0,9080 0,8220 MATPR 0,5290 0,7955 0,5575 0,7600 0,5650
CC: Instâncias Classificadas Corretamente, MAE: Erro Médio Absoluto, RMSE: Erro Quadrático Médio, TPR 0: Taxa de Verdadeiros Positivos para a Classe Sem Bugs, TPR 1: Taxa de Verdadeiros Positivos para a Classe Com Bugs, MPTPR: Média Ponderada da Taxa de Verdadeiros Positivos, MATPR: Média Aritmética da Taxa de Verdadeiros Positivos
Tabela 5.5: Resultados da execução dos algoritmos de predição, simulação (300/300) – Bugs Funcionais
J48 OneR Ibk(5) RNA NB
CC 90,68% 97,21% 91,93% 94,41% 69,56%
MAE 0,2329 0,0280 0,1507 0,0836 0,3686
RMSE 0,2969 0,1672 0,2796 0,2209 0,4984
TPR 0 0,9600 1,0000 0,9770 0,9670 0,7130 TPR 1 0,1820 0,5910 0,1360 0,6360 0,4550 MPTPR 0,9070 0,9720 0,9190 0,9440 0,6960 MATPR 0,5710 0,7955 0,5565 0,8015 0,5840
CC: Instâncias Classificadas Corretamente, MAE: Erro Médio Absoluto, RMSE: Erro Quadrático Médio, TPR 0: Taxa de Verdadeiros Positivos para a Classe Sem Bugs, TPR 1: Taxa de Verdadeiros Positivos para a Classe Com Bugs, MPTPR: Média Ponderada da Taxa de Verdadeiros Positivos, MATPR: Média Aritmética da Taxa de Verdadeiros Positivos
Tabela 5.6: Resultados da execução dos algoritmos de predição, simulação (250/250) – Bugs Funcionais
J48 OneR Ibk(5) RNA NB
CC 86,76% 96,69% 90,81% 90,81% 83,82%
MAE 0,2219 0,0331 0,1789 0,0939 0,1745
RMSE 0,3540 0,1819 0,2970 0,2764 0,3958
TPR 0 0,9240 1,0000 0,9720 0,9240 0,8840 TPR 1 0,2270 0,5910 0,1820 0,7270 0,3180 MPTPR 0,8680 0,9670 0,9080 0,9080 0,8380 MATPR 0,5755 0,7955 0,5770 0,8255 0,6010
CC: Instâncias Classificadas Corretamente, MAE: Erro Médio Absoluto, RMSE: Erro Quadrático Médio, TPR 0: Taxa de Verdadeiros Positivos para a Classe Sem Bugs, TPR 1: Taxa de Verdadeiros Positivos para a Classe Com Bugs, MPTPR: Média Ponderada da Taxa de Verdadeiros Positivos, MATPR: Média Aritmética da Taxa de Verdadeiros Positivos
Tabela 5.7: Resultados da execução dos algoritmos de predição, simulação (200/200) – Bugs Funcionais
J48 OneR Ibk(5) RNA NB
CC 88,74% 95,95% 81,08% 84,68% 81,53%
MAE 0,2874 0,0405 0,2351 0,1581 0,2003
RMSE 0,3477 0,2013 0,354 0,3521 0,4268
TPR 0 0,950 1,000 0,880 0,8600 0,8700
TPR 1 0,318 0,591 0,182 0,7270 0,3180
MPTPR 0,887 0,959 0,811 0,8470 0,8150
MATPR 0,634 0,7955 0,531 0,7935 0,5940
CC: Instâncias Classificadas Corretamente, MAE: Erro Médio Absoluto, RMSE: Erro Quadrático Médio, TPR 0: Taxa de Verdadeiros Positivos para a Classe Sem Bugs, TPR 1: Taxa de Verdadeiros Positivos para a Classe Com Bugs, MPTPR: Média Ponderada da Taxa de Verdadeiros Positivos, MATPR: Média Aritmética da Taxa de Verdadeiros Positivos
5.1 Abordagem das Simulações para Bugs Funcionais 45
Tabela 5.8: Resultados da execução dos algoritmos de predição, simulação (100/100) – Bugs Funcionais
J48 OneR Ibk(5) RNA NB
CC 64,75% 92,62% 69,67% 78,69% 69,67%
MAE 0,3761 0,0738 0,3184 0,2312 0,3067
RMSE 0,4984 0,2716 0,4456 0,4247 0,5160
TPR 0 0,6600 1,0000 0,7800 0,8000 0,7800 TPR 1 0,5910 0,5910 0,3180 0,7270 0,3180 MPTPR 0,6480 0,9260 0,6970 0,7870 0,6970 MATPR 0,6255 0,7955 0,5490 0,7635 0,5490
CC: Instâncias Classificadas Corretamente, MAE: Erro Médio Absoluto, RMSE: Erro Quadrático Médio, TPR 0: Taxa de Verdadeiros Positivos para a Classe Sem Bugs, TPR 1: Taxa de Verdadeiros Positivos para a Classe Com Bugs, MPTPR: Média Ponderada da Taxa de Verdadeiros Positivos, MATPR: Média Aritmética da Taxa de Verdadeiros Positivos
5.1.1 Discussão das Simulações para Bugs Funcionais
Como mostrado na Tabela 5.1, a alta porcentagem de acurácia dos algoritmos não reflete a real eficiência de tais abordagens, uma vez que o TPR das classes minoritárias são extre-mamente baixos. Para a predição, então, escolhemos novamente a opção de criar uma base que contém apenas classes com uma alta probabilidade de conter bugs de código. A raci-onalidade desta abordagem vem do fato que desejamos exatamente prever quais instâncias possuem bugs funcionais e o modelo preditor anterior apresentou índice satisfatório. Então resolvemos aplicá-la a predição de bugs funcionais.
A Tabela 5.3 mostra que essa abordagem surte efeito, de modo que o TPR1 do algoritmo (OneR) salta de 0 para 0,591. Um detalhamento da execução deste algoritmo é apresentado na Figura 5.3, onde a Matriz de Confusão mostra que das 22 instâncias com bugs funcionais, o modelo classificou 13 corretamente e 9 de forma incorreta.
O próximo passo da pesquisa foi realizar simulações (Tabelas 5.4 a 5.8) para entender se a questão do balanceamento estava influenciando no TPR da classe minoritária. Porém, tais simulações indicam uma pequena influência do processo de balanceamento, principalmente para o algoritmo OneR, o qual permaneceu com o seu TPR da classe minoritária constante.
Deste modo, podemos destacar que conforme predição de bugs de código a Rede Neural e o algoritmo OneR foram as abordagens que apresentaram o melhor desempenho geral novamente nas simulações. E em relação ao OneR, esse fato é interessante porque o mesmo não é muito citado em trabalhos relacionados (ver capítulo 6). Ou seja, tal algoritmo não é bem explorado na literatura, a qual prioriza outras abordagens de aprendizagem de máquina.
Foi possível observar então que o processo de tornar a base de treinamento mais homogê-nea de fato aumenta a acurácia do modelo, tornando-o mais imune aos problemas enfrentados pelo desbalanceamento dos dados.
É difícil comparar a abordagem com outras indicadas na literatura, uma vez que valores de TPR ou a Matriz de Confusão não são geralmente mostrados. Desta forma, a acurácia total (CC) é o principal parâmetro utilizado pelas pesquisas, sendo que o mesmo não reflete de fato a eficiência da abordagem. O capítulo seis irá trazer uma reflexão sobre este ponto com exemplos práticos da literatura. Mais detalhes sobre a questão de replicações das simulações e uso correto de métricas para a qualificação de preditores no domínio da engenharia de software podem ser encontrados em (SIEBRA; MELLO, 2015).
Figura 5.3: Execução do algoritmo OneR para predição de bugs funcionais. Detalhamento da simulação da Tabela 5.3
5.2 Uso de Predição Para Recomendação de Priorização de Bugs Funcionais 47