Introdução ao Deep Learning com o TensorFlow

500_f_84517548_t640subkwc91b36ek9yzypvwsibb3nvn

Recentemente fui convidado a palestrar no evento GDG DevFest 2016, realizado na cidade de Campinas. Neste post apresento os slides que utilizei e comente um pouco sobre como foi o evento.



Quando recebi o convite para palestrar neste evento (graças ao colega Ale Borba) fiquei empolgado para poder falar um pouco sobre o TensorFlow. Esta lib para machine learning é muito interessante e está ganhando cada vez mais recursos e aplicações práticas. Abaixo estão os slides que utilizei e neste repositório do GitHub estão os scripts em Python.

 

Como atualmente eu venho estudado e escrevendo um pouco sobre machine learning  posso dizer que esta tecnologia que o Google abrir é ótima. Contudo, ainda existe uma curva de apresentado relativamente grande para quem não conhece nada de IA, Data Mining ou machine learning.

Por outro lado, iniciativas da comunidade como o Keras ou o TFLearn estão aí para ajudar muito quem deseja das os primeiros passos com o TensorFlow. Portanto, recomendo aos interessados analisar os slides, acessar os links e fazer alguns testes para pelos menos entender o “jeitão” do TensorFlow.

Os exemplos iniciais recomendados podem parecer pouco palatáveis, especialmente para aqueles que não conhecem muito redes neurais. Entretanto, vale a pena gastar um pouco de tempo e esforço, pois pelo que eu estou observando desta tecnologia ela vai longe.

Publicado em Machine learning | Com a tag , , , , , , , , , | Deixar um comentário

Qual algoritmo de clustering eu uso?

figura1_mwu_topic1_poster

A pergunta do título deste post é uma das que mais ouço quando estou ensinando machine learning para quem está começando na área. Neste post vou tentar responder esta pergunta e ajudar quem possui dúvidas sobre o que utilizar para agrupar dados.

Como muitas perguntas de área da computação, a resposta da pergunta que indaga sobre qual algoritmo utilizar para agrupar os dados começa com um sonoro depende. O motivo pela qual as coisas são assim é que existem diversos fatores por trás desta simples pergunta que precisam ser conhecidos antes da elaboração de uma resposta adequada.

Os algoritmos de agrupamento, também conhecidos como clustering, fazem parte do que é conhecido como aprendizado de máquina não supervisionado. Isto quer dizer que a partir de dados “gerais” e sem nenhuma “anotação” é possível descobrir alguns padrões e criar um modelo que, na prática, vai ser utilizado para classificar um novo conjunto de dados quando ele surgir. Tudo isso é bem explicado com teoria e prática no meu curso de introdução ao machine learning com Python, cujos detalhes e inscrição podem ser obtidos neste link.

Uma coisa que poucas pessoas sabem é que os algoritmos de aprendizado não supervisionado empregados no machine learning são, na minha opinião, estranhos. Esta estranheza se devo ao fato que é preciso uma boa dose de interpretação do que é gerado pelos algoritmos, especialmente quando falamos sobre clustering. E esta interpretação requer conhecimento dos dados, do negócio e também de detalhes técnicos dos algoritmos.



Por exemplo, vamos supor que desejamos classificar clientes em grupos. Os algoritmos de clustering vão analisar os dados e gerar regras internas para dizer se um cliente X pertence a um grupo A, B ou qualquer que seja.

Entretanto, nem sempre podemos apresentar uma descrição significativa e representativa do grupo A ou B, pois mesmo tendo acesso a definição das regras que colocam ou não um dado no grupo fica complicado caracterizá-lo. As vezes fica fácil dizer algo como “este é o grupo do clientes AAA” ou “esta imagem é mais parecida com as imagens que possuem gatos”. Não obstante, quando falamos em conjuntos de dados com muitos atributos fica complicado atribuir significado aos grupos, que também são chamados de clusters. Esta é uma característica dos algoritmos não supervisionados de clustering: como os padrões são detectados automaticamente nem sempre podemos facilmente explicar o que foi gerado.

Contudo, esta dificuldade de explicar os grupos gerados nem é a maior dúvida de quem está querendo decidir por um ou outro algoritmo de clustering. Em geral, a dúvida tem como objetivo escolher o algoritmo que gere o menor erro de classificação, ou seja, a melhor acurácia. Porém, nem sempre isso faz muito sentido.

Por exemplo: é comum aprender logo de cara o algoritmo clássico k-means para classificação. Este algoritmo requer por definição o número de clusters que se deseja utilizar para classificar a amostra. Durante minhas aulas noto que os alunos tem dificuldade para compreender qual é o número de clusters e também outros parâmetros como, por exemplo, detalhes internos do algoritmo.

Isso fica um pouco claro mais quando observamos a imagem abaixo: ela mostra as formas de classificar três conjunto de dados (representados por pontos) utilizando diferentes algoritmos de clustering. A referência é a biblioteca scikit-learn do Python.

figura2_clustering

 

Ok, mas então #comofaz para escolher o algoritmo de clustering?

 

figura4_fwri0

Bem, o que posso sugerir em primeiro lugar é conhecer muito bem as opções. Saber quais são os parâmetros necessários para o algoritmo, onde ele é tipicamente utilizado e o que é possível se obter com ele ajuda muito. Por exemplo: saber que o algoritmo DBSCAN requer um número que representa de distância entre os centroides do cluster ajuda a saber se ele deve ser empregado ou não. Na prática este algoritmo é muito utilizado em cenários de visão computacional, pois a distância dos centroides neste contexto é muito importante.

Certo, então além de conhecer como funcionam os algoritmos de clustering, seus parâmetros e alguns exemplos de uso estou pronto para fazer a minha escolha? Infelizmente ainda não pequeno gafanhoto!

Para complementar o conhecimento necessário para escolher o algoritmo eu sugiro ainda explorar um pouco os dados com gráficos para se obter mais detalhes sobre eles visualmente. Além disso, também é importante levar em consideração como os algoritmos vão gastar os recursos computacionais (CPU, disco e memória) com base no tamanho dos dados que vão ser analisados. Também vale a pena se informar sobre opções de paralelismo e suporte dos algoritmos, ou seja, como eles são implementados em diversas ferramentas de machine learning.

Por fim, sempre que existe o uso de algoritmos de classificação não supervisionada para clustering é preciso gastar um bom tempo para analisar o impacto na quantidade de clusters versus a variação da amostra. Obviamente, isso é impactado por algum tipo de tratamento nas features, especialmente quando se utiliza técnicas de redução como PCA e remoção de outliers (também chamados de valores aberrantes).

Sendo assim, não é fácil responder a pergunta título deste post. Contudo, com uma boa exploração dos pontos citados já é possível não só ter uma base para iniciar uma fase de testes de diversos algoritmos, mas também conhecer um pouco mais sobre o que é possível obter como resultado utilizando algoritmos não supervisionados de clustering.

Publicado em Carreira, Machine learning | Com a tag , , , , , , , , , , , , | Deixar um comentário

Top 10 hacks de SQL para machine learning

figura1_capa_almost-human-episode-1-11-disrupt-promotional-photos-2_full1-846x564

A linguagem SQL é o recurso computacional mais utilizado para lidar com dados. Neste post descrevo algumas técnicas avançadas de TSQL para lidar com dados antes de partir para o Machine Learning.

A manipulação de dados antes da aplicação de diversos algoritmos de machine learning é muito comum. De fato, não é raro ouvir que aproximadamente 70% ou mais do tempo gasto em projetos de data science é apenas manipulando dados antes de efetivamente aplicar algum algoritmo de machine learning.

Existem várias tecnologias, linguagens e recursos para manipular os dados. Contudo, quando falamos de Big Data faz muito sentido ter o suporte de um banco de dados em algum momento, uma vez que será preciso lidar com quantidades de dados que muitas vezes não cabem na memória. Portanto, é razoável admitir que a manipulação dos dados envolva a linguagem SQL caso bancos de dados relacionais estejam envolvidos no projeto.



Como já tenho uma boa experiência em SQL Server resolvi compartilhar alguns dos meus “hacks” de código TSQL que mais vêm me ajudando nos projetos. Obviamente estas manipulações de dados podem ser feitas de diversas maneiras (algumas até mais otimizadas do que os códigos deste post) e com diferentes linguagens.

Antes de apresentar o top 10 aproveito para citar o meu curso de introdução ao machine learning com Python. Este curso apresenta diversas manipulações de dados também, uma vez que o conteúdo é muito focado na parte prática. As inscrições já estão acabando para turma de novembro, mas acredito que ainda dê tempo de fechar algumas vagas acessando este link.

1) Importação com o BULK INSERT

figura2_data_download-512

Quando se trabalha com machine learning é quase que uma certeza que será necessário lidar com arquivos texto mais cedo ou mais tarde. O formato mais comum de dados em arquivo texto é o CSV (comma separated values) onde cada linha é separada por um conjunto de caracteres de final de linha (tipicamente o CR+LF) e cada coluna da linha é separada por outro caractere (tipicamente a vírgula).

Não gosto muito de utilizar o assistente de importação do SQL Server para lidar com arquivos CSV porque ele sempre me dá algum erro na importação. Portanto, para lidar rapidamente com a importação de dados neste formato eu faço as seguintes passos:

a) Inicializo o assistente de importação do SQL Server e indico que quero importar dados de um arquivo texto (flat file) para o SQL Server. Sigo o assistente até a tela de mapeamento onde copio o comando CREATE TABLE gerado pela ferramenta e cancelo o assistente

b) Altero manualmente o comando CREATE TABLE gerado para colocar varchar(4000) em todas as colunas. Assim consigo importar os dados primeiro e me preocupar com a conversão de tipos depois

c) Crio a tabela com o comando CREATE TABLE

d) Executo o comando BULK INSERT e importo os dados. Algo como o código abaixo:

BULK INSERT MeuBanco.dbo.MinhaTabela

FROM 'c:\ArquivoDados.csv'

WITH

(

FIELDTERMINATOR = ',',

ROWTERMINATOR = '\n'

);

e) Monto uma instrução SELECT que lê os dados importados da tabela e faço a conversão de cada coluna para um tipo de dados adequado. Este SELECT contém a cláusula INTO para gerar uma tabela já com os tipos certos que serão utilizada nas análises.

2) Leitura rápida de arquivos CSV

figura3_olhar

Algumas vezes preciso observar rapidamente o conteúdo de um arquivo CSV diretamente em uma instrução SELECT antes de fazer a importação. Esta observação rápida geralmente é feita em arquivos pequenos só para verificar as primeiras linhas do cabeçalho ou algo assim.

Para estes casos utilizo a função OPENROWSET() com as opções BULK e SINGLE_CLOB. Este tipo de operação não separa em linhas e colunas o conteúdo, mas ajuda quando preciso dar aquela olhada esperta nos dados antes de prosseguir com a importação. Exemplo:

SELECT a.* FROM OPENROWSET( BULK 'E:\temp\teste1.csv', SINGLE_clob) AS a;

3) Mediana e moda

figura4_mean-median-mode

O SQL Server possui uma função de agregação para o cálculo da média (AVG()), porém não existe algo pronto para o cálculo da mediana ou moda. Estas duas métricas são importantes, especialmente quando se está analisando a distribuição de frequência de valores de atributos. De fato, se os valores da média, mediana e moda forem muito diferentes isso significa que a distribuição está “inclinada” para a esquerda ou direita e isso diz algo importante sobre os dados.

O cálculo da moda é simples: basta fazer um SELECT com uma agregação e obter a primeira linha com a cláusula top através da ordenação decrescente. Por exemplo, para obter a moda da tabela TB_DADOS que contém a coluna VALOR basta executar o comando abaixo:

SELEC TOP 1 VALOR, COUNT(VALOR)

FROM   TB_DADOS

ORDER BY COUNT(VALOR) DESC

Já a mediana é um pouco mais complicada. Vasculhando na internet encontrei a solução abaixo que faz alguns SELECTs na mesma tabela com o uso da cláusula TOP PERCENT.

SELECT

(

(SELECT MAX(VALOR) FROM

(SELECT TOP 50 PERCENT VALOR FROM TB_DADOS ORDER BY VALOR) AS BottomHalf)

+

(SELECT MIN(VALOR) FROM

(SELECT TOP 50 PERCENT VALOR FROM TB_DADOS ORDER BY VALOR) AS TopHalf)

) / 2.0 AS Mediana

A referência do script acima é esta pergunta no StackOverflow.

4) Contando e separando valores

figura_5_economy-conveyor-belt-frontpage

Certos valores de colunas com caracteres possuem alguns delimitadores que devem ser separados para obter os dados no formato tabular. Esta operação de separar os dados chama-se slipt e existem diversas maneiras de se fazer isso no SQL Server. Este link contêm vários exemplos de como isso pode ser feito para, por exemplo, transformar a string “a,b,c” em um resultado tabular com uma linha e três colunas.

Em alguns casos também é útil contar a quantidade de repetição de certos caracteres. Para isso utilizo uma expressão rápida que é a subtração da quantidade total de caracteres do tamanho de uma segunda string. Esta segunda string é gerada trocando o caractere que desejo contar da string original pela string vazia. Por exemplo, se desejo contar a quantidade de letras ‘a’ da coluna NOME da tabela TB_DADOS eu faria algo como:

SELECT NOME, LEN(NOME) – LEN(REPLACE(NOME,’a’,’’)) as QTD_LETRAS_A

FROM TB_DADOS

5) Processamento para cada coluna

figura6_workerline

A etapa de exploração dos dados muitas vezes requer que façamos cálculos para cada um dos atributos, especialmente se possuirmos conjuntos de dados com vários atributos. Este tipo de tarefa pode ser maçante e muito chata se não for otimizada, pois teríamos que digitar cada nome das colunas em diversas instruções.

Quando me deparo com este tipo de situação eu emprego a seguinte técnica: faço um SELECT que vai gerar diversas instruções SQL dinamicamente como uma string. Este SELECT utiliza a tabela de sistema sys.all_columns que contêm a coluna name, responsável por armazenar o nome da coluna. Depois que o SELECT for retornado eu copio e colo (CTRL+C e CTRL+V) o resultado da coluna calculada e mando executar.

Como exemplo vamos supor que desejamos executar um agregação para ver frequência de valores para cada coluna da tabela TB_DADOS. Para isso podemos gerar as diversas instruções SELECT que fazem uso do COUNT() a partir do SELECT abaixo.

SELECT  'SELECT ''' + NAME  + ''''

+ ' , COUNT(*) AS TOTAL'

+ ' FROM TB_DADOS'

FROM SYS.all_columns

WHERE OBJECT_ID = OBJECT_ID('TB_DADOS')

6) Aleatoriedade e Split

figura7_bananasplipt_660201

Muitas vezes precisamos gerar uma quantidade X de valores da tabela de forma aleatória. Esta operação é muito comum quando precisamos fazer o split dos dados e separá-los em conjuntos de treinamento e testes. Muitas ferramentas de machine learning possuem diversos recursos para fazer esta tarefa, mas com o TSQL podemos utilizar a cláusula TOP PERCENT para limitar o percentual de dados retornados. Já para gerar aleatoriedade podemos utilizar a cláusula ORDER BY junto com a função NEWID().

Por exemplo, se desejarmos separar os dados tabela TB_DADOS com as colunas ID e VALOR em um split aleatório de 80% de dados de treinamento e 20% de teste podemos fazer algo com o SELECT abaixo, que utiliza uma tabela temporária chamada #T_AUX.

/* Primeiro os 80% de treinamento */

SELECT TOP 80 PERCENT ID, DADOS

INTO #T_AUX

FROM TB_DADOS

ORDER BY NEWID()

/* Agora os 20% restantes */

SELECT *

FROM DADOS

WHERE ID NOT IN (SELECT ID FROM #T_AUX)

7) Gerando ids

figura8_the-x-files-fox-mulder-fbi-id-wallet-badge-5

A geração de colunas com valores identificadores é algo muito comum no machine learning, uma vez que a maioria dos algoritmos trabalha apenas com valores numéricos para os atributos. No SQL Server é possível fazer isso rapidamente criando uma nova coluna do tipo numérico na tabela que possua a propriedade IDENTITY, como o exemplo abaixo mostra.

ALTER TABLE TB_DADOS

ADD NOVO_ID INT IDENTITY(1,1)

É importante destacar que o comando acima cria uma nova coluna e já coloca os valores numerados sequencialmente. Dependendo da necessidade pode ser preciso gerar os valores sem alterar a tabela e para isso recomendo o SELECT abaixo que usa a cláusula OVER() junto com a função ROW_NUMBER() para criar novos ids para a uma coluna chamada VALOR a patir uma tabela fictícia chamada TB_DADOS

SELECT ROW_NUMBER() OVER (ORDER BY  A.VALOR) AS NOVO_ID

, A.VALOR

FROM ( SELECT DISTINCT VALOR FROM TB_DADOS)  AS A

8) RMSE

figura9_rmse

A sigla RMSE (Root Mean Square Error) representa uma métrica importante quando estamos lidando com regressão. Ela é utilizada para verificar o quão “boa” é a sua previsão e faz o papel de outras métricas empregadas para verificar a qualidade de modelos que fazem classificação.

Em geral utilizamos a RMSE na comparação entre técnicas de regressão e aquela que tiver o melhor valor para esta métrica potencialmente pode ser empregada. Para calcular a RMSE basta ter uma sequência de números em uma tabela. Infelizmente o SQL Server não possui recursos próprios para o cálculo do RMSE, mas encontrei este script que faz o cálculo utilizando um CTE em conjunto com a cláusula OVER. No exemplo abaixo calculo o RMSE utilizando de uma tabela temporária chamada #NUMBERS que possui a coluna NUMBER.

WITH    nums AS

(

SELECT  NUMBER, ROW_NUMBER() OVER (ORDER BY NUMBER) AS rn

FROM    #NUMEROS

)

SELECT  SQRT(AVG(POWER(np.NUMBER - nn.NUMBER, 2)))

FROM    nums np

JOIN    nums nn

ON      nn.rn = np.rn + 1

9) Cálculo de correlações

figura10_correlacao

A correlação entre dois grupos de valores é uma das mais importantes tarefas quando se está analisando o impactado das features em um modelo de machine learning. Esta importância se deve ao fato que quando descobrimos correlações significativas podemos, entre outras tarefas, reduzir a quantidade de features do nosso modelo e talvez otimizar o processo de treinamento.

Entre as várias métricas de correção podemos citar o coeficiente de Person, ANOVA, GINI, Information Gain e outros. O SQL Server não possui recursos próprios para isso, mas existe um pacote de assemblies do .NET muito bom que pode ajudar: o TotallySQL. Este pacote é software livre e possui diversos recursos e o subconjunto de assemblies .NET que calcula as correlações está agrupado na namesspace SQLStatics. Recomendo a instalação deste componente para quem está pensando em cálculos mais avançados dentro do SQL Server.

10) Gerando dados com uma distribuição normal

figura11_normalA distribuição normal (também chamada gaussiana) é muito utilizada em projetos de data science, especialmente quando precisamos gerar rapidamente uma base de números a partir de algumas características. Uma vez com esta base de teste podemos testar alguns algoritmos e verificar se está tudo OK.

Os parâmetros necessários para gerar dados de acordo com uma distribuição normal são a média e o desvio padrão. Para gerar rapidamente os dados no SQL Server eu utilizo o script abaixo adaptado do post escrito por Phil Factor no site Simple-Talk, uma ótima referência para conteúdo do SQL Server. Destaco que pode ser necessário converter o tipo de dados, pois muitas vezes o float obtido pelo script pode gerar problemas de arredondamento indesejados.

/* CRIANDO AS VARIÁVEIS */

/* TABELA NA MEMÓRIA COM A SEQUÊNCIA DE NÚMEROS */

/* DE ACORDO COM A DISTRIBUIÇÃO NORMAL */

DECLARE @RANDOMNUMBERS TABLE (NUMBER FLOAT)

DECLARE @MEAN FLOAT /* A MÉDIA */

DECLARE @STANDARDDEVIATION FLOAT /* O DESVIO PADRÃO */

DECLARE @II INT /* CONTADOR */

DECLARE @TOTALWANTED INT /* A QUANTIDADE DE NÚMEROS DESEJADA */

/* COLOQUE AQUI OS VALORES DA MÉDIA, DESV. PADRÃO */

/* E TOTAL DE LINHAS DESEJADAS */

SELECT @MEAN=2.8, @STANDARDDEVIATION=0.5, @II=1, @TOTALWANTED=10000;

/* GERANDO OS VALORES EM UM LOOP */

WHILE @II<= @TOTALWANTED

BEGIN

INSERT INTO @RANDOMNUMBERS(NUMBER) SELECT ((RAND()*2-1)+(RAND()*2-1)+(RAND()*2-1))*@STANDARDDEVIATION+@MEAN;

SELECT @II=@II+1;

END

/* CONSULTANDO OS VALORES GERADOS */

SELECT * FROM  @RANDOMNUMBERS
Publicado em Machine learning | Com a tag , , , , , , , , , , , , , , , , , , , , , | Deixar um comentário

Ego x Acurácia: um problema no machine learning

figura1_capa

Ultimamente tenho estudado muito machine learning e outros aspectos relacionados a área denominada data science. Neste post vou falar um pouco sobre o impacto que a suposta “qualidade” de modelos exerce no comportamento de pessoas, especialmente no que diz respeito ao ego.

Muitos dos problemas solucionados na prática pelo machine learning envolvem o uso de algoritmos de predição e classificação. Este tipo de operação tem como objetivo dizer o que existe em uma foto, identifica de dígitos em imagens ou reconhecer a voz em um áudio dentre outras tarefas importantes. No meu treinamento de introdução ao Machine Learning com Python eu comento estes e muitos outros cenários, inclusive mostrando como montar algumas destas classificações com Python.

Em geral, para medir qual é a eficácia, ou seja, o quão “bom” é o algoritmo ou modelo treinado para classificar amostras de dados existem diversas métricas, sendo que a acurácia é a mais usada. De fato, tal métrica muitas vezes é empregada para avaliar se vale a pena ou não investir mais recursos no machine learning para que a solução fique “melhor”.



Contudo, tenho visto muita gente se gabando e inflando o ego quando consegue atingir uma acurácia de um modelo maior do que o modelo gerado por outras pessoas. De fato, não é raro encontrar comportamentos do tipo “sou superior a você por que o meu algoritmo/solução tem uma acurácia maior que o seu”. Eu sei, é triste ver este tipo de mentalidade, mais isso acontece muito.

Eu já conversei com alguns colegas sobre ego e humildade no programa de mesmo nome do DatabaseCast que pode ser ouvido aqui. É interessante notar que conforme mais e mais pessoas estão aprendendo e utilizando o machine learning este sentimento de “superioridade” está aparecendo com mais frequência, especialmente em comunidades como o Kaggle onde parece que vale a máxima “sou melhor porquê estou mais acima no ranking que você”.

Esta situação me lembrou muito a obsessão do personagem principal da série Breaking Bad. De fato, nesta série é notória a preocupação do químico pelos mínimos detalhes na pureza do “produto” chegando ao ponto onde podemos observar o nível de paranoia do personagem.

figura3_purity

Mas a semelhança tem que parar por aí, uma vez que modelos de machine learning com acurácia muito alta não cheiram bem, ou seja, eles provavelmente estão “viciados” demais nos dados de treinamento. Este fenômeno é conhecido como overfitting e mesmo com diversas técnicas para evita-lo ainda não é bem visto um modelo que possui 99,9999% ou mais de acurácia. Isto sem entrar na discussão que a acurácia nem sempre é a melhor maneira de analisar o resultado de um modelo de machine learning, pois existe a curva ROC, o F1, o recall e outras métricas muito importantes.

De qualquer maneira, certo nível de dedicação, esforço e vontade para melhorar modelos de machine learning são benéficos, desde que estas atitudes não levem a pessoas extremamente convencidas que acabam julgando outros pela qualidade de seus modelos de machine learning. Assim como qualquer outro resultado quantificável de esforço, rotular pessoas pelo quão preciso é seu algoritmo/modelo/solução certamente não é nada saudável e expõe uma falha de caráter nada adequada para um cenário onde as coisas mudam muito rapidamente.

Publicado em Machine learning | Com a tag , , , , , , , , , | Deixar um comentário

Precisamos falar sobre a documentação no machine learning

figura1_capa_robot-reading-a-book

Muita gente está dando os primeiros passos no machine learning e esquecendo um importante elemento: a documentação. Neste post vou falar um pouco sobre este artefato de software que muitas vezes acaba sendo esquecido.

A documentação técnica para desenvolvedores em geral não é muito bem vista por quem precisa fazê-la. Isto quer dizer que na maioria das vezes o responsável técnico pela solução prefere gastar seus conhecimentos, habilidades e recursos codificando e resolvendo problemas na prática do que documentando, descrevendo e facilitando o acesso ao que foi criado para outras pessoas. Infelizmente com o machine learning não é diferente.



Se considerarmos o perfil de quem trabalha com machine learning é razoável admitir que, no mínimo, o profissional deve saber lidar com dados, ter pensamento lógico, analítico e ser extremamente criterioso e atento a detalhes. Contudo, enquanto este mix de habilidade favorece a criação da solução, tais profissionais muitas vezes deixam a desejar no que diz respeito à habilidades sociais e de comunicação. E este é um dos principais motivos pela qual que a documentação de projetos de machine learning fica comprometida.

Apesar da documentação ser importante, ela não ajuda muito que não sabe do que isso se trata e por onde começar. Visando este público eu desenvolvi um curso presencial de introdução ao machine learning com foco em Python. Este curso rápido ainda possui alguns vagas e recomendo aos interessados acessarem este link que contêm mais informações e o procedimento para a inscrição.

Em geral, a documentação do machine learning envolve diversos elementos comuns àqueles de quem trabalha com banco de dados. De fato, já escrevi sobre este assunto e sobre documentação de APIs. Aqui reitero que investir na documentação vale muito a pena não só para novatos, mas para qualquer pessoa envolvida no projeto.

Um dos pontos da documentação exclusiva no machine learning é a descrição do que foi experimentado, uma vez que é comum avaliar, testar e validar diversas abordagens enquanto não se toma a decisão final de qual algoritmo, os parâmetros, os dados e outros fatores muito importantes a serem utilizados que fazem a diferença na prática. Esta descrição pode ser em formato de diário onde destaca-se a cada dia o que foi feito, como foi feito, porque foi feito e o que foi obtido.

too-many-questions

Este tipo de descrição evita que novos integrantes no projeto fiquem comentando algo como “já tentou X?”, “E se você fizer Y desde jeito?” ou “você pode melhorar Z aplicando a nova técnica W”. Nem sempre quem está com a mão na massa tem tempo ou paciência para explicar todos os detalhes para responder a comentários deste tipo, especialmente para novos integrantes da equipe. Portanto, faz muito sentido documentar claramente decisões de projeto baseado no que foi experimentado.

Outro aspecto da documentação de projetos de ML importante é relacionado ao pipeline, o seja, o fluxo de etapas realizadas. Atualmente diversas ferramentas vêm emprego interfaces interativas e visuais com ícones que representam etapas como abrir arquivos, separar dados, filtrar linhas, criação de novas features, teste de modelos, avaliação de resultados, geração de gráficos, etc. Exemplos incluem o Orange, o Weka e a interface do Azure.

figura4_orangepython

Este tipo de representação visual ajuda a documentar o projeto de ML, mas ainda é pouco. É preciso que tais diagramas sejam acompanhados de descrições, documentos, arquivos, layouts, scripts, arquivos com código fonte e outros artefatos que ajudem a compreender como, porquê e quando foram tomadas as decisões e atitudes que levaram o projeto de ML a ter a forma em que ele se encontra em um determinado momento.

Outro aspecto interessante relacionado à documentação é a inclusão de etapas do ML, como o treinamento do modelo e validação, na integração contínua de projetos de software. Isto quer dizer que é preciso, por exemplo, ligar os processos de build e deploy de uma ferramenta/software/aplicação com certas etapas do ML para garantir que tudo fique em sincronia. Apesar de importante, devido à pouca experiência com este tipo de projeto que envolve dados muitas empresas ainda engatinham neste tipo de integração e documentação.

Publicado em Machine learning | Com a tag , , , , , , , , , , | Deixar um comentário