• Nenhum resultado encontrado

Código-fonte de um Programa candidato Max3

2 if( x3 > x2 ) { 3 y = x1 ; 4 } else { 5 y = x2 ; 6 } 7 } else { 8 if( x3 > x1 ) { 9 y = x3 ; 10 } else { 11 y = x2 ; 12 } 13 }

Uma árvore sintática destacando os comandos, operadores e variáveis é mostrada na Figura 16.

Seja 𝑇 a suíte de testes 𝑇 = {𝑡1, 𝑡2, . . . , 𝑡6} como mostrado na Tabela 18, onde

Figura 16 – AST de um programa candidato p.

Teste

x1

x2

x3

y

t1

5

2

1

x1

t2

1

5

2

x2

t3

2

1

5

x3

t4

2

5

1

x2

t5

1

2

5

x3

t6

5

1

2

x1

Tabela 18 – Suíte de testes de um programa candidato.

Cada 𝑝𝑖 é o estado do ambiente depois de executar o passo 𝑖 do programa 𝑝. Cada

𝑝𝑖 é conhecido como coluna do ER (Tabela 19). O conceito de estado aqui é diferente do conceito clássico de estado da memória: um estado é o valor das expressões dos nós da árvore da Figura 16. Note ainda que a Figura 16 mostra estados que não podem ocorrer ao mesmo tempo, pois são inerentes de uma estrutura de desvio condicional. Assim, a depender do caminho condicional que o programa candidato seguiu, não é possível aparecer no ER (Tabela 19) os estados 𝑝3 e 𝑝*3 (o mesmo se aplica para os estados 𝑝4 e

𝑝*4 e finalmente para 𝑝$, 𝑝 * $, 𝑝 * *$ e 𝑝 * * * $). Desta forma o estado só poderá assumir uma posição a cada teste executado e por isso foi unificado, ou seja irá aparecer no ER apenas uma coluna, que assumimos com os nomes 𝑝3 (embora possa ocorrer 𝑝3 ou 𝑝*3, mas nunca os dois) e o mesmo raciocínio para 𝑝4 e 𝑝$.

A.4.3.2 Transformar o ER em um ML dataset D (etapa II)

Nesta etapa as colunas do ER são manipuladas para gerar um conjunto de dados ou dataset D a serem usados em ML (Tabela 20).

A coluna p$ (na tabela ML datasset D) denota a saída out do programa p. Em ML cada coluna é conhecido como “atributo” ou “feature”.

Teste x1 x2 x3 p1 p2 p5 p3 p4 p6 p$ y t1 5 2 1 x1 x3 T x3 x2 F x2 x1 t2 1 5 2 x1 x3 F x3 x1 T x3 x2 t3 2 1 5 x1 x3 F x3 x1 T x3 x3 t4 2 5 1 x1 x3 T x3 x2 F x2 x2 t5 1 2 5 x1 x3 F x3 x1 T x3 x3 t6 5 1 2 x1 x3 T x3 x2 T x1 x1

Tabela 19 – Registro de execução de um programa candidato.

Teste x1 x2 x3 p1 p2 p5 p3 p4 p6 p$ y y* t1 5 2 1 x1 x3 T x3 x2 F x2 x1 N t2 1 5 2 x1 x3 F x3 x1 T x3 x2 N t3 2 1 5 x1 x3 F x3 x1 T x3 x3 Y t4 2 5 1 x1 x3 T x3 x2 F x2 x2 Y t5 1 2 5 x1 x3 F x3 x1 T x3 x3 Y t6 5 1 2 x1 x3 T x3 x2 T x1 x1 Y

Tabela 20 – ML dataset D de um programa candidato.

A definição de y*:if(p$==y) Yes(Y); else No(N); permite que o classificador mani- pule apenas dois valores (Yes/No) embora possa ser usado para valores discretos (como números inteiros por exemplo).

Ao transformar o ER (Tabela 19) em um ML dataset D (Tabela 20), a quantidade de colunas pode ser reduzida: (i) se qualquer grupo de 𝑖𝑐 colunas são mutualmente idênticas (𝑖𝑐 é a quantidade de colunas do grupo), então as 𝑖𝑐 − 1 colunas do grupo devem ser removidas, ficando apenas uma. Por exemplo, o grupo de colunas 𝑝2 e 𝑝3 são mutualmente idênticas (𝑖𝑐 = 2), logo pode-se remover todas as 𝑖𝑐 − 1 do grupo (optamos por remover

𝑝3); (ii) se existirem colunas com valores iguais, todas elas podem ser removidas. Por exemplo, visto que todos os valores da coluna 𝑝1 são iguais (o mesmo ocorre com 𝑝2), logo pode-se remover 𝑝1 e 𝑝2. Finalmente, por definição de D, a saída de cada teste do programa p$ também é removida.

A.4.3.3 Aplicar algoritmo de indução ML no conjunto de dados, resultando num classificador (etapa III)

Aplicando o algoritmo de aprendizagem de máquina indutivo C4.5 (QUINLAN, 2014) te- remos a possibilidade de construir uma árvore de decisão (classifier C). Para construir a árvore de decisão, precisamos escolher um atributo. Qual o atributo (feature) a ser usada para construir a árvore de decisão? A resposta a esta pergunta será: o atributo que tiver maior possibilidade de predizer a variável de saída y*, ou seja, tiver maior information

gain G. O processo de escolha se repete até que a árvore de decisão fique pronta. Antes

Entropy H → é a medida da impureza (incerteza) de um dataset 𝑆, para predi- zer o valor de uma variável de saída 𝑦*, para novas entradas de dados em 𝑆, conforme Equação A.2 (ver Seção 3.4.1 de (MITCHELL et al., 1997)).

𝐻(𝑆) = − 𝑛

∑︁

𝑖=1

𝑝𝑖* log2(𝑝𝑖) (A.2)

Onde 𝑝𝑖 é a probabilidade de ocorrência de um valor de 𝑦*.

Se 𝐻 = 0 → totalmente puro e máxima certeza em predizer 𝑦*, para novas entradas no dataset 𝑆. Se 𝐻 = 1 → totalmente impuro e máxima incerteza em predizer 𝑦*, para novas entradas no dataset 𝑆. Se 𝐻 > 0 e 𝐻 < 1 → alguma probabilidade em predizer 𝑦*, para novas entradas no dataset 𝑆.

Information Gain G → quando um atributo (feature) 𝐹𝑒𝑎𝑡 é escolhido para dividir

um dataset 𝑆 em subconjuntos menores 𝑆𝑣em busca de melhorar a capacidade de predição

da variável de saída 𝑦*, causa uma mudança na Entropy 𝐻. A medida dessa mudança (expectativa de subconjuntos mais puros) é o Information Gain 𝐺(𝐹𝑒𝑎𝑡). Ou seja, 𝐺(𝐹𝑒𝑎𝑡)

é a diferença de entropias antes e depois de dividir o dataset 𝑆 em subconjuntos menores

𝑆𝑣 a partir de um atributo (feature) 𝐹𝑒𝑎𝑡, conforme Equação A.3 (ver Seção 3.4.1 de

(MITCHELL et al., 1997)). 𝐺(𝐹𝑒𝑎𝑡) = 𝐻(𝑆) − ∑︁ 𝑣∈𝑣𝑎𝑙𝑢𝑒𝑠(𝐹𝑒𝑎𝑡) (|𝑆𝑣| |𝑆| * 𝐻(𝑆𝑣)) (A.3)

Onde |𝑆| é a quantidade de exemplos (tamanho) do dataset 𝑆 e |𝑆𝑣| é o tamanho do

subconjunto a partir do atributo 𝐹 . Calculando 𝐻 e 𝐺:

Calcular a entropia do sistema 𝐻(𝑆) para predizer y*=Y ou N : – |𝑆| = 6 → 𝑌 𝑌 𝑌 𝑌 = 4 e 𝑁 𝑁 = 2. – 𝐻(4 6, 2 6) = − 4 6log2 46 − 2 6log2 26 = 0, 920 Calcular 𝐺 da feature 𝑝4 (Figura 17): – 𝐻(𝑝4, 𝑥 1) = −13log2 1 3 − 2 3log2 2 3 = 0, 918 – 𝐻(𝑝4, 𝑥 2) = −13log2 13 − 2 3log2 23 = 0, 918 – 𝐺(𝑆, 𝑝4) = 𝐻(𝑆) − (3 60, 918 + 3 60, 918) = 0, 920 − (0, 918) = 0, 020 Calcular 𝐺 da feature 𝑝5: neste exemplo é igual do 𝐺 de 𝑝4 (Figura 17). Calcular 𝐺 da feature 𝑝6 (Figura 17):

– 𝐻(𝑝6, 𝐹 ) = −1 2log2 12 − 1 2 log2 12 = 1, 000 – 𝐻(𝑝6, 𝑇 ) = −34log234 −1 4log2 14 = 0, 311 + 0, 500 = 0, 811

Figura 17 – Cálculo dos atributos (feature) de um programa candidato p.

– 𝐺(𝑆, 𝑝6) = 𝐻(𝑆) − (2

61, 000 + 4

60, 811) = 0, 920 − (0, 874) = 0, 046

Construir a árvore de decisão e depois aparar (cortar) os nós desnecessários (pruning tree mostrado na Figura 18):

Figura 18 – Realizando poda (pruning) na Árvore de decisão de um programa candidato p.

A.4.3.4 Calcular a função fitness do classificador C (etapa IV)

A função de complexidade 𝑓𝑐 é definida como o número de nós da árvore de decisão,

no exemplo 𝑓𝑐 = 5. A função de erro 𝑓𝑒 é definida como a quantidade de erros que o

classificador cometeu, no exemplo 𝑓𝑒 = 2. A função de fitness convencional 𝑓0 é definida como a somatória das distâncias, usando a distância Manhattan (Equação 5.2), entre a saída encontrada em cada teste 𝑞𝑖 e a saída esperada 𝑝𝑖.

Ou seja, 𝑓0 = (|𝑥2 − 𝑥1|𝑡1 + |(𝑥3 − 𝑥2)|𝑡2 + |(𝑥3 − 𝑥3)|𝑡3 + |(𝑥2 − 𝑥2)|𝑡4 + |(𝑥3 − 𝑥3)|𝑡5 +

|(𝑥1 − 𝑥1)|𝑡6 = |2 − 5| + |2 − 5| + 0 + 0 + 0 + 0 = 6.

É desejável encontrar um ponto de equilíbrio entre 𝑓𝑐 e 𝑓𝑒, pois se criarmos um clas-

sificador que liga a entrada diretamente à saída (sem considerar as etapas intermédias) vamos ter uma complexidade muito alta 𝑓𝑐, o que poderá penalizar o desempenho. O

contrário, teremos complexidade quase nula, mas pode gerar grande número de erros. A função fitness para PANGEA 𝑓𝑝 é uma composição das três funções (𝑓0, 𝑓𝑐, 𝑓𝑒),

mostrada na Equação A.4.

𝑓𝑝 =

𝑓0* log2(𝑓𝑐+ 1) * (𝑓𝑒+ 1)

Onde 𝑡 é o total de testes executados no programa candidato 𝑝.

No exemplo temos: 𝑓𝑝 = (6 * log2(5 + 1) * (2 + 1))/(6 + 1) = 6 * 2.585 * 3/7 = 6.647. A.4.3.5 Seleção dos subprogramas para arquivamento e mutação (etapa V)

𝑢𝑝′ =

1

(1 + 𝑓𝑒(𝑝)) * 𝑃𝑐(𝑝)

(A.5) Cada ação de avaliação de um programa candidato 𝑝 produz um lote de subprogramas

𝑃𝑐(𝑝) ::= {𝑠𝑢𝑏𝑝𝑟𝑜𝑔𝑟𝑎𝑚𝑎1, 𝑠𝑢𝑏𝑝𝑟𝑜𝑔𝑟𝑎𝑚𝑎2, . . . , 𝑠𝑢𝑏𝑝𝑟𝑜𝑔𝑟𝑎𝑚𝑎𝑛}. Então os subprogramas

contidos em 𝐴 são juntados ao lote gerado, formando um novo conjunto 𝐴= 𝐴 ∪ 𝑃𝑐(𝑝). É

aplicada uma rotina de seleção, onde passa-se a ter um novo programa 𝑝′, que é adicionado em 𝐴, caso não exista um programa 𝑝′′ semanticamente equivalente (ou seja, que produz as mesmas saídas com os mesmos testes de entrada) e de menor complexidade (ou seja como uma AST com menos nós).

Um subprograma 𝑝(de um programa candidato 𝑝) tem seu nível de utilidade ou utility

𝑢(𝑝′) calculado de acordo com a Equação A.5.

Figura 19 – Subprogramas de um programa candidato.

Subprogramas com maior valor de utility 𝑢𝑝′tendem a se tornar componentes de outros programas candidatos (durante o processo evolucionário).

No exemplo (Figura 19), a árvore de decisão usa as features 𝑝5 (destaque em azul, ou seja, o caminho no THEN ou no ELSE do IF externo, antes da entrada na condição do IF interno) e 𝑝6 (destaque em vermelho, ou seja, o caminho no THEN ou no ELSE do IF interno, antes da saída do programa, gerando). Assim 𝑃𝑐(𝑝) ::= {(𝑥3 > 𝑥2|𝑥3 > 𝑥1), (𝑥1|𝑥2)|(𝑥3|𝑥2)}, ou seja tem-se 2 subprogramas, o que implica |𝑃𝑐(𝑝)| = 2. Logo 𝑢(𝑝) = 1/((1 + 2) * 2) = 1/6 = 0.167.

Listagem A.3 – Outro programa candidato Max3.