Primeiras aulas do curso Machine Learning: Classificação por trás dos panos

Machine Learning: Classificação por trás dos panos

Classificando e-mails, animais e muito mais - Introdução

Nesta aula, iremos falar de diversos problemas que nós podemos resolver com machine learning, com inteligência artificial, aprendizagem de máquina... Todas essas palavras bonitas que estão de alguma maneira ligadas com soluções para resolver problemas um pouco mais difíceis no nosso dia-a-dia. Vamos dar uma olhada que tipo de problema a gente pode resolver? Principalmente os primeiros que resolveremos logo no primeiro capítulo do curso. Veremos então, 3 problemas que podemos resolver logo no primeiro capítulo.

Recebi e-mails hoje de manhã, recebi vários e-mails, não sei dizer quantos e-mails você recebe, eu recebo diversos, você provavelmente também recebe diversos e nem percebe, por que você não percebe? Repare todos esses e-mails que eu recebi:

Tem e-mail que parece que não fui eu que pedi para receber, por exemplo, Se Compran Cheques? E-mail em espanhol? Sendo que eu nem sei falar em espanhol. The Best Design Hotels in Paris? E-mail francês? Realmente, estou aprendendo e por isso assinei um lugar e outro, então tudo bem... Mas e Casas Bahia? Não assinei e-mails da Casas Bahia, ela mandou sem eu pedir... Então repara que tem um monte de e-mail aqui que parece ser spam. A quantidade de spam que vai de um lado para o outro na internet hoje em dia é absurda e, de alguma maneira, alguém precisa classificar esses e-mails e dizer:

-Olha, isso aqui é spam.

-Esse e-mail aqui é spam!

Tem que ter alguém na internet fazendo isso, porque se esse alguém for eu, e eu tiver que olhar os 1000 e-mails que eu recebo pra dizer que desses 1000 e-mails, 990 são spam a minha vida acaba! E eu não quero que a minha vida acabe e você também não! A gente quer viver alegremente com o tempo para outras coisas e não passar o dia inteiro com a nossa vida só lá: "É spam. Não é spam. É spam. Não é spam...". Queremos que alguém faça por nós: "Por favor, diga pra mim se isso aí é spam ou se não é spam". E esse alguém pode ser uma pessoa! Eu posso contratar uma pessoa pra ficar falando: "Olha, isso aqui é spam", ou não: "Esse aqui não é spam". E nós pagamos essa pessoa e ela fica fazendo isso o dia inteiro... Parece trabalhoso e complicado, pode até ter soluções desse gênero para fazer uma classificação, faz sentido...

Uma outra maneira é eu falar para um programa fazer isso pra mim, falar: "O programa, por favor, classifica esse meu e-mail, se ele é spam e se ele não é spam". Mas um programa, um computador, ele sabe o que é um spam? A gente sabe o que é spam, se eu falar pra você assim:

-Olha, recebi um spam hoje

-Puts, o cara recebeu um spam...

Nós sabemos o que significa spam, aquele e-mail indesejado que eu não pedi pra receber e alguém me enviou... Esse é o significado da palavra spam. Nós sabemos, mas o computador não faz a mínima ideia o que significa a palavra spam. Então o que a gente precisa? Precisamos, de alguma maneira, dizer para o computador o que é spam e o que não é spam. Mas nem a palavra spam ele conhece, então como podemos fazer isso? Como é mesmo que o computador conhece? O computador entende apenas 0 ou 1, 0, 1, 2, 3, 4, 5... Binários, numérico etc... Lembra aquele curso onde aprendemos programação? O básico, onde vimos sobre binário. Se você não viu tem o curso de introdução a programação com Ruby que a gente fala do binário...

Então você viu lá a questão que ele só entende 0, 1, 2, 3, 4 e etc... Se ele só entende esses números o que eu vou falar para o computador é que ele me diga que se for spam é 1, me diz 1 se ele for spam! Se ele não for spam me diz 0, pronto! Já resolvi o problema da palavra spam a palavra spam já não existe mais para o computador, eu consigo falar para o computador assim: "E aí, é 0 ou é 1?". Já é bem melhor, certo? Já simplifiquei para o computador me entender, pois se eu explicar para o computador o que é spam eu estarei maluco, mas se explicar para o computador o que é 0 ou 1 ele já sabe! Só preciso falar pra ele: "Olha, esse e-mail 'Facturas Impagas' ele é 1 ou é 0?". Isso é, eu preciso agora passar por cada um desses e-mails, olhar e falar: "Todas "impagas" (spam) é 1", ou seja, eu preciso ensinar o computador, treinar ele! Como é que vocês sabem se esse e-mail é spam ou não? Porque você foi treinado! Você já viu um milhão de e-mails que eram spam e que não eram spam, quando você já bate o olho você fala: "É spam", você bate o olho mais uma vez e fala: "Não é spam". Mas como você bate o olho e fala se é spam ou e não é spam? Você foi treinado pra isso, você já viu tanto, você já fez tanto essa classificação: "spam", "Não spam","spam", "Não spam","spam", "Não spam" que hoje você faz isso facilmente. Então a mesma coisa aqui:

Enfim, existe um monte de e-mail aqui que é spam e um monte que não é. Eu batendo o olho já sei dizer se é spam ou não e a mesma coisa eu consigo treinar o computador, treinar um programa, isso mesmo, treino um programa, para dizer se é spam 1, se não é spam 0. Mas como que eu treino? Eu dou um conjunto de e-mails que não é spam e um conjunto de e-mails que é spam e falo pra ele: "Ta aí, aprenda!". Aí ele aprende da mesma forma que aprendemos, você aprendeu a dizer se é spam ou não, eu também aprendi, ele também vai aprender a dizer, e o que vai acontecer? Quando chegar um e-mail novo o que ele faz? Ele olha esse e-mail e fala: "É spam.". Aí ele olha outro e-mail e fala: "Não é spam.". E é assim que funciona um programa de classificação, ele classifica entre 0 ou 1. Ele responde qualquer pergunta do gênero que vai classificar alguma coisa entre 0 e 1, o que quer dizer 0? O que quer dizer 1? No meu caso quer dizer se é spam ou não, poderia querer dizer outra coisa? Com certeza! Podemos usar a classificação entre 0 e 1 pra diversas coisas e como eu falei, só no primeiro capítulo desse curso veremos a classificação de 0 e 1 e, também, como poderemos utilizar isso em diversas coisas, primeiro foi esse caso do e-mail, classificar entre spam ou não, é classificar entre 1 ou 0, reduzimos o problema para classificar entre 1 ou 0 e ensinamos o programa a classificar entre 1 ou 0.

Classificando e-mails, animais e muito mais - Classificação entre 1 e 0

Classificamos elementos entre spam e não spam, entre 1 ou 0, independente do que signifique 1 ou 0. Vamos ver outros exemplos do dia-a-dia onde usamos a classificação? Vou dar um exemplo do dia-a-dia humano para que possamos entender e visualizar o nosso cotidiano, ou seja, como nós, seres humanos, fazemos a classificação. Como é que eu vou poder implementar um algoritmo se eu não entendo nem como eu faço uma coisa, "Ah! Quero implementar um algoritmo de soma". Ok, como fazemos a soma? "Quero implementar um algoritmo de multiplicação". Certo, como eu faço a multiplicação? Então eu quero implementar um algoritmo que diz se é spam ou não é spam se um cliente vai comprar ou se não vai comprar, se um funcionário vai se demitir ou se não vai se demitir, eu preciso saber como eu faço isso! Isto é, como eu, Guilherme, classifico isso. Então vamos pegar um exemplo do dia-a-dia, um exemplo em que eu estou andando na rua, olho para alguma coisa, vejo e classifico, e então implementamos um algoritmo similar a essa classificação. Na prática, é isso mesmo que fazemos. Vamos lá?

Queremos classificar entre 1 ou 0. No meu dia-a-dia, quando eu era criança ia na fazenda de um tio meu no interior de Minas e ele tinha diversos animais e às vezes eu encontrava um animal como este:

Que animal é esse? Bom, você acabou de classificar, eu classifico esse animal como um porco, tudo bem? Por que eu classifico ele como um porco? Olha a perninha dele, é perninha de porco, perninha curtinha... O que mais? Ele é meio gordinho, porquinho é gordinho... o que mais? Ele faz "oinc, oinc", então, pra mim, ele é um porquinho. Por essas 3 características eu classifico ele como um porco, eu dou uma olhada nessas 3, vejo se ele se encaixa e aí falo: "Sim, Ele é um porco!". Mas também numa fazenda, como é de costume, tem diversos outros animais, e às vezes eu encontrava um animal como este:

Então eu me pergunto, no momento que estou andando, eu olho para ele e falo: "Nossa que porquinho bonito e fofinho!"? Não! Quando eu olho pra ele eu falo: "Nossa, que cachorrinho bonitinho". Por que eu falava "que cachorrinho bonitinho"? Porque na minha cabeça ocorreu o processo de classificação, quando eu olhava os porquinhos eu falava: "Nossa que porquinho bonitinho". Quando eu olhada os cachorrinhos eu falava: "Nossa, que cachorrinho bonitinho". Por quê? Pois quando eu olhava o cachorrinho, eu pensava:

Será que ele tem perninha curtinha que nem o porquinho?. Não.

Será que ele é gordinho que nem o porquinho? Alguns sim e outros não.

Ele faz oinc que nem o porquinho? Eles não faziam oinc.

Então ele não é um porquinho, ele é um cachorrinho.

Então repare que, de acordo com essas 3 características que eu citei pra vocês, se é com perninha curtinha, se ele faz oinc ou se ele é gordinho eu classifico entre porquinho e cachorrinho. É como eu faço, e é óbvio que cada um faz de uma maneira um pouco diferente, usam algumas características um pouco diferentes umas das outras... e você tem classificações diferentes, natural, isso acontece. Eu vou seguir essa classificação minha como exemplo, ou seja, a classificação que eu faço na minha cabeça, como ser humano, e então, vou querer ensinar o computador a fazer essa classificação. Vamos lá!

Eu tenho aqui fotos de vários animais:

E eu quero saber se eles têm perna curta ou não, se eles são gordinhos ou não, se eles fazem oinc ou não e eu quero dizer se eles são porquinhos ou se eles são cachorrinhos, eu vou usar 1 para dizer se é um porquinho e vou usar 0 para dizer se é cachorrinho. Então vamos preencher essa tabela?

Vejamos esse primeiro animal:

Ele tem perna curta? Sim, então 1. Ele era gordinho e fazia oinc, estou falando do porquinho lá da fazenda, então ele é um porquinho. Então essa linha fica [1,1,1,1]. Vejamos o próximo animal:

Esse outro porquinho também tem perna curta, mas ele não era gordinho, ele era um porquinho mais magrinho, então eu vou colocar 0 para dizer que ele era mais magrinho. Ele fazia oinc? Sim, ele fazia oinc e ele era um porquinho então 1. Nossa linha fica [1,0,1,1]. Vamos verificar o próximo:

Esse outro porquinho tinha a perna curta, verdade, ele era gordinho, só que tem um porém, ele nasceu com um negócio na gartanta que ele não fazia oinc e nem fazia barulho e ficava de boa, então vou marcar com 0. Porém, quando eu olhava pra ele eu falava: "Você é um porquinho.". Então vamos marcar como porquinho, tá? A linha fica [1,1,0,1]. Vamos dar uma olhada como está a nossa tabela atualmente:

Perceba que, para cada elemento da tabela, estou pegando as características deles, ou seja, se tem perna curta, se é gordinho ou se faz oinc, dizendo apenas se sim ou se não usando apenas 1 e 0 para sim (1) ou não (0) e dizendo no final qual é o tipo de animal, se é porco (1) se é cachorro (0). Ainda faltam mais 3 animais para analisarmos, vamos lá!

Esse aqui tem perna curta? Esse cachorro não tinha perna curta, então 0. Ele também não era gordinho e ele também não fazia oinc e ele era, adivinha? Um cachorrinho, sim, porque eu olhava pra ele e era um cachorro. Então a nossa linha fica [0,0,0,0]. Agora o próximo animal:

Já esse outro era divertido, ele era um Yorkshire pequenininho e tinha a perna curta, só que também ele era gordinho e o mais engraçado é que quando ele ia fazer au au, ou seja, latir, ele fazia oinc oinc! Então eu vou marcar que ele fazia oinc oinc, tudo bem? Só que, repara, ele era um cachorro. Apesar dele ter as 3 características parecidas com o de um porco, eu olhava pra ele e falava: "Opa! Esse aqui é um cachorro". Então a essa linha fica com esses valores [1,1,1,0]. Vamos para o último:

Esse daqui não tinha perna curta, também não era gordinho e também não fazia oinc oinc. Ele era um cachorrinho mesmo, eu sei dizer isso. Então marcamos assim [0,0,0,0]

O que eu estou fazendo? Eu estou pegando todos os dados dos meus elementos, isto é, desses meus animais e estou montando uma tabela, veja como ela ficou:

Essa tabela define as características dos animais por meio dessas 3 primeiras colunas (perna curta, gordinho, faz oinc) e essa última coluna (o que é) classifica o animal, ele é cachorro ou ele é porco? Então eu estou usando as características para classificar um animal entre dois tipos. Eu poderia usar essas características ou outras para classificar um e-mail entre spam e não spam, por exemplo:

Essas são algumas características que eu posso usar para classificar algo.

No meu dia-a-dia, lá na fazenda do meu tio, eu usava essas 3 características para classificar os animais, porém, eu poderia usar outras também:

A cor influencia para eu dizer se ele é um animal ou outro, pois tem animais de uma cor e animais de outra cor. Existem diversas características que a gente pode usar para classificar um animal. Aqui eu usei 3 características pra classificar os meus animais. Então repara que todos os problemas de classificação vão fazer isso: dado um conjunto de características e um monte de dados para eu treinar esse meu algoritmo, esse meu programa. Essa tabela de características é o meu treino, então eu falo para o meu programa: "Olha, essa tabela eu já sei, toma pra você". E também, mando a classificação: "Toma aqui, também, a classificação". E o programa fica todo feliz que ele foi treinado. Agora que o programa está treinado por essas imagens ele está feliz, o que acontece? Eu pergunto para ele, assim como eu posso perguntar para mim mesmo: "E esse aqui? Quem é ele?":

Ele é um cachorro (0) ou ele é um porco (1)? E aí, eu ou programa tomamos uma decisão baseados em toda experiência anterior que tivemos, baseados em toda experiência anterior que o programa teve, todo treino que já foi feito, ele vai olhar as características desse animal e vai tomar a decisão se ele é um porco ou se ele é um cachorro isto é, esse animal especificamente, tem perna curta? sim (1), esse animal é gordinho? Sim (1), ele faz oinc? ele não faz oinc (0), pois isso aqui é uma imagem, ele não é um animal de verdade... Então ele não fazia oinc, tudo bem? Então a pergunta se resume a quê? Dadas essas características, por favor, Guilherme, por favor, você, por favor programa, me diga se o resultado é 0 ou 1, isso significa que, eu treinei você com diversas características e classificações e, se eu te der uma linha de característica, eu quero que você me diga se ele é 0 ou 1, ou seja, eu quero que você preveja, classifique pra mim! Então dada essas características me diga se ele é um cachorro ou um pouco. E é assim que vai funcionar os programas de classificação: Nós treinamos por meio de características e classificações e treina. Após treinar, pedimos para ele classificar coisas que nós desconhecemos, como por exemplo, chegou um e-mail novo: "E aí, esse e-mail é um spam ou não é?, chegou um animal novo: "E aí, esse animal eu vou vender como porco ou como cachorro?", ou: "Vou fazer carinho como porco ou como cachorro? O que ele é?". Resumindo, os algoritmos serão baseados em características e iremos usar essas características entre 0 e 1, é claro que veremos outros tipos depois, para classificar se ele é ou não é um animal que esperamos, é exatamente isso que faremos com os algoritmos.

Classificando e-mails, animais e muito mais - Começando com o código

Vamos para o código. O que queremos aqui é implementar um sistema de classificação que consiga classificar alguma coisa entre 0 e 1, -1 e 1, 1 e 2, A e B, entre duas categorias diferentes! Eu tenho duas categorias, se é porco ou se é cachorro, eu quero classificá-las. Pra isso usaremos Python e instalaremos nele o pip, que é o instalador simples de pacotes. Vá até a página de instalação do pip e clique em get-pip.py:

Ele vai abrir o arquivo na página atual, salve em um diretório de fácil acesso via terminal. A seguir, no terminal, entre no diretório que você salvou o arquivo e digite o comando:

> python get-pip.py

Caso você esteja no linux será necessário utilizar o sudo para permissão de super usuário.

Pronto! O pip foi instalado. Na própria página de instalação existem outras alternativas de instalação, como por exemplo, no Ubuntu, podemos utilizar um package manager como o apt-get. Utilizamos o método demonstrado, pois funciona em qualquer sistema operacional!

Agora que nós temos o pip, podemos instalar as bibliotecas do python de nosso interesse para trabalhar com as informações científicas que queremos, como por exemplo, o machine learning e a classificação. A biblioteca que usaremos é o scikit-learn. Então vamos pedir para o pip instalar para nós por meio do comando:

> pip install scikit-learn

Da mesma forma que aconteceu na instalação do pip, caso esteja no Linux, será necessário utilizar o sudo.

Se você estiver utilizando Python3 pode ser necessário instalar outras duas bibliotecas. A NumPy e a SciPy

Para instalá-las, podemos utilizar o pip, só que como estamos utilizando o Python3, temos que utilizar a versão 3 do pip (pip3)

pip3 install numpy scipy

Bacana, instalei a biblioteca do python, o scikit-learn. Além da biblioteca, nós temos acesso à documentação para consultarmos tudo o que ela disponibiliza para nós. O que queremos fazer, a princípio, é a classificação entre diversos porcos e cachorros, depois iremos fazer do nosso mundo web. Então, abriremos um editor de texto para escrevermos o nosso código python. Utilize um de sua preferência.

Primeiro vamos criar um arquivo chamado classificao.py e vamos salvá-lo, lembre-se de salvar o arquivo dentro de um diretório de fácil acesso ao terminal. E nesse arquivo iremos definir todos os porcos e cachorros que já conhecemos, por exemplo, nós queremos representar o nosso primeiro porquinho, então escrevemos:

porco1

E o que era esse porquinho? Ele era um array de 3 valores, você lembra? Quais são os valores? 0 ou 1, ou seja, se ele tem ou não tem uma característica. Mas, e quais são as 3 características que eu, Guilherme, decidi usar agora?

1 - Se ele é gordinho. 2 - Se ele tem perninha curta. 3 - Se ele faz auau.

Então vamos lá, ele é gordinho? Sim, ele é gordinho:

porco1 = [1]

Ele tem perninha curta? Sim, ele tem perninha curta:

porco1 = [1, 1]

Esse porquinho faz auau? Não, ele não faz auau:

porco1 = [1, 1, 0]

Perceba que eu mudei, agora estou modelando o meu sistema de uma maneira diferente, estou modelando ele de qual maneira? Estamos dizendo que:

[1, 1, 0] -> [tem perna curta, é gordinho, não faz *auau*]

Agora eu vou colocar o meu segundo porco. Esse porquinho também é gordinho, também tem perna curta e também não faz auau:

porco1 = [1, 1, 0]
porco2 = [1, 1, 0]

Por fim eu vou representar o meu terceiro porquinho que também é gordinho, tem perna curta e também não faz auau:

porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]

Cadastrei os 3 porquinhos, agora eu preciso cadastrar 3 cachorros que eu já conheço. O primeiro cachorro ele é gordinho, ele tem perninha curta e ele faz auau:

porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro1 = [1, 1, 1]

Os outros 2 cachorros não são gordinhos, tem perninhas curtas e fazem auau:

porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro1 = [1, 1, 1]
cachorro2 = [0, 1, 1]
cachorro3 = [0, 1, 1]

Esses são os 6 elementos que eu, Guilherme, conheço. Então vamos comentar o que cada uma dessas posições se refere, você lembra?

# [é gordinho?, tem perninha curta?, faz auau?]
porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro1 = [1, 1, 1]
cachorro2 = [0, 1, 1]
cachorro3 = [0, 1, 1]

Dentre esses 6 elementos já sabemos que do primeiro ao terceiro são porquinhos e que do quarto até o sexto são cachorros. A grande sacada é dizer o que já sabemos o que eles são, ou seja, dizer se eles são 1 ou 0, se são 1 ou -1, se é cachorro ou porco... Eu posso escolher o que eu quiser. Precisamos de todos esses elementos, e chamaremos todos eles de dados:

# [é gordinho?, tem perninha curta?, faz auau?]
porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro1 = [1, 1, 1]
cachorro2 = [0, 1, 1]
cachorro3 = [0, 1, 1]

dados = [porco1, porco2, porco3, 
cachorro1, cachorro2, cachorro3]

Agora que temos os nossos dados agrupados em um array, precisamos fazer alguma marcação para indicar o que cada um desses elementos são, usaremos então uma variável chamada marcacoes para indicar o que cada um representa:

marcacoes 

Sabemos que do primeiro ao terceiro, são porcos e eu vou marcar com 1, tudo bem?

marcacoes = [1, 1, 1]

E para marca como cachorro eu vou querer marcar com um outro número, eu posso marcar com 0, -1, 10000... Eu posso marcar com o que eu quiser. Para dar ênfase na distinção dos 2 elementos, ou seja, dizer que um é oposto do outro, eu irei usar 1 positivo(1) para porcos e 1 negativo(-1) para cachorro:

porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro4 = [1, 1, 1]
cachorro5 = [0, 1, 1]
cachorro6 = [0, 1, 1]

dados = [porco1, porco2, porco3, cachorro4, cachorro5, cachorro6]

marcacoes = [1, 1, 1, -1, -1, -1]

Marcamos todos os nosso elementos, porém, nós temos agora um elemento misterioso, quem é esse misterioso? Bom, eu tenho um colega que é gordinho, tem perninha curta e faz auau:

misterioso = [1, 1, 1]

E agora? Esse colega é um porco ou um cachorro? Esse é o nosso elemento misterioso... O que nós queremos saber é: "Será que esse elemento misterioso é um cachorro ou é um porco?". Então nós queremos treinar um algoritmo de classificação baseado nesses dados para que, baseado nesses dados, ele me diga se é um cachorro ou é um porco. Vamos lá?

O que precisamos fazer agora é treinar um algoritmo baseado nesses dados. Então nós precisamos importar da biblioteca do sklearn uma parte dela que faz o treinamento baseado no algoritmo que se chama bayesiano, chamado naive_bayes. A partir dessa biblioteca iremos importar o algoritmo MultinomialNB, NB de naive bayes:

from sklearn.naive_bayes import MultinomialNB

O Multinomial é o algoritmo que usaremos para treinar o nosso modelo que diz se os nosso elementos são cachorros ou porcos. Para treinar esse modelo nós precisamos dos nossos dados e nossas marcações. E como fazemos para criar um modelo? basta apenas fazer uma chamada para o MultinomialNB:

porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro4 = [1, 1, 1]
cachorro5 = [0, 1, 1]
cachorro6 = [0, 1, 1]

dados = [porco1, porco2, porco3, cachorro4, cachorro5, cachorro6]

marcacoes = [1, 1, 1, -1, -1, -1]

misterioso = [1, 1, 1]

from sklearn.naive_bayes import MultinomialNB

modelo = MultinomialNB()

Criamos um modelo! Vamos tentar rodar o nosso código? Salve o arquivo, abra o terminal, vá até o diretório onde salvou o arquivo e execute:

> python classificacao.py
>

Não aconteceu nada? Claro que não aconteceu nada! Apenas criamos o modelo! Nem mandamos ele treinar... Como nós, como ser humanos, treinamos? Olhamos para um elemento e classificamos como porquinho, olhamos para outro elemento e classificamos como cachorrinho, isto é, baseado nos dados e marcações nós treinamos o modelo do nosso cérebro, e precisamos fazer a mesma coisa para o nosso modelo:

modelo = MultinomialNB()
modelo.treinar(dados, marcacoes)

Porém, não existe o método treinar, então como faremos isso? Observe que o nosso modelo precisa se adequar aos nossos dados e marcacoes, ou seja, os dados do porco1 ao porco3 é 1 os dados do cachorro4 ao cachorro6 é -1. É dessa maneira que precisamos adequar o nosso modelo, e para isso usaremos o método fit:

modelo.fit(dados, marcacoes)

Nesse momento do código estamos dizendo: "Por favor, adeque-se a essas informações". Vamos testar?

> python classificacao.py
>

Não aconteceu nada... Nesse momento nós apenas treinamos! E o que precisamos é pedir para que o modelo preveja quem é o elemento misterioso utilizando o método predict:

modelo.predict([misterioso])

Esse método vai devolver se é um cachorro ou um porco, então precisamos imprimir o valor com o método print:

# [é gordinho?, tem perninha curta?, faz auau?]
porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro4 = [1, 1, 1]
cachorro5 = [0, 1, 1]
cachorro6 = [0, 1, 1]

dados = [porco1, porco2, porco3, cachorro4, cachorro5, cachorro6]

marcacoes = [1, 1, 1, -1, -1, -1]

misterioso = [1, 1, 1]

from sklearn.naive_bayes import MultinomialNB

modelo = MultinomialNB()
modelo.fit(dados, marcacoes)
print(modelo.predict(misterioso))

Testando novamente o nosso algoritmo:

> python classificacao.py
> /usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
  DeprecationWarning)
[-1]

Ele devolveu um warning, porém ele imprimiu o resultado que foi um array e, dentro desse array, devolveu -1, logo veremos como resolver esse warning. E o que significa o -1 pra ele? Significa um cachorro! Como será que ele deduziu que era um cachorro? Se nós olharmos a nossa experiência passada:

# [é gordinho?, tem perninha curta?, faz auau?]
porco1 = [1, 1, 0]
porco2 = [1, 1, 0]
porco3 = [1, 1, 0]
cachorro4 = [1, 1, 1]
cachorro5 = [0, 1, 1]
cachorro6 = [0, 1, 1]

dados = [porco1, porco2, porco3, cachorro4, cachorro5, cachorro6]

marcacoes = [1, 1, 1, -1, -1, -1]

# restante do código

Todos que faziam auau eram cachorros. Com base nesses dados, fazendo uma análise pelo nosso cérebro, provavelmente faríamos a mesma classificação. Não sabemos o que aconteceu por trás dos panos, só sabemos que, quando rodamos, ele nos informou que o elemento misterioso é um cachorro! Repare que, nós passamos vários dados para o nosso programa, o treinamos e pedimos para ele verificar um único caso que foi o elemento misterioso, mas será que nós queremos prever apenas um único caso? Não! Nós queremos prever muitos outros casos! Então precisamos de outros elementos misteriosos para que o programa classifique para nós, como por exemplo o misterioso2 que é gordinho, não tem perninha curta e não faz auau:

misterioso1 = [1, 1, 1]
misterioso2 = [1, 0, 0]

Bom, ele não é gordinho e não tem perna curta, porém ele não faz auau, eu imagino que seja um porco, pois todos que não fazem auau são porquinhos. Então agora, em vez de prever o misterioso1, pediremos para que ele preveja o misterioso2:

print(modelo.predict(misterioso2))

Se rodarmos novamente:

> python classificacao.py
> /usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
  DeprecationWarning)
[1]

Na interpretação dele, a maior chance que ele dá é que esse misterioso2 seja um porquinho, bom, se observarmos o misterioso2 vemos que ele é gordinho, não tem perna longa e não faz auau... Eu chutaria que é um porquinho também! Porém nós não prevemos todos de uma vez só! Para isso precisamos adicionar todos os misteriosos dentro de um array e atribuir a uma variável que vamos chamar de teste:

misterioso1 = [1, 1, 1]
misterioso2 = [1, 0, 0]

teste = [misterioso1, misterioso2]

E então passamos apenas o teste no predict:

print(modelo.predict(teste))

Repara que o parâmetro do método predict recebe um array, com vários elementos que queremos testar e é por isso que ele deu aquele warning daquela vez, antigamente ele recebia apenas um valor, porém essa solução foi depreciada, e logo não haverá mais suporte para ela. No nosso caso ele deu um warning, pode ser que em versões futuras ele nem funcione! Então, mesmo que for um array de uma única posição, precisamos passar um array! Vamos testar novamente?

> python classificacao.py 
> [-1  1]

Agora ele imprime dois resultados e diz que o primeiro elemento misterioso é um cachorro e o segundo é um porco. Se verificarmos nossos dois elementos misteriosos:

misterioso1 = [1, 1, 1]
misterioso2 = [1, 0, 0]

Realmente, o misterioso1 é um cachorro e o misterioso2 é um porco. Então como funciona o algoritmo Bayesiano Multinominal para classificação?

E então ele vai prevendo se esses elementos são porcos ou cachorros. Mas agora eu estou pensando, será que esse código que criamos funciona apenas para porco ou cachorro? E se, ao invés de cachorro ou porco, esses elementos fossem spam ou não spam? E se fosse um cliente que não paga as dívidas e um cliente que paga as dívidas em dia? E se esses 0 e 1 classificassem qualquer outra coisa? Eu mudaria alguma coisa no código? O que você acha? É justamente esse exemplo que eu queria demonstrar para você: como podemos implementar a mesma coisa que vimos com tabelas e números e traduzimos isso pra código, extremamente simples! E quais são os passos mesmo?

Repare que as marcações foram feitas de uma forma diferente da qual vimos na tabela: em vez de usar 0 e 1 eu usei -1 e 1. Eu optei por essa escolha, pois dessa forma dá uma ênfase melhor de distinção. Poderíamos testar com 0 e 1 sem problema algum:

marcacoes = [1, 1, 1, 0, 0, 0]

Se tentarmos rodar novamente:

> python classificacao.py
> [0 1]

Mas vamos deixar -1 e 1, justamente pra dar essa ênfase de um ser o oposto do outro no momento em que eu tenho duas categorias!

Sobre o curso Machine Learning: Classificação por trás dos panos

O curso Machine Learning: Classificação por trás dos panos possui 304 minutos de vídeos, em um total de 93 atividades. Gostou? Conheça nossos outros cursos de Machine Learning em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Machine Learning acessando integralmente esse e outros cursos, comece hoje!

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1241 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?

Acesso por 1 ano

Estude 24h/dia onde e quando quiser

Novos cursos todas as semanas