segunda-feira, 1 de junho de 2015

Neuroevolução



Em posts anteriores vimos que uma rede neural é capaz de responder problemas onde se busca aprender uma resposta que é conhecida. Para isso, a rede é treinada com um algoritmo como o BackPropagation, por exemplo, comparando os resultados esperados com os resultados obtidos e assim fazendo um ajuste incremental. Mas e se a resposta não for conhecida? E se o desafio for descobrir uma forma de resolver um problema? Neste caso, para treinar a rede, ao invés do BP poderíamos usar um algoritmo genético. Algoritmos genéticos também foram discutidos em um post anterior, e neste vimos que eles buscam encontrar uma solução ótima para um problema, criando e aplicando um ambiente de seleção evolutiva. Considerando tudo isso: e se nós usássemos um algoritmo genético para encontrar o conjunto de pesos ideal da rede? É exatamente isso que a neuroevolução faz!

Neuroevolução é um método de aprendizado de máquina que treina redes neurais artificiais através de algoritmos evolutivos, como algoritmos genéticos, e que tem sido muito aplicado em jogos eletrônicos. Algoritmos evolutivos tratam o problema do aprendizado como uma tarefa de otimização, onde podemos definir uma medida de sucesso, chamada  fitness, para ser maximizada ou minimizada, tentando alcançar o melhor resultado possível em um tempo experimental a se determinar. Desta forma, os conjuntos de pesos e símbolos que configuram a população de soluções são representados por genomas, onde cada gene pode representar um peso.

Os genomas passam pelo processo de seleção, cruzamento e mutação por diversas gerações, sendo selecionados pelo seu fitness. O fitness de cada genoma (genótipo) é calculado através da performance de sua rede neural (fenótipos) em resolver o problema proposto (se adaptar) usando os pesos de seu genoma.

A neuroevolução pode ser implementada do modo simples, evoluindo apenas os pesos das conexões, mas também pode ser implementada de forma completa, evoluindo a topologia da rede inteiramente (neurônios e conexões).
Existe um conceituado método de neuroevolução chamado Neuro Evolution of Augmenting Topologies (NEAT). NEAT aumenta o tamanho dos genomas de modo incremental. Quando uma rede neural sofre alguma mutação, esta tende a sobreviver apenas se essa mutação trouxer algum benefício significante para o fitness da rede (genoma do jogador), evitando dessa forma neurônios e conexões inapropriadas que não têm utilidade, assim evitando "trabalho manual" humano em experimentar diferentes topologias. Isso comumente permite encontrar soluções melhores que as dos algoritmos que evoluem somente os pesos.

Através da neuroevolução é possível não apenas resolver os mesmos problemas de antes (onde a resposta era conhecida), como ainda desenvolver controladores inteligentes que aprendem a interagir com um determinado ambiente de forma apropriada.


Abraços miningnoobs!


sábado, 16 de maio de 2015

Algoritmos Genéticos

Um algoritmo genético é um método evolutivo de aprendizado de máquina que se baseia nos princípios da seleção natural observados por Darwin, para descobrir soluções ótimas (ou que tentam se aproximar do ótimo) em problemas diversos.

As soluções (inicialmente aleatórias) são tratadas como uma população de indivíduos (genomas) que lutam para sobreviver e evoluem ao longo de muitas gerações. A solução buscada é tratada como um problema de otimização, onde a cada iteração do processo de evolução, a população de soluções se aproxima da solução ótima.
As soluções geralmente são representadas por um conjunto de variáveis (genes), normalmente um conjunto de números.

A primeira geração é formada por soluções aleatórias. Daí em diante, por N gerações repete-se o seguinte processo:

- cruzamento: as soluções são combinadas de alguma forma representando o processo de reprodução, recebendo assim uma porção das características (valores de variáveis) do pai, e uma outra porção da mãe.
- mutação: os valores das variáveis sofrem uma leve (ou média) perturbação,  simulando o processo de "erro de cópia" genética e assim inserindo diversidade.
- seleção: uma parte das soluções é jogada fora, e a outra é selecionada para "viver" a partir de sua medida de performance (fitness), de modo que quanto maior o fitness, maior probabilidade de uma solução sobreviver, uma vez que significa que se adaptou melhor em cumprir seu objetivo (encontrar a solução ótima).

O fitness é a medida que define o conceito de sucesso da solução buscada. Representa o conceito máximo de sobrevivência, e considerando que a sobrevivência depende de um conjunto de fatores (correlacionados ou não) este deve ser medido por uma equação que leve em consideração todos os fatores de sucesso. Essa equação deve ser definida de acordo com o problema inerente à solução buscada. Por exemplo, se o algoritmo está sendo aplicado em um jogo onde tomar um tiro significa morrer, o fitness deve ser marcado com valor baixo neste tipo de situação onde se morre. No ambiente natural, muitas vezes os fatores determinantes estão associadas à obtenção de alimentos, condições de proteção e capacidade de ataque. Em jogos que simulam ambientes naturais os problemas podem ser os mesmos. Todavia, com a mesma lógica pode-se resolver problemas diversos como problemas de minimização de rotas, redução de custos, ou até mesmo modelagem preditiva (discutido em posts anteriores).

Ao final do processo, o melhor indivíduo (melhor fitness) de todas as gerações é selecionado como solução final, pois é o que mais se aproxima do ótimo, para o problema analisado.


Abraços mining noobs!

sexta-feira, 15 de maio de 2015

Aumentando o poder preditivo de variáveis


 O processo de modelagem vai muito além de aplicar os algoritmos nos dados. Há transformações que podem ser importantes de serem feitas nas variáveis, que vão muito além do âmbito do ETL comum.
Estas transformações às vezes são chamadas de ETL de segundo nível.
Tais transformações são feitas baseando-se em análises estatísticas e ainda em regras de negócio.
No primeiro post, vimos que modelar pode ser comparado com o processo de aprendizado, onde é necessário abstrair características macro dos indivíduos alvo de análise. Esse processo de abstração, pode ser feito, em partes, através da transformação de variáveis antes da seleção de quais vão ou não vão para o modelo.

Quando estamos modelando, pegamos todos os dados que temos disponíveis e testamos (com testes estatísticos) se eles são significantes (discriminantes, correlacionados) para o evento que estamos medindo. Quando uma variável se mostra pouco ou nada importante, nós não mantemos ela no conjunto de dados que será avaliado pelo algoritmo.

O curioso é que: há variáveis que se mostram irrelevantes em sua forma natural, mas após determinados tratamentos (abstrações) podem passar a ser discriminantes.
Isso é importante, pois ajuda a aumentar cada vez mais o poder preditivo do modelo com os recursos (dados) que temos disponíveis (que mutias vezes não são muitos).

Vamos ver alguns exemplos de tratamento que podem aumentar o poder preditivo de uma variável:


Tratamento de missings

Este é um tratamento básico. Imaginemos uma variável que mede o peso de uma pessoa, e consideremos que há uma parte dos indivíduos da nossa amostra com essa variável sem preencher (vazio ou missing). Se essa proporção for pequena, por exemplo, 5%, podemos substituir o valor missing por um valor médio, ou até fazer um outro modelo unicamente para estimar esses valores. É importante pensar se, do ponto de vista do negócio (e quando eu digo negócio, não me refiro só a business, mas à área de conhecimento envolvida) é razoável tratar esse tipo de ocorrência de missing desta forma.
Agora, se o número de casos for muito grande, pode não valer a pena usar a variável, e já descartá-la de cara.
Quanto mais completos os dados estiverem, mais o modelo terá insumos para entender os perfis que se propõe a classificar.


Tratamento de outliers

Outliers são valores fora do comum. Exemplo:  em uma variável que mede a altura de uma pessoa, o valor (em centímetros) 400 seria um outlier.
Esses valores podem ocorrer devido a erros nos dados, ou ainda simplesmente porque realmente existem casos raros. O problema é que mesmo esses casos raros existindo, é complicado para o modelo abrir esse tipo de "exceção". Para facilitar o trabalho, e não confundir o algoritmo, é interessante tratar esses valores com algo como, por exemplo, o valor da média mais o desvio padrão para máximo ou mínimo. desta forma, aquele indivíduo ainda será tratado com a mesma magnitude em termos do valor, mas não será um "desconhecido confuso" para o modelo.


Transformações diversas

Transformações como log de diversas bases, raiz, inverso etc, muitas vezes podem deixar as variáveis "melhores" por tentarem algum tipo de suavização da série de dados (em relação a sua distribuição).


Transformações referentes ao tema

Muitas vezes uma ou até mesmo um conjunto de variáveis não tem muito significado se referente a dados brutos em certas situações inerente ao tema que está sendo tratado. Ex: uma data pode não significar nada, e duas datas tão pouco, sendo três então pior. Porém algum cálculo de distância entre duas delas, sendo maior ou menor do que o dia da terceira data, pode resultar numa variável que tem muito poder explicativo. Isso porque traduz a observação de três eventos que antes não tinham significado, em algo que uma fonte externa já sabe a priori. Ex: em negócios, uma regra de negócio; em medicina, algo sobre o funcionamento do corpo humano.

 Discretização

Alguns algoritmos dependem de que existam relações lineares entre as variáveis explicativas e a variável resposta de um modelo. Entretanto, isso muitas vezes não reflete a realidade, e somente porque uma relação não é linear, não significa que a correlaçõ não existe.
Uma forma de contornar isso é a discretização de variáveis. Neste caso, variáveis contínuas seriam quebradas em categorias. As quebras podem ser feitas usando testes estatísticos que mostram o ponto de corte ótimo, via análise visual ou até mesmo utilizando pontos clássicos como percentis. Ex.: a variável quantitativa idade poderia ser transformada em uma variável categórica com faixas de idade.


Mesclagem

Muitas vezes uma variável  categórica pode ter seu poder preditivo aumentado através da junção de categorias das variável. Isso pode ocorrer porque considerando as categorias individuais não existem padrões, mas juntando algumas, é possível encontrar tendências que antes estavam distribuídas.
Para juntar categorias podemos observar as taxas de casos positivos relativa (odds) e mesclar em uma única categoria as categorias que tiverem taxas similares.



Abraços minning noobs!



segunda-feira, 4 de maio de 2015

Inteligência artificial

No primeiro post, "O que é data mining" vimos que data mining é um processo composto por diversas etapas (onde uma destas é aplicar algoritmos complexos em massas de dados) cuja matéria prima são dados e cujo propósito é criar algum tipo de inteligência que vá interagir com estes dados.


Quando falamos de inteligência, estamos dizendo que o "sujeito" deve ter condições de aprender, ou seja, passar por uma determinada experiência e ser capaz de em próximas situações similares, generalizar as mesmas conclusões (decisões) sobre o desfecho da situação. Se "isso" ocorre com A, e B é bastante parecido com B, logo isso deve ocorrer com B com certa probabilidade razoável.

Dito isso, vamos considerar: o processo de criação de inteligência pode ser feito de diversas formas.

A forma mais elementar e clássica é a estatística. A estatística se preocupa em "medir para poder estimar", sendo uma ferramenta que mede a realidade para perceber nesta padrões e significância, uma vez que aprender (que é o que buscamos) depende justamente de como percebemos  os padrões de comportamento da realidade (quando esses existem). Diversos algoritmos estatísticos são aplicados para resolver problemas de inúmeras áreas do conhecimento a cada ano. Exemplos seriam: regressão logística para diagnosticar doenças ou séries temporais para prever vendas de uma marca etc. Modelos estatísticos estão ligados a testes de hipóteses. Testes de hipóteses tratam de situações do tipo: eu moro num bairro X e saio de casa apenas para comprar pão uma vez por dia às 6 da tarde, e eu tenho a impressão de que vejo mais pessoas de roupa social do que pessoas com roupa esporte...mas será que essa maioria que percebo de fato reflete a realidade? ou será que eu apenas tenho essa percepção porque eu saio de casa em horários de hush onde as pessoas estão voltando do trabalho?  Para evitar este tipo de viés, é importante medir aleatoriamente  parte (ou todos) dos casos, para poder concluir se esta "impressão" tem de fato algum significado.
Porém há outras formas de fazer inteligência. Há muitos algoritmos de aprendizado de máquina que revolvem os mesmos problemas que citamos acima resolvidos pela estatística. Os algoritmos de aprendizado de máquina tentam aplicar algum conjunto de regras que em geral se apoiam em conceitos matemáticos para aprender determinada coisa, seja esta descobrir um padrão, fazer uma previsão, tomar uma decisão etc.

Tudo o que faz o "indivíduo pensante" interagir com algum meio, e com ele perceber algo, é uma forma de inteligência, e isso se parece muito com o processo que faz de nós também algoritmos ambulantes. Embora sejamos como humanidade, o que há de melhor no "mercado de redes neurais", nosso cérebro  enfrenta alguns problemas. As vezes tenta ser tão "espertinho" que na busca por novos padrões, ou na tentativa de economizar energia ele "deduz algumas coisas antes de analisar", como um auto complete que às eventualmente escreve coisas absurdas. O cérebro também quer economizar recursos e pegar atalhos, e no final das contas, ficamos sujeitos a muita subjetividade. Porém, quando aplicamos os mesmos conceitos num ambiente onde o erro é medido e controlado, resolvemos problemas que humanos não conseguem em geral com tanta assertividade. E isso tende a se estender para todos os tipos de conteúdos a serem processados, ou seja, todos os tipos de interações existentes atualmente. O que se faz com IA hoje ainda engatinha, mas não há porque pensar que existe qualquer tipo de "limite" pra isso, uma vez que o conceito de aprender em si está provado artificialmente. Por que seria possível aprender alguns padrões e outros não? Se é possível hoje, muito facilmente, um algoritmo aprender a identificar a emoção contida numa expressão facial, por que seria absurdo pensar que este mesmo algoritmo incrementadíssimo pudesse aprender o "inteligência" do processo neural que é o amor? Essa ilusão de que há "um QUE de especial na humanidade" só tende a cair cada vez mais por terra, a cada pesquisa que é publicada na comunidade de IA e áreas correlatas. Até que se prove o contrário,  tudo que pensamos, lembramos e sentimos se resume a um conjunto complexo de conexões neurais, elementos químicos sendo estimulados por impulsos elétricos.

Opiniões à parte, a comunidade acadêmica têm feito sua cria à sua imagem e semelhança (pois nada faria mais sentido que isso a princípio!). Um dos modelos mais famosos de inteligência artificial são as Redes Neurais Artificiais (sobre as quais falamos em um post anterior). E estas, nada mais são do que um modelo matemático bastante simplificado referente ao que se conhece atualmente sobre a dinâmica de funcionamento do cérebro. Basicamente tenta-se simular o processo das sinapses, representando os neurônios e suas conexões como um grafo orientado onde os vértices são os neurônios e as arestas são as ligações entre eles, que permitem a sinapse cuja força se define pelo peso da aresta. Modelos de redes neurais são incríveis, pois são capazes de prever tanto variareis quantitativas quanto qualitativas, e ainda ter N saídas  (N decisões a tomar) sendo analisadas simultaneamente.

Há ainda outras formas de inspiração que vem sendo aplicadas, como  a bio inspiração, onde baseado em comportamentos da natureza, podemos abstrair um processo inteligente. Exemplos: o organização das formigas, dos pássaros, e até fungos!
Dentre os algoritmos bio inspirados estão os Algoritmos Genéticos, que se baseiam nas observações evolucionistas de Darwin, onde soluções (indivíduos compostos por um conjunto de valores numéricos que representam genes de um DNA) "lutam" pra sobreviver, onde a medida de sucesso é realizar uma determinada tarefa, como prever por exemplo, onde essa tarefa é decidida por esse conjunto de valores (DNA).
Desta forma, diversos artigos mostram empiricamente que a teoria da evolução de sustenta, em termos de método pelo menos. Ou seja, é possível do aleatório convergir para o sucesso, seja lá o que o sucesso for, somente pela seleção natural (ou artificial =D). O que importa é haver um ambiente de competição, onde há morte e reprodução. Onde houver morte e reprodução... comprtição haverá inteligência, mesmo que esta seja uma inteligência "codificada na  composição" do indivíduo.

Ironias à parte, é importante termos em mente que não importa se estamos usando estatística, aprendizado de máquina ou qualquer coisa, o que importa é que data mining usa diversas ferramentas com o objetivo de criar algum tipo de inteligência (artificial) a partir dos dados, para interagir com estes de alguma forma que faça sentido, obtendo assim algum conhecimento.



Abraços miningnoobs!