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.