Os números de 2015

Os duendes de estatísticas do WordPress.com prepararam um relatório para o ano de 2015 deste blog.

Aqui está um resumo:

A sala de concertos em Sydney, Opera House tem lugar para 2.700 pessoas. Este blog foi visto por cerca de 59.000 vezes em 2015. Se fosse um show na Opera House, levaria cerca de 22 shows lotados para que muitas pessoas pudessem vê-lo.

Clique aqui para ver o relatório completo

Os números de 2015

Utilização de Random Forests para o problema de compartilhamento de bicicletas em Seattle

Não é mais necessário dizer que o futuro das cidades vai passar pela a análise de dados e principalmente pela a aplicação da inteligência para resolução de problemas dos pagadores de impostos.

Nesse caso específico o problema era que o sistema de trens urbanos de Seattle disponibiliza 500 bicicletas em suas estações e que a oferta dessas bicicletas deve estar ajustada com a demanda de cada estação.

Aqui está o post original, e a abordagem utilizada:

“From clustering, I discovered two distinct ecosystems of bike stations—Seattle, and the University District—based on traffic flows from station to station,” Sadler said. “It turned out that having separate models for each lent itself to much better predictions.”

Sadler modeled hourly supply and hourly demand separately for each of the two ecosystems, summing the result to predict the change in current bike count, based on the current bike count data from the Pronto API. To do this, he used multiple random forest algorithms, each tuned for a specific task.

“Having groups of smaller random forests worked much better than having a single large random forest try to predict everything,” Sadler said. “This is probably due to the different ecosystems having vastly different signals and different types of noise.”

The model—which is actually two models (a random forest for each ecosystem), of which the branches of each are composed of additional random forests—draws from historical demand based on the current season, current hour, and current weekend. It also uses meta information about each station, such as elevation, size, and proximity to other stations. The model leverages this information to discover signals and patterns in ride usage, then predicts based on the signal it finds.

Utilização de Random Forests para o problema de compartilhamento de bicicletas em Seattle

Dismistificando Deep Reinforcement Learning

Um dos tópicos mais quentes em Data Science é a utilização de Deep Learning para problemas ligados à computação visual.

No entanto, nesse post do Nervana uma abordagem que mescla Deep Learning e Reinforcement Learning (Aprendizado por Reforço) é usada para jogar um determinado título no Atari.

Provavelmente esse é o melhor post sobre o assunto, tanto pela a abordagem, quanto pelo grau de profundidade pelo qual o autor trata o assunto.

A ideia geral é que não adianta colocar uma Deep Neural Network para o aprendizado, sendo que em termos combinatórios o espaço de busca é muito grande (1067970  estados pra ser mais preciso).

Dessa forma a abordagem consistiu em combinar Aprendizado por Reforço para formulação da estrutura de recompensa e punição (tanto no curto prazo quanto para ações no longo prazo), cadeia de Markov para modelagem do ambiente/sequências e repetições, e uma abordagem que os autores chamam de Q-Learning.

Q-Learning é explicado pelo autor como:

In Q-learning we define a function Q(s, a) representing the maximum discounted future reward when we perform action a in state s, and continue optimally from that point on.

Screen Shot 2015-12-21 at 11.09.47 AM

The way to think about Q(s, a) is that it is “the best possible score at the end of the game after performing action a in state s“. It is called Q-function, because it represents the “quality” of a certain action in a given state.

Enfim, esse artigo vale a pena para quem quem trabalha com modelagem de problemas não só da computação visual, como também quem trabalha com problemas estruturados.

Dismistificando Deep Reinforcement Learning

Lições em competições do Kaggle

Já é desnecessário dizer o quando o Kaggle vem contribuindo com a comunidade de Data Science, e essas lições do Harasymiv mostram que essas contribuições vão além do básico.

Vejam abaixo:

  • XG Boosting is the engine of choice for structured problems (where feature manufacturing is the key). Now available as python package. Behind XG are the typical suspects – Random Forest and Gradient Boosted Trees. However, hyper parameter tuning is only the few % accuracy points improvement on top, the major breakthroughs in predictive power come from feature manufacturing;
  • Feature manufacturing for structured problems is the key process (or otherwise random permutation of features to find most predictive/telling combination) either by iteratively trying various approaches (as do thousands of individual contributions to Kaggle.com competition) or in an automatic fashion (as done by DataRobot. BTW, DataRobot is based partially in Boston and partially in Ukraine). Some Amazon engineers who attended from Seattle commented they are building a platform which would iteratively try to permute features to randomly (aka “genetic algorithm” fashion) find best features for structured problems, too;
  • For unstructured problems (visuals, text, sound) – Neural Networks run the show (and their deep learning – auto feature extracting – and variants of those). Great example was application of NN to Diabetic Retinopathy problem at Kaggle.com which surpassed in accuracy commercially available products;
  • Kaggle.com is really suitable for two types of problems:
      A problem solved now for which a more accurate solution is highly desirable – any fraction % accuracy turns into millions of $ (e.g. loan default rate prediction) or

    • Problems which were never tackled by machine learning in order to see if ML can help solve them (e.g. EEG readings to predict epilepsy);
  • Don’t expect data scientists to perform best in the office! Anthony mentioned his first successful 24h data science hackathon when his senior was guiding him 5 min, coding himself for 15 min and then playing basketball for 40 min each hour. Personally, I find walking, gardening and running are great creativity boosters. How will you work tomorrow? :)

Lições em competições do Kaggle

O que é ideal no modelo: Acurácia ou Explicabilidade?

Esse post provocador do Inference vem em uma boa hora dado que está um hype bem alto a respeito de Deep Learning, e há muitas dúvidas a respeito do seu poder preditivo, este que muitas vezes flertam com o overfitting mas esse não é o motivo desse post.

O ponto principal que eu gostaria de ressaltar é que de acordo com o autor, em um dos workshops do NIPS sobre Aprendizado Black Box e Inferência, em que o principal ponto dos conferencistas foi que o trade-off entre acurácia e explicabilidade não somente é falso, como a explicabilidade não faz parte da propriedade do modelo.

Para quem não sabe o que é esse trade-off, os autores exemplificam no paper:

  • accurate but black-box: The best classification accuracy is typically achieved by black-box models such as Gaussian processes, neural networks or random forests, or complicated ensembles of all of these. Just look at the kaggle leaderboards. These are called black-box and are often criticised because their inner workings are really hard to understand. They don’t, in general, provide a clear explanation of the reasons they made a certain prediction, they just spit out a probability.
  • white-box but weak: On the other end of the spectrum, models whose predictions are easy to understand and communicate are usually very impoverished in their predictive capacity (linear regression, a single decision tree) or are inflexible and computationally cumbersome (explicit graphical models).

Em outras palavras, os autores argumentam que, o fator de explicabilidade de um modelo é muito mais uma confabulaçcão a posteriori do que funcionou ou não, do que algo que deveria ser uma propriedade do modelo.

Como diria Nassim Taleb em Fooled By Randomness, a mente humana é uma máquina de realizar previsões e contar histórias… A posteriori

Isso é, fazer divagações em relação ao funcionamento de um determinado modelo de acordo com propriedades do mesmo, não faz sentido, na ótica dos autores.

No entanto, o ponto que eu acho que não foi tocado é de que com o crescimento dos modelos cada vez mais black-box como o do Netflix e afins, o principal fator do aprendizado de máquina (Machine Learning) é que de uma maneira ou de outra não conseguimos colocar o aspecto de cognição para ajustar ou mesmo saber o que está dando certo ou errado com o modelo em termos paramétricos e principalmente estruturais.

Não é preciso ir muito longe para ver que esse é um ponto pertinente, basta ver a indústria financeira, em que centenas de bilhões de dólares residem em modelos que muitas vezes os operadores não sabem nem o que está acontecendo.

Os eventos como o Flash Crash de 2010, o fátidico episódio da Knight Capital que perdeu USD 440 milhões em 30 minutos, e do London Whale que custou mais de USD 2 bilhões devido a erros nas estratégias de alguns derivativos mostram que ainda o poder de discernimento e análise do agente humano ainda é necessário para o refinamento do modelo, este que vai muito além da combinação paramétrica; mas que chega a aspectos estruturais do modelo como o todo.

A discussão é boa e ainda não vai parar por aqui.

Link para artigo original: TURNER, Ryan. A Model Explanation System

Paper Turner NIPS 2015

O que é ideal no modelo: Acurácia ou Explicabilidade?

NIPS 2015

Tá certo que estamos no apagar das luzes em 2015, mas segue o link para quem quiser saber o que aconteceu na Neural Information Processing Systems de 2015. 

Em destaque:

Uma pequena descrição do uso do Tensor Flow.

Hardware em Machine Learning (Sim, estamos chegando no próximo limite dos algoritmos e abordagens).

Um ótimo paper sobre aprendizado sob reforço que é tão subestimada.

NIPS 2015

58,484 vezes, OBRIGADO!!!

Com pouco mais de 58,484 page views (até 30 Dez 15 quando esse post está sendo escrito originalmente) esse blog/site bateu o seu próprio record de page views!

Captura de Tela 2015-12-30 às 08.51.30

O que começou como um clipping para colocar o assunto na comunidade de computação, já que no Brasil quase não tinha nada sobre o tema (N.A. justiça seja feita: os melhores (e únicos) materiais sempre foram da professora Sandra de Amo); virou um site com muitos recursos; estes que vão desde o que está acontecendo ao redor do mundo de Data Mining, Machine Learning, Estatística e Análise de Dados; até posts mais técnicos/hands-on.

E o resultado disso (que não seria possível sem o carinho de todos os leitores) é que chegamos na primeira página do Google pela primeira vez!!!

Captura de Tela 2015-12-30 às 08.53.15

Sem patrocínio.

Sem mídia.

Nadando contra a corrente de desinformação e desinteligência que faz com que pessoas ricas como o Elon Musk ou inteligentes como o Stephen Hawking difundam o Bullshit sobre IA (não acredita? clique aqui e nessa carta que dá até um pouco de vergonha alheia pelo fato de ser tão óbvia.

Então o que eu posso dizer é o meu MUITO OBRIGADO e vamos rumo para os 70.000 page views em 2016!

Forte abraço,

Flávio Clésio

58,484 vezes, OBRIGADO!!!

Investindo em Inteligencia Artificial (E claro em Machine Learning)

Um dos tópicos mais quentes do momento é o alto grau de investimento em que muitas empresas/Venture Caps. estão investindo em AI, principalmente depois de todo o Hype por causa do OpenAI do Elon Musk

Esse artigo é um bom guia para quem deseja empreender nesse sentido. 

Investindo em Inteligencia Artificial (E claro em Machine Learning)

Uma explicação sobre as Deep Neural Decision Forests

Muito do hype que está sendo feito sobre a Deep Learning se dá através de problemas de computação visual.

Contudo, uma abordagem que faz uma mistura entre Deep Learning com Decision Trees (na verdade eles chamam de forests dado que é aplicado o mesmo paradigma das Random Forests) ao menos no paper no link se mostra bem robusta e aplicável à problemas estruturados de Machine Learning (a.k.a. problemas em que os dados estão modelados de forma transacional ou relacionado).

A ideia principal é que no final da camada de ativação de uma rede neural (que pode ser deep ou não) haja um direcionamento do output (ou do objeto a ser predito) para um determinado lado da árvore.

dndf-forest

Isso não só abre um espaço gigante para problemas de multi-classificação, mas também uma possibilidade de tratar modelos com um grau de latência maior (i.e. que não precisem de atualizações constantes) com uma forma mais robusta de decisão ao longo de toda a cadeia de predição.

Uma explicação sobre as Deep Neural Decision Forests

Previsão do número de homicídios no Rio de Janeiro (Sim, eu voltei a postar!!!)

Um pequeno disclaimer: Depois de muito relutar, estou voltando com as atividades do blog. Isso significa de maneira prática, que apesar do clipping ser o grande driver dos acessos, sinto que há uma lacuna em relação a posts técnicos aqui na blogosfera brasileira.

Dessa forma, vou fazer mais posts técnicos com assuntos ligados à Machine Learning, Data Mining e afins.

Disclaimer feito, bora pro post original.

*******

Fala pessoal, tudo bem?

Um dos principais problemas em utilizar processadores numéricos como o Excel ou mesmo o LibreOffice é que se perde um pouco a flexibilidade de parametrizar os modelos de previsão.

Além disso, há um problema grave nesses processadores de reprodutibilidade, dado que pode haver inúmeras versões, planilhas voando pra todo o lado via e-mail, e por aí vai.

Nesse post eu vou utilizar dados reais da quantidade de homicídios que houveram no Rio de Janeiro de 1991 até 2011.

Os dados foram extraídos e consolidados pelo CESeC – Centro de Estudos de Segurança e Cidadania e o link está no final do script.

Antes de mais nada, vamos carregar o package Forecast:

# Load library
if(!require(forecast)){
 install.packages("forecast")
 library(forecast)
}

Depois disso, vamos realizar a carga dos dados. Nesse caso eu fiz uma transformação na planilha original e passei os dados para csv.

# Dataset
rj_murder <- read.csv("https://raw.githubusercontent.com/fclesio/learning-space/master/Datasets/rj-homicidios-1991-2011.csv")

Vamos dar uma olhada nos dados para nos certificar que tudo está OK.

# Check data
head(rj_murder)

Com os dados OK, para incluir um conjunto de dados no package de Forecast e ARIMA, temos que antes de mais nada, pegar todos os datapoints e construir uma série através de um objeto de timeseries como no bloco de código abaixo:

# Transform in time series dataset all metrics inside the dataset 
rj_murder_total <- ts(rj_murder$total, start=c(1991, 1), end=c(2011, 12), frequency=12)
rj_murder_capital <- ts(rj_murder$capital, start=c(1991, 1), end=c(2011, 12), frequency=12)
rj_murder_baixada <- ts(rj_murder$baixada, start=c(1991, 1), end=c(2011, 12), frequency=12)
rj_murder_interior <- ts(rj_murder$interior, start=c(1991, 1), end=c(2011, 12), frequency=12)

Para entendermos o que aconteceu, vamos destrinchar erssa função TS:

ts() função para a construção de série temporal

rj_murder$total conjunto de datapoints do dataframe da coluna total

start=c(1991, 1) início da série é janeiro de 1991

end=c(2011, 12) o fim da série é dezebro de 2011

frequency=12 como estamos falando de dados mensais, a frequencia da série é de 12 datapoints por ano

Agora que entendemos o que fizemos, vamos dar uma olhada nos nossos objetos ts() e ver se os mesmos estão corretos.

#Plot series
par(mfrow=c(2,2))

plot(rj_murder_total
 ,main = "Total de Homicidios no RJ de 1991-2011"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
 )


plot(rj_murder_capital
 ,main = "Total de Homicidios no RJ de 1991-2011 (Capital)"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
)


plot(rj_murder_baixada
 ,main = "Total de Homicidios no RJ de 1991-2011 (Baixada)"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
)


plot(rj_murder_interior
 ,main = "Total de Homicidios no RJ de 1991-2011 (Interior)"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
)

 

Homicidios RJ

 

Agora que vimos que as nossas séries estão corretas, vamos criar alguns objetos usando a função auto.arima().

# Fit ARIMA models
fit_rj_murder_total <- auto.arima(rj_murder_total)
fit_rj_murder_capital <- auto.arima(rj_murder_capital) 
fit_rj_murder_baixada <- auto.arima(rj_murder_baixada)
fit_rj_murder_interior <- auto.arima(rj_murder_interior)

Essa função retorna o melhor modelo ARIMA de acordo com os valores de AIC, AICc e BIC.

Mas deixando um pouco a teoria de lado, vamos ver como ficaram os ajustes dos modelos ARIMA de acordo com cada uma das séries.

#Plot ARIMA Models
par(mfrow=c(2,2))
plot(forecast(fit_rj_murder_total,h=12)
 ,main = "Total de Homicidios no RJ de 1991-2011 \n Previsão usando ARIMA"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5)

plot(forecast(fit_rj_murder_capital,h=12)
 ,main = "Total de Homicidios no RJ de 91-2011 (Capital) \n Previsão usando ARIMA"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5)

plot(forecast(fit_rj_murder_baixada,h=12)
 ,main = "Total de Homicidios no RJ de 91-2011 (Baixada) \n Previsão usando ARIMA"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5)

plot(forecast(fit_rj_murder_interior,h=12)
 ,main = "Total de Homicidios no RJ de 91-2011 (Interior) \n Previsão usando ARIMA"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5)

 

ARIMA

 

Um bom resultado, mas agora vamos ver o que conseguimos fazer usando o package forecast default, com o horizonte de previsão de 12 meses:

#Forecasting using confidence intervals in 80%, 95% and 99% with 12 months ahead
ahead_rj_murder_total <- forecast(rj_murder_total, level=c(80, 95, 99), h=12)
ahead_rj_murder_capital <- forecast(rj_murder_capital, level=c(80, 95, 99), h=12)
ahead_rj_murder_interior <- forecast(rj_murder_interior, level=c(80, 95, 99), h=12)
ahead_rj_murder_baixada <- forecast(rj_murder_baixada, level=c(80, 95, 99), h=12)

Modelos ajustados, vamos plotar os resultados:

#Plot forecasting
par(mfrow=c(2,2))
plot(ahead_rj_murder_total
 ,main = "Total de Homicidios no RJ de 91-2011 (Total) \n Previsão usando Forecast package"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
 ,shadecols="oldstyle")

plot(ahead_rj_murder_capital
 ,main = "Total de Homicidios no RJ de 91-2011 (Capital) \n Previsão usando Forecast package"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
 ,shadecols="oldstyle")

plot(ahead_rj_murder_baixada
 ,main = "Total de Homicidios no RJ de 91-2011 (Baixada) \n Previsão usando Forecast package"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
 ,shadecols="oldstyle")

plot(ahead_rj_murder_interior
 ,main = "Total de Homicidios no RJ de 91-2011 (Interior) \n Previsão usando Forecast package"
 ,xlab = "Ano"
 ,ylab = "Qtde Homicidios"
 ,type = "l"
 ,lwd = 2.5
 ,shadecols="oldstyle")

Forecast Package Predictions

Podemos ver que tanto usando o modelo ARIMA quanto com o uso do package forecast vimos que haverá uma queda no número de homicídios. Com isso podem ser elaboradas (usando mais dados) políticas públicas de segurança.

Refs:

[1] – http://www.inside-r.org/packages/cran/forecast/docs/auto.arima

[2] – http://www.ucamcesec.com.br/wordpress/wp-content/uploads/2011/04/RJ_2011_evolucao.xls

[3] – http://www.statmethods.net/advstats/timeseries.html

 

Previsão do número de homicídios no Rio de Janeiro (Sim, eu voltei a postar!!!)

O que é Deep Learning?

Direto de O’Reily

So, what is deep learning?

It’s a term that covers a particular approach to building and training neural networks. Neural networks have been around since the 1950s, and like nuclear fusion, they’ve been an incredibly promising laboratory idea whose practical deployment has been beset by constant delays. I’ll go into the details of how neural networks work a bit later, but for now you can think of them as decision-making black boxes. They take an array of numbers (that can represent pixels, audio waveforms, or words), run a series of functions on that array, and output one or more numbers as outputs. The outputs are usually a prediction of some properties you’re trying to guess from the input, for example whether or not an image is a picture of a cat.

The functions that are run inside the black box are controlled by the memory of the neural network, arrays of numbers known as weights that define how the inputs are combined and recombined to produce the results. Dealing with real-world problems like cat-detection requires very complex functions, which mean these arrays are very large, containing around 60 million numbers in the case of one of the recent computer vision networks. The biggest obstacle to using neural networks has been figuring out how to set all these massive arrays to values that will do a good job transforming the input signals into output predictions.

 

O que é Deep Learning?

Paper Ensemble methods for uplift modeling

Esse paper sobre a aplicação de métodos ensemble especificamente em modelagem uplift, é um ótimo guia de como técnicas não são canônicas em termos de resolução de problemas.

Abstract: Uplift modeling is a branch of machine learning which aims at predicting the causal effect of an action such as a marketing campaign or a medical treatment on a given individual by taking into account responses in a treatment group, containing individuals subject to the action, and a control group serving as a background. The resulting model can then be used to select individuals for whom the action will be most profitable. This paper analyzes the use of ensemble methods: bagging and random forests in uplift modeling. We perform an extensive experimental evaluation to demonstrate that the application of those methods often results in spectacular gains in model performance, turning almost useless single models into highly capable uplift ensembles. The gains are much larger than those achieved in case of standard classifi- cation. We show that those gains are a result of high ensemble diversity, which in turn is a result of the differences between class probabilities in the treatment and control groups being harder to model than the class probabilities themselves. The feature of uplift modeling which makes it difficult thus also makes it amenable to the application of ensemble methods. As a result, bagging and random forests emerge from our evaluation as key tools in the uplift modeling toolbox.

Ensemble methods for uplift modeling

Paper Ensemble methods for uplift modeling