Machine Learning – Dividir amostra em treino e teste

No exemplo do post anterior (em que falamos sobre Naive Bayes e você pode ler aqui) usamos todos os dados para treinar o algoritmo, mas será que o algoritmo não ficou viciado e acabou aprendendo a prever apenas dados parecidos com aqueles que usou para ser treinado?

Na prática, normalmente dividimos os dados históricos em 70% para treino e 30% para teste.

Não é necessariamente 70% e 30%, pode ser 90% e 10% ou o que você achar mais adequado dependendo da quantidade de dados que possui e dos requisitos de negócio.

Abordagem simples

Vamos ver um exemplo simples de como fazer isso:

from sklearn.naive_bayes import MultinomialNB

dados = [[1, 50, 1], [0, 1, 0], [0, 60, 1], [0, 100, 1], [1, 70, 0], [0, 3, 1], [1, 1, 0], [1, 200, 1], [0, 2, 1], [1, 1, 1]]
resultados = [1, 0, 1, 1, 1, 0, 0, 1, 1, 1]

clf = MultinomialNB()

treino_dados = dados [:7] # primeiras 7 linhas
treino_resultados = resultados [:7] 
teste_dados = dados [-3:] # ultimas 3 linhas
teste_resultados = resultados [-3:]
clf.fit (treino_dados, treino_resultados) # usamos 70% dos dados para treinar
previsao = clf.predict (teste_dados) # prevemos o resultado dos 30% restantes

print(previsao) # exibe 1, 0, 0 
print(teste_resultados) # exibe 1, 1, 1

Nas linhas 3 e 4 inicializamos arrays com nosso dados (features) e resultados (labels).

Nas linhas 8 e 9 salvamos as 7 primeiras linhas do array (70% dos dados) em novos arrays que chamamos de dados de treino e resultados de treino.

Nas linhas 10 e 11 salvamos as 3 últimas linhas do array (os 30% restante dos dados) em novos arrays que chamamos de dados de teste e resultados de teste.

Na linha 12 treinamos o modelo usando apenas os arrays de TREINO, ou seja, 70% dos dados.

Na linha 13 prevemos um resultado novo usando apenas os 30% restante dos dados.

Na linha 15 exibimos o resultado previsto (1, 0, 0), enquanto na linha 16 exibimos o resultado esperado dos 30% dos dados (1, 1, 1). Assim podemos validar se nosso modelo tende a acertar ou errar os dados quando colocarmos em produção.

Resultado previsto = 1, 0, 0

Resultado esperado = 1, 1, 1

1 ACERTO

No nosso caso, eles acabaram sendo diferentes, ou seja, os 70% de dados não foram capazes de treinar o algoritmo suficientemente bem, são necessários mais dados.

Abordagem mais inteligente

Uma outra forma de dividir os dados segue abaixo, usando a função train_test_split. Essa forma é um pouco mais inteligente, pois leva em consideração as diferentes características dos dados, tentando não dividi-los randomicamente, mas de forma igualitária levando em consideração suas características.

from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split

dados = [[1, 50, 1], [0, 1, 0], [0, 60, 1], [0, 100, 1], [1, 70, 0], [0, 3, 1], [1, 1, 0], [1, 200, 1], [0, 2, 1], [1, 1, 1]]
resultados = [1, 0, 1, 1, 1, 0, 0, 1, 1, 1]

clf = MultinomialNB()

treino_dados, teste_dados, treino_resultados, teste_resultados = train_test_split(dados, resultados) # 75% para treino e 25% para teste

clf.fit (treino_dados, treino_resultados)
pred = clf.predict (teste_dados)

print(pred) # exibe 1, 1, 0
print(teste_resultados) # exibe 1, 0, 0

Na linha 2 importamos a função train_test_split e a usamos na linha 9 passando os arrays com todos os dados históricos. A própria função divide os dados em 75% para treino e 25% para teste, embora isso possa ser alterado via parâmetro [1].

Resultado previsto = 1, 1, 0

Resultado esperado = 1, 0, 0

2 ACERTOS

Especificamente no nosso caso, os resultados previstos se aproximaram dos resultados de teste originais. Se você mandar imprimir as variáveis treino_dados do primeiro exemplo e do segundo, você verá que os dados considerados para treino são diferentes.

Conclusão

Antes de aplicar algoritmos de Machine Learning a qualquer problema de negócio, é necessário sempre dividir os dados históricos nestes 2 grupos: treino e teste. Assim, treinamos o algoritmo com um grande volume de dados de treino; depois validamos o resultado deste algoritmo com os dados de teste; e só então poderemos colocar nosso algoritmo em produção, com confiança de que ele realmente consegue prever dados reais.

Mas, em um cenário real, teremos muito mais dados do que nestes exemplos e não faz sentido ficar digitando-os a cada nova execução. Quer aprender a ler os dados direto de um arquivo CSV? Fique ligado no próximo post.

 

Referência

[1] http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Por RONALDO CHICARELI

Arquiteto de software e também apaixonado por novas culturas e idiomas, pois a vida é muito curta pra ser vivida em um só lugar.

Postado em: 05 de dezembro de 2017

Confira outros artigos do nosso blog

Machine Learning – Naive Bayes

17 de novembro de 2017

Ronaldo Chicareli

Machine Learning – O que é?

06 de novembro de 2017

Ronaldo Chicareli

MATERA Systems disponibiliza suas API’s para parceiros desenvolverem soluções de pagamentos com uso de IoT e Inteligência Artificial

07 de junho de 2017

Pedro Farci

MATERA demonstra plataforma omnichannel de serviços financeiros integrada a soluções de IoT e Inteligência Artificial

07 de junho de 2017

Pedro Farci

Deixe seu comentário