Categorias
Análise de dados Ciência de Dados Machine Learning

Como escolher as features relevantes para o modelo de Machine Learning…

Nesse post, você vai conhecer algumas técnicas para escolher quais são as variáveis relevantes dentro do conjunto de dados e usá-las para o treinamento do algoritmo de Machine Learning e quais variáveis são colineares, para eliminá-las.

“Usamos a seleção de atributos para selecionar aqueles que sejam úteis ao modelo. Atributos irrelevantes podem causar efeito negativo em um modelo. Atributos correlacionados podem deixar os coeficientes de uma regressão (ou a importância de atributos em uma árvore) instáveis ou difíceis de interpretar”. (HARRISON, M., 2020, p. 88)

Além de identificar os atributos relevantes e não correlacionados, não podemos esquecer a “maldição da dimensionalidade”, porque a medida que a dimensão de dados aumenta, mais esparsos ficam os dados, o que gera a dificuldade de encontrar um “sinal” e cálculos de “vizinhança”, gerando a necessidade de coletar mais dados.

Observando o Princípio da Navalha de Occam, se temos que escolher entre dois modelos, que representam o mesmo fenômeno, a preferência é para o mais simples. A razão dessa escolha é bem direta: porque o modelo mais simples vai generalizar melhor.

Para tornar a aprendizagem mais simples em Machine Learning, o conjunto de dados mais simples, depende da quantidade de colunas. E para tornar o conjunto de dados mais simples, podemos identificar as colunas que são Colineares, ou seja, variáveis que explicam a mesma coisa e removê-las, não utilizando-as para o treinamento do modelo. Segue abaixo, alguns tipos de seleção de variáveis.

Tipos de seleção de variáveis: mecanismo, vantagens e desvantagens

a) Seleção Univariada (Filter Methods)

O objetivo da seleção univariada é classificar quais são as variáveis relevantes ou não para o modelo. A relevância é extraída a partir da explicação do fenômeno, ou seja, a feature que melhor explica a variável resposta.

Nesse método, a relevância pode ser explicada pelo Coeficiente de Correlação, que possui um range de -1 a 1. Quanto mais próximo de 1 e -1, mais relevante é a feature.

Esse método tem como vantagens ser simples, rápido e fácil de entender. No entanto, não considera a influência entre as variáveis.

Abaixo, segue um quadro explicativo para escolher o método de correlação de acordo com o tipo de variável:

b) Seleção por importância (Embedded Methods)

É conhecido carinhosamente como método embutido, porque o método de seleção é um subproduto do próprio sistema de aprendizado de um sistema e utiliza a importância como critério de escolha da variável .

Por exemplo, o RandomForest é um algoritmo que funciona bem para fazer previsões em problemas de classificação e para ter alta acurácia precisa das melhores features, então essa seleção por importância já está embutida no processo. Esse algoritmo já utiliza a seleção das variáveis por importância encontrar e selecionar as features, para construir o seu aprendizado.

O Random Forest, Lasso Regression e Ridge Regression são algoritmos que se comportam dessa forma.

A regressão é uma soma ponderada, cada coluna explica um pouco do fenômeno, então a regressão dá um peso para cada uma das variáveis. Variáveis com peso alto são importantes para o aprendizado do modelo. Os pesos demonstram a importância da variáveis. O Lasso e o Ridge utilizam esse sistema.

a) Random Forest (Giny Impurity): Este algoritmo seleciona as variáveis e divide o conjunto de dados original, criando dois grupos mais similares possíveis(homogêneos entre si). A variável que separa esses dois conjuntos similares é uma variável importante.

O resultado que trás a importância das features pode ser plotado em um gráfico, mostrando o percentual de importância. Observa-se que no gráfico abaixo, as features 0, 1 e 2 explicam em torno de 70% do fenômeno:

Fonte: Feature importances with a forest of trees — scikit-learn 1.2.1 documentation

b) Lasso Regression: Funciona a partir da divisão das variáveis em pesos positivos e negativos. Seleciona-se as variáveis como importantes, quando apresentam os maiores pesos positivos e negativos. É possível definir o parâmetro alpha, que atua como um parâmetro de regularização (se o valor de alpha aumenta, menor peso será dados aos atributos que são menos importantes). Como exemplo, no gráfico abaixo, as features Nox, Chas e Indus, não são importantes:

Fonte: Feature Selection with sklearn and Pandas | by Abhini Shetye | Towards Data Science

c) Seleção por Subset (Wrapper Methods)

A seleção de variáveis por Subset, pode ser explicada em uma sequência de passos e o objetivo do processo é determinar a importância das variáveis. Os passos podem ser resumidos da seguinte forma:

  1. Seleção uma única variável (aleatoriamente) + variável resposta
  2. Treinamento do modelo de ML com essas duas variáveis
  3. Cálculo da performance do modelo (acurácia e/ou erro)
  4. Observação se a performance aumentou. Se aumentou, continua o processo
  5. Adição de mais uma variável aleatoriamente (agora são duas variáveis + variável resposta): retreino, recalculo da acurácia/erro e observação se a performance aumentou. Se aumentou, mantém essa variável e o processo continua igual para o restante das variáveis (ou seja, mantém as que estão funcionando bem e acrescenta mais uma). Quando a acurácia não aumentar, remove-se a variável e volta para o fluxo.
  6. Como resultado, o dataset final é menor e contém apenas as variáveis classificadas como importantes. Existem algoritmos que fazem essa sequencia de passos, identificando e trazendo as features mais importantes, por exemplo o Boruta.
O funcionamento do Boruta

O algoritmo Boruta, seleciona duas variáveis aleatoriamente do dataset original e cria duas variáveis shadow (cópia da variável original com as linhas “embaralhadas”). As linhas são misturadas para retirar a correlação entre elas.

Com esse novo conjunto de dados (4 variáveis), o modelo é treinado (normalmente com o Random Forest) e encontra a importância das 4 variáveis. O Boruta seleciona a variável shadow mais importante e compara todas as variáveis originais com ela.

E, organiza uma tabela, chamada Sucess Count (contagem de sucesso), se a variável original tiver uma importância maior que a importância da variável Shadow coloca-se 1, senão coloca zero.

Sobre a tabela Sucess Count, é possível construir uma distribuição binomial, traçando um “limite” e, a partir do cálculo do p-value de cada variável original saber se a variável é ou não importante: se o p-value da variável for menor que o p-value limite, a variável é considerada importante, ao contrário, rejeita essa variável. No final, o dataset é reduzido, apenas com as variáveis importantes.

Nota: O p-value ajuda a definir se uma hipótese é verdadeira ou se deve ser rejeitada.

Iteration: nº de iterações (110 é o nº máximo de iterações)

Confirmed: nº de variáveis escolhidas como relevantes

Tentativas: variáveis “duvidosas”, que não podem ser descartadas ou confirmadas

Rejected: nº de variáveis confirmadas

Neste post tratamos sobre a importância de encontrar as features relevantes para melhorar a performance do modelo de Machine Learning e como a dimensionalidade do conjunto de dados pode afetar esse desempenho. E, para concluir, gostaria de deixar como sugestão de leitura, o capítulo 8, do livro Machine Learning: Trabalhando com dados estruturados em Python, que aborda algumas das técnicas aqui discutidas.

Em um próximo post, vamos discutir essa seleção de importância de atributos sob a perspectiva dos modelos baseados em árvores.

Obrigada pelo seu tempo de leitura.

Meus contatos:

github.com/denisemerazzi
www.linkedin.com/in/denisewmerazzi/

denise.merazzi.com.br/portfolio/

Categorias
Análise de dados Ciência de Dados Machine Learning

Preparação de Dados: três técnicas para transformar a escala e manter o shape.

Nesse post você vai encontrar técnicas para fazer as transformações necessárias nas variáveis, com a finalidade de ganhar performance no modelo.

O aprendizado dos algoritmos de Machine Learning é baseado em diversas premissas, ou seja, detalhes que facilitam a aprendizagem e influenciam a performance do modelo.

Essas premissas seguem a base da teoria da Navalha de Ockhan, em que o conjunto de dados mais adequado para o modelo, deve estar construído com simplicidade e estar organizado de forma sistemática, apresentando:

  • A menor dimensionalidade
  • A menor complexidade
  • Menor nº de colunas

É importante destacar que é mais fácil o algoritmo aprender com dados numéricos e na mesma escala, porque os métodos de otimização que estes modelos utilizam tem a sua base em cálculos, como as derivadas e a soma.

O primeiro passo para obter um conjunto de dados adequado às premissas que atendem à boa performance do modelo, está em fazer uma boa análise exploratória univariada, bivariada e multivariada. Pois, dessa forma, é possível encontrar quais variáveis são importantes e quais estão correlacionadas, podendo ser agrupadas ou excluídas, para a melhor generalização do modelo.

Existem vários algoritmos que ajudam nesse seleção de features, mas é importante que o Cientista de dados faça a sua análise exploratória antes dessa etapa, para adquirir conhecimento a fim de confirmar ou confrontar as features que o algoritmo apresenta como sendo as mais relevantes.

É necessário que os dados estejam em uma mesma escala para que a comparação dos resultados não seja enviesada ou equivocada. Para isso, são utilizadas três técnicas que quando aplicadas, fazem com que o conjunto de dados continue no mesmo shape (nº de linhas e colunas) e no mesmo range (escala).

Abaixo descrevo estas técnicas de preparação de dados separadamente. São elas: Normalização, Rescaling e Transformação (Encoding e Natureza).

NORMALIZAÇÃO

É comum encontrarmos em um Dataset, dados que estejam organizados em colunas com um range muito diferente, o que torna a comparação dos dados muito “injusta”. Quando temos esse cenário é necessário equalizar a importância das features, para que o modelo entenda que não necessariamente a feature que tem o range maior é a mais importante.

Este tipo de preparação desloca a variável para um mesmo range (mesmo conteúdo, mesma escala). Através deste método ocorre a reescala do centro para o zero com desvio padrão igual a 1.

A fórmula que aplicada para realizar esta reescala é:

Sendo: Nova_coluna = coluna – média / desvio-padrão

No entanto, este método possui algumas limitações e só pode ser aplicado em dados que apresentam uma Distribuição Normal/Gaussiana.

RESCALING

É um método que reescala os dados para o intervalo entre zero e 1. Sua utilização é recomendada quando os dados apresentam um comportamento não Gaussiano, ou seja, não apresentam uma Distribuição Normal.

É importante observar se a coluna possui outliers, porque isso influencia na escolha do método de Rescaling. Se não houver outliers, pode ser utilizada a técnica MinMaxScaler, que considera valores mínimo e máximo. E, se houver outliers, utiliza-se uma técnica mais robusta diante de outliers, que é a RobustScaler. Essa técnica se comporta melhor com outliers porque, diferente da Normalização que utiliza a Média e o MinMaxScaler que utiliza os valores mínimo e máximo, a RobustScaler utiliza os quartis.

Fórmulas:

Fórmula MinMaxScaler
Fórmula RobustScaler

O MinMaxScaler e RobustScaler são classes encontrados no pacote Sklearn:

TRANSFORMAÇÃO

Aqui vamos abordar dois tipos de transformações: Encoding (transformar dados categóricos em numéricos) e Transformação de Natureza.

Encoding

Existem muitos tipos de transformação de dados categóricos em numéricos. Escolher qual Encoding usar, não é uma tarefa fácil, por isso é tão importante conhecer o conjunto de dados através da análise exploratória e também, fazer testes, calculando o erro, para descobrir qual forma é a mais adequada de tratar esse conjunto de dados.

Abaixo, segue um breve resumo de técnicas de Encoding, que são usadas para “traduzir” categorias em números:

a) One Hot Encoding

É uma técnica bem simples de ser compreendida. Observe que no exemplo abaixo, as cores são substituídas pelos números 1 e 0. Se for verdadeiro é 1 e se for falso é 0.

É interessante usar para variáveis categóricas que dão a ideia de estado (Ex: feriado, temperatura).

  • Vantagem: Super simples de aplicar.
  • Desvantagem: cria novas colunas no dataset e aumenta a dimensionalidade (overfitt).

b) Label Encoding

Esta técnica substitui a categoria por números de forma aleatória. Observe que no exemplo abaixo, as cores são substituídas por números.

Isso funciona muito bem para variáveis que são apenas nomes (ex: nome de lojas).

c) Ordinal Encoding

É uma técnica parecida com Label Encoding, porém tem uma diferença: respeita uma relação de ordem (hierarquia). Observe que no exemplo abaixo, a hierarquia é de tamanho: menor ao maior:

Funciona muito bem quando tem uma relação de maior e menor (ordem). Exemplo: baixo, médio, alto / muito frio, frio, morno, quente, muito quente.

d) Target Encoding

Leva em consideração a variável resposta (target). Por exemplo, calcula a média de vendas para cada um dos níveis das categorias (cores, cidades).

Funciona bem quando tem muitos níveis de categorias. Exemplo: cores.

e) Frequency Encoding

É parecido com Target Encoding. Faz uma contagem da frequência e calcula média (em percentual).

f) Embedding Encoding

É um método implícito dentro das redes neurais profundas (deep learning). São camadas que traduzem a variável categórica para numérica tentando manter uma relação de distância dentro de um contexto. É muito utilizado dentro de NLP e previsão de demandas.

g) Exemplo de implementação do código de alguns Encodings:

transformação

Existem dois principais tipos de transformações: Grandeza e Natureza.

a) Transformação de Grandeza: o objetivo é trazer a variável resposta com uma distribuição mais próxima da normal. Os algoritmos de ML tem a premissa que os dados sejam normalmente distribuídos, isso aumenta a acurácia do modelo.

b) Transformação de Natureza: o objetivo é trazer a natureza real dos dados. Por exemplo, se a natureza é cíclica os dados devem apresentar a forma de ciclo. Os meses são um bom exemplo, porque quando colocados em números de 1 a 12 – janeiro é perto de fevereiro mas é longe de dezembro, mas se isso for pensado em número (por exemplo janeiro de 2021 é perto de dezembro de 2020), perde-se essa noção de cíclico. Precisamos deixar janeiro próximo de dezembro.

Tipos de transformação de grandeza

a) Transformação Logarítmica: transforma um conjunto que tenha uma skill para a direita ou esquerda mais para o centro, mais próxima de uma normal. Aplica o log em todas as variáveis resposta.

b) Transformação Box-Cox: Também aproxima o conjunto de dados de uma normal. Tem uma fórmula e também aplica o log em todas as variáveis resposta.

c) Transformação Cube-Root: Extrai a raiz cúbica de todos os valores.

d) Tranformação Square-Root: Extrai a raiz quadrada de todos os valores.

e) Transformação Seno e Cosseno: Aplica o seno e o cosseno em todos os valores.

f) Exemplos de implementação de código:

transformação de natureza cíclica

Calcula-se o seno e cosseno, que combinados vão representar a natureza cíclica. Na prática, aumenta a dimensionalidade do dataset, porque cria novas colunas. Apesar disso, melhora a performance porque a natureza da variável fica equalizada.

Exemplo de implementação de código:

Concluindo este tema, observamos que são muitas as formas de realizar o encoding das variáveis e, que estas são técnicas necessárias e amplamente utilizadas antes de fazer o treinamento do modelo de Machine Learning.

Agradeço seu tempo de leitura. Fica como dica a leitura abaixo, para aprofundar o tema.

All about Categorical Variable Encoding | by Baijayanta Roy | Towards Data Science

Category Encoders — Category Encoders 2.6.0 documentation (scikit-learn.org)

Navalha de Ockham – Wikipédia, a enciclopédia livre (wikipedia.org)

Meus contatos:

github.com/denisemerazzi
www.linkedin.com/in/denisewmerazzi/

Categorias
Ciência de Dados Git

Conceitos essenciais no Git

O objetivo deste post é apresentar de forma sucinta e concisa o conceito de algumas palavras-chave para entender o funcionamento da ferramenta de versionamento Git.

A ideia é construir uma espécie de Glossário, trazendo o significado de palavras, que são a base para entender o funcionamento desta ferramenta, que é amplamente utilizada por diversos segmentos Techs, incluindo a Ciências de Dados.

Glossário Git
  • COMMIT: A palavra commit do inglês, nos remete à ideia de comprometer, verificar ou confirmar algo. No Git, significa que uma nova alteração feita no código do projeto será submetida para o salvamento no ambiente local. Funciona como uma captura da versão atual do projeto, em que é possível adicionar uma mensagem que “vai contar a história do projeto” durante o seu desenvolvimento.
  • REPOSITÓRIO LOCAL: É o repositório criado dentro da máquina local.
  • REPOSITÓRIO REMOTO: É um repositório que não está localizado na máquina local, por exemplo o GitHub.
  • BRANCH: É um ambiente que possui uma linha de trabalho independente. Permite modificar códigos, sem alterar o que já está funcionando, com mais segurança, autonomia e minimizando os conflitos de merge. Por exemplo, uma equipe está trabalhando em um projeto, onde cada um trabalha de forma independente, em partes diferentes do código do projeto e em uma branch diferente e, conforme as alterações vão sendo realizadas, serão salvas em um único projeto.
  • HEAD: Funciona como um ponteiro que representa a versão que está sendo alterada no momento, ou seja, em qual versão do projeto estamos trabalhando. Utilizando o comando checkout em uma branch, o Git de forma automática coloca a HEAD apontando para a última versão desta branch.
  • MERGE: É a união de commits. Por exemplo, quando um código está sendo testado fora da branch “oficial” e depois de “passar no teste” ele pode ser adicionado à branch “oficial”, através da realização de um merge.
  • CONFLITO DE MERGE: Ocorre quando linhas de código diferentes são salvas no mesmo arquivo e ficam “sobrepostas”. É como se duas linhas de código tentassem ocupar o mesmo espaço. Estes conflitos podem acontecer na união entre branchs e entre commits. O Git não consegue resolver este problema automaticamente, é necessário resolver desfazendo as alterações ou com a utilização de pacotes especiais que auxiliam nessa etapa.

Esses são alguns conceitos básicos para entender o funcionamento do Git que são necessários para um melhor embasamento, quando estamos estudando ou trabalhando com essa ferramenta.

Agradeço o seu tempo para a leitura deste pequeno artigo, espero ter contribuído. E, se você quer saber mais sobre a utilização do Git, seus principais comandos e como trabalhar com essa ferramenta, faça a leitura do artigo listado no link abaixo, onde este tema está mais detalhado. Até logo 😉

Comandos no Git que todo Cientista de Dados precisa saber – My Blog (merazzi.com.br)

Meus contatos:

github.com/denisemerazzi
www.linkedin.com/in/denisewmerazzi/

Categorias
Ciência de Dados Git

Comandos no Git que todo Cientista de Dados precisa saber

Nesse artigo, você vai conhecer os principais conceitos e comandos para utilizar a ferramenta Git nos seus projetos de Data Science, desde a criação de um novo repositório local até os conceitos mais avançados como branchs e merge, que facilitam o trabalho em equipe em um ambiente remoto e colaborativo.

O que é e para que serve?

O Git é uma ferramenta que não pode faltar na formação de um Cientista de Dados, porque permite o controle de versionamento de códigos, organiza as alterações realizadas ao longo do projeto, permite fazer um push e um pull dessas alterações e continuar o desenvolvimento do projeto, com as suas melhorias implementadas.

O ideia do Git é fornecer um repositório local para armazenar o projeto, que pode funcionar offline para um trabalho mais individual e além disso facilita o compartilhamento das alterações do projeto para um trabalho em equipe, organizado em ambiente remoto.

O Git apresenta muitas facilidades que o tornam uma ferramenta indispensável:

  • Segurança e facilidade no controle de versões do Projeto.
  • Construção de branches, que são ambientes seguros para desenvolver e testar, sem impactar no que já está em produção funcionando.
  • É possível ignorar alguns arquivos, através da utilização do .gitignore, para filtrar os arquivos que não fazem parte do código-fonte do projeto.
  • Operações rápidas e fáceis.
  • Capacidade para adicionar ou mover arquivos.
  • É possível entender o histórico das modificações realizadas.
Conhecendo a área de trabalho do Git
  • Staging: onde ficam todos os arquivos alterados e que foram marcados como prontos para terem o seu estado salvo, com um commit. Utilizamos o comando git add <nome_arquivo> para enviar um arquivo para a Staging Area.
  • Repository: área onde ficam todos os arquivos versionados pelo Git, que foram salvos com o comando git commit.
  • Working Directory: área onde ficam todos os arquivos que foram alterados (saíram da área Repository), mas ainda não foram marcados como prontos para serem commitados. Utiliza-se o comando git restore<nome_arquivo> para remover o arquivo de dentro da Working Directory e retornar ao último estado salvo no Repository (a funcionalidade deste comando é desfazer as alterações e voltar para o Repository ).
Alguns comandos essenciais no Git que você não pode deixar de conhecer
Comandos para a visualização do histórico e alteração de commits
Comandos para alteração de commits anteriores
Comandos de recuperação de arquivos deletados
Comandos para trabalhar em equipe em um ambiente remoto – GitHub
Trabalhando com Branchs

A branch permite modificar os códigos de um projeto, sem alterar o que já está funcionando, promovendo a independência no desenvolvimento para testar e alterar antes de enviar para o ambiente de produção. Assim, a equipe pode produzir de forma independente, com mais segurança no projeto, minimizando os conflitos de merge.

Comandos para criar e mover Branchs
Realização do merge

O merge é a união de commits e é muito utilizado quando trabalha-se com branch.

O Git não consegue resolver automaticamente quando ocorre o conflito de merge, ou seja, alterações no mesmo arquivo e/ou linhas de código.

Esses conflitos podem acontecer tanto na união entre branchs quanto entre commits.

Para utilizar o comando git merge, tem-se que estar na branch que irá receber as alterações.

No Diagrama abaixo, observa-se que os dois primeiros commits são feitos na Branch main. Quando a Branch develop for criada, uma cópia do projeto será adicionada à ela. E, esta versão do projeto, após suas alterações, retorna através de um merge para a Branch main, atualizando a sua versão.

Exemplo de Diagrama de Histórico de alterações do Git
Comandos para identificar o conflito de merge dentro do Jupyter Notebook

O Jupyter Notebook é “por baixo dos panos” um arquivo json, o que dificulta bastante na hora de identificar onde está acontecendo o problema.

Para visualizar o arquivo fonte, dentro do Jupyter Notebook e identificar onde aconteceu o conflito de merge, utiliza-se o
Reopen Editor With -> text editor.

Quando ocorre o erro no merge no Jupyter, é mais assertivo desfazer o processo. E para auxiliar na identificação do problema, é possível utilizar o pacote nbdime.

Agora, você é capaz de utilizar a ferramenta Git para desenvolver os seus projetos em Data Science, otimizando o versionamento de códigos de maneira segura, eficiente e organizada.

Se você ficou com alguma dúvida sobre algum conceito importante como branch e head, pode visitar um pequeno post que elaborei no formato de um glossário, trazendo o significado de algumas palavras-chave dentro do Git. Pode ser encontrado neste link:

Finalizando, agradeço o seu tempo dedicado à leitura deste artigo, espero ter contribuído de alguma forma e nos encontramos novamente na leitura de futuros artigos.

Conceitos essenciais no Git – My Blog (merazzi.com.br)

Meus contatos:

github.com/denisemerazzi
www.linkedin.com/in/denisewmerazzi/