Primeiras aulas do curso Machine Learning: Avançando com tipos diferentes de classificação

Machine Learning: Avançando com tipos diferentes de classificação

Novos conceitos de classificação - Introdução

Até o momento, vimos diversos exemplos de classificação, tais como, verificar se um e-mail é spam ou não, se um animal é um cachorro ou um porco, se um cliente vai comprar ou não no nosso site entre outros exemplos. Vimos que podem existir milhares de classificações no nosso dia a dia que conseguimos fazer, porém, é interessante o computador realizar esse tipo de tarefa para nós, justamente para que consigamos prevêr resultados esperados, ou seja, evitar de abrir um e-mail que é spam, entregar um produto que o nosso cliente espera, conseguir conversar com alunos que provavelmente irão mal na prova entre diversas ações que podemos tomar para alcançar o nosso objetivo. Todo esse conteúdo foi visto até agora, então vem a pergunta:

Perceba que, no mundo real, poderíamos levar mais adiante, em outras palavras, ao invés de querermos saber apenas se o cliente vai comprar ou não, ou então, se vai renovar ou não, podemos também ter o interesse em uma gama maior de informações, por exemplo, saber sobre sua satisfação, isto é, se ele está feliz ou neutro ou triste ou super contente ou com raiva... Perceba que podemos ter todos esses clientes, então vem as questões:

Um outro exemplo para esse tipo de cenário seria, dado um produto novo que que estamos querendo lançar, surgem dúvidas como:

Perceba que nesse instante, podemos ter mais de 2 categorias, ou seja, 3, 5, 10 ou muito mais categorias para um serviço, produto ou qualquer tipo de elemento que queremos classificar.

Além disso, atualmente, estamos testando e validando os nossos dados de uma maneira bem simples, que é testar, escolher o melhor entre os 2 algoritmos e validar. Porém, e quando tivermos, por exemplo, 4, 10 ou mais algoritmos? Também queremos ser capazes de validá-los! Em outras palavras, eleger o vencedor entre uma grande variação de algoritmos que iremos utilizar. Também queremos realizar testes diferentes aos quais vimos até agora, por exemplo, os nossos testes são realizados apenas uma única vez, e se esses dados tiverem algum vício? Ou então, e se tiver um erro que desconhecemos? Como podemos ter a certeza de que, dado os testes que realizamos para os nossos algoritmos, o resultado final que obtivemos é de fato esperado para o mundo real? Esse também será um dos assuntos que iremos abordar no decorrer dos próximos capítulos.

Até agora estávamos trabalhando apenas com números, isto é, categorias numéricas, ou seja, essas categorias baseadas em apenas números ou em palavras que eram transformadas em números diretamente, por exemplo, 0, 1 ou 2. Porém, no mundo real, também trabalharemos com produção de texto, em outras palavras, precisamos também classificar textos! Ou melhor, dado um parágrafo escrito de um livro, queremos saber se esse livro vendará muito ou não. Consegue perceber que dessa vez a classificação é referente ao conteúdo do texto? Isto é, a língua portuguesa, as próprias palavras em si. Mas como podemos processar os nossos texto para classificar as palavras? Seja por algum sentimento, intenção ou qualquer categoria dessas palavras que queremos classificar. Veremos que para esse tipo de classificação tomaremos alguns cuidados, como por exemplo, realizar limpeza nos nossos textos para evitar qualquer lixo, ou seja, qualquer informação que não faça sentido algum com o que queremos classificar. Perceba que agora temos diversas novas situações que ainda não vimos até agora, e no decorrer das próximas aulas, abordaremos cada uma delas.

Novos conceitos de classificação - Classificando um elemento com 3 categorias

No mundo real, sabemos que em diversas situações podemos realizar classificações entre duas categorias, como por exemplo verificar os alunos que irão reprovar ou não, ou os alunos que irão desistir da escola durante o período letivo ou não. Mas, além de duas categorias, podemos nos interessar em classificar mais de duas categorias, porém, como fazemos para classificar um elemento que possui mais de duas categorias diferentes? Por exemplo, quando recebemos um e-mail, podemos categorizar ele como spam ou não, por enquanto estamos classificando apenas duas categorias, mas, além da classificação de spam, podemos também classificá-lo como spam, promoção, fórum, update, importante, familiar ou normal. Apenas com esse pequeno exemplo que fizemos, apareceram 7 categorias distintas para classificarmos um e-mail. Então observe que agora, quando um e-mail chegar, não iremos apenas tentar classificá-lo entre spam ou não, teremos 7 categorias possíveis para a sua classificação! No nosso primeiro exemplo utilizaremos apenas 3 categorias que demonstra, conceitualmente, a mesma situação, porém, de uma forma reduzida. Então vamos dar uma olhada no nosso primeiro cliente? Esse nosso cliente possui as seguintes características:

A primeira característica informa a última visita que o cliente fez no nosso site, nesse caso, ontém, um dia atrás. Mas o que ela significa exatamente? Essa informação responde a seguinte pergunta: "O quão recente foi o último acesso desse cliente?". Identificamos isso como recência. Quando dizemos o último acesso, ou melhor, a recência do nosso cliente ao nosso site, não significa que precisa ser necessariamente em dias, poderia, por exemplo ser em horas, semanas, meses ou anos, ou seja, podemos medir com qualquer unidade, nesse exemplo utilizaremos dias como unidade de medida. Mas por que nos interessaria saber a recência desse cliente ao nosso site? Pois, baseado nessa informação, podemos tentar medir como ele está se sentindo em relação a um cliente que acessou há uma semana, ou há um mês ou há ano atrás.

A segunda característica descreve qual é a frequência de visitas que o cliente teve após sua inscrição. Isso não significa uma frequência seguida. Em outras palavras, estamos respondendo a seguinte pergunta: "O quão frequente foi o acesso do nosso cliente"?, nesse caso, 4 dias distintos. Da mesma forma que vimos na característica de recência, poderíamos utilizar outras unidades de medida para essa informação, como horas, meses ou anos. Então repara que agora estamos utilizando uma variável diferente, pois estamos medindo quantos dias distintos o cliente visitou o nosso site, isto é, a sua frequência. Esse tipo de informação pode ser relevante, pois uma pessoa que acessou 4 dias e outra que acessou nenhuma dia após a inscrição, nos indica se o meu produto é ou não interessante.

A próxima característica refere-se ao tempo que o cliente se inscreveu no nosso site. Mas porque é importante saber há quanto tempo um cliente se inscreveu no nosso site? Pois dependendo do tempo de inscrição, cada cliente poderá conter diferentes tipos de comportamentos, ou seja, um cliente que se inscreveu semana passada tem um comportamento totalmente diferente de um cliente que se inscreveu há 3 anos, podemos usar o site do Alura como exemplo, pois no início haviam entre 5 a 10 cursos, porém, atualmente, existem mais de 200 cursos. Percebe que o tempo que um cliente está dentro de uma plataforma influencia? Porém, isso não significa que quanto mais ou menos tempo o cliente estiver associado a um produto ele vai se sentir melhor ou pior, por exemplo, existem empresas que, quanto mais tempo ficamos vinculados aos seus produtos, mais contentes ficamos, mas também, existem empresas que, quanto menos tempo estamos atrelados ao seu produto, mais chateados ficamos. Então podemos concluir que não existe uma regra geral para dizer se ele ficará contente ou não dependendo do tempo que ele se inscreveu, portanto, teremos que analisar essa variável para que o nosso algoritmo consiga encontrar um padrão para esse tipo de dado. Repare que além dessas 3 variáveis (recencia, frequência e tempo de cadastro), poderíamos utilizar diversas outras, por exemplo, quanto dinheiro ele gastou, quantos vídeos ele assistiu (considerando o Alura como exemplo), quantos exercícios ele fez, quantas pessoas ele ajudou, quantas dúvidas ele postou entre outras. Porém, iremos apenas utilizar essas variáveis para o nosso exemplo.

Então o que queremos classificar com apenas essas 3 variáveis? Para esse exemplo, tentaremos prevêr se o nosso cliente está ou alegre ou neutro ou chatedo com o nosso produto. Nesse primeiro exemplo, vimos as características de um cliente que está alegre. Mas o que significa cada um desses estados? Vejamos:

Observe que agora, ao invés de duas categorias, iremos classificar os nossos clientes entre 3 categorias, isto é, alegre, neutro e chateado. Vejamos um outro exemplo de cliente:

Como foi o comportamento desse cliente no nosso site? Podemos ver que o último acesso dele foi há 2 dias, ou seja, sua recência é 2. Esse cliente acessou em um único dia, porém, isso não significa que ele acessou apenas uma vez, pois, nesse mesmo dia, ele poderia ter acesso várias vezes, mas perceba que não estamos analisando a quantidade de vezes que ele acessou e sim quantos dias distintos ele acessou, por isso marcamos apenas como 1 dia. Além disso, esse cliente se inscreveu há 2 semanas, e então, sabemos que ele está neutro, pois o pessoal do comercial entrou em contato com ele e verificou que ele está neutro. Precisamos entrar em contato justamente para entender como ele está se sentido, da mesma forma como classificamos se um e-mail é ou não um spam, ou seja, precisamos ler o e-mail para podermos classificá-lo. Então perceba que para essa situação, temos esses conjuntos de dados que foram extraídos de uma base de dados de um site de vendas e precisamos entrar em contato para verificar qual é a sensação dele com o nosso produto. Mas teremos que fazer exatamente a mesma coisa em todos os casos? Não! Tudo depende do conjunto de dados utilizado e o que queremos classificar, por exemplo, poderíamos conter um determinado conjunto de dados sobre um produto nosso, e então, queremos prevêr se ele fará sucesso ou não antes mesmo de lançar. Perceba que para esse caso, não faz sentido perguntarmos ao produto se ele fará sucesso ou não, em outras palavras, utilizaremos apenas o nosso conjunto de dados e, baseado nesse conjunto de dados, o classificaremos. Por fim, vejamos mais um possível cliente para o nosso exemplo;

Observe que esse cliente teve uma recência de 3 dias atrás, então obteve uma frequência de apenas 1 dia, porém esse cliente se inscreveu há 7 semanas. Por fim, verificamos que ele está cheteado.

Mas e agora? O que fazemos com essas informações? Iremos criar e preencher a nossa tabela de dados da mesma forma que fizemos anteriormente. Vejamos a estrutura da nossa tabela:

Repare que a nossa tabela contém 4 colunas referente aos dados que temos de nossos clientes, ou seja, recencia, frequencia, semanas e situacao dos clientes que vimos como exemplo. Veja que no último campo preenchemos com palavras, isto é, alegre, neutro e chateado, porém, iremos traduzir essas palavras em números, nesse caso usaremos 2 para alegre, 1 para neutro e 0 para chateado:

Note que caímos em um cenário muito similar ao que já vimos até agora, então qual é a diferença desse caso para os demais que vimos? É justamente o fato de utilizar 3 categorias para classificar os nossos elementos, em outras palavras, verificar se o cliente está alegre, neutro ou chateado.

Novos conceitos de classificação - Começando com o código

Considerando todo esse contexto que acabamos de ver, precisamos agora implementar o nosso código. Antes mesmo de criar o nosso algoritmo, vamos primeiro pegar os novos dados na planilha do Google Spreadsheets:

Perceba que agora estamos pegando os dados da aba "situacao_do_cliente". Salve o arquivo como CSV com o nome situacao_do_cliente.csv dentro do diretório onde preferir, lembrando que iremos trabalhar exatamente no local onde salvar esse arquivo. Agora, crie um arquivo dentro do diretório onde salvou o CSV com o nome situacao_do_cliente.py que será o nosso arquivo python para escrevermos o nosso código. Não implementaremos todo o código desde o zero, pois reutilizaremos uma boa parte do algoritmo que implementamos no arquivo classifica_buscas.py, segue o código abaixo:

import pandas as pd
from collections import Counter

df = pd.read_csv('situacao_do_cliente.csv')
X_df = df[['recencia','frequencia', 'semanas_de_inscricao']]
Y_df = df['situacao']

Xdummies_df = pd.get_dummies(X_df).astype(int)
Ydummies_df = Y_df

X = Xdummies_df.values
Y = Ydummies_df.values

porcentagem_de_treino = 0.8
porcentagem_de_teste = 0.1

tamanho_de_treino = porcentagem_de_treino * len(Y)
tamanho_de_teste = porcentagem_de_teste * len(Y)
tamanho_de_validacao = len(Y) - tamanho_de_treino - tamanho_de_teste

treino_dados = X[:tamanho_de_treino]
treino_marcacoes = Y[:tamanho_de_treino]

fim_de_treino = tamanho_de_treino + tamanho_de_teste

teste_dados = X[tamanho_de_treino:fim_de_treino]
teste_marcacoes = Y[tamanho_de_treino:fim_de_treino]

validacao_dados = X[fim_de_treino:]
validacao_marcacoes = Y[fim_de_treino:]


def fit_and_predict(nome, modelo, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes):
    modelo.fit(treino_dados, treino_marcacoes)

    resultado = modelo.predict(teste_dados)

    acertos = resultado == teste_marcacoes

    total_de_acertos = sum(acertos)
    total_de_elementos = len(teste_dados)

    taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

    msg = "Taxa de acerto do algoritmo {0}: {1}".format(nome, taxa_de_acerto)

    print(msg)
    return taxa_de_acerto

def teste_real(modelo, validacao_dados, validacao_marcacoes):
    resultado = modelo.predict(validacao_dados)
    acertos = resultado == validacao_marcacoes

    total_de_acertos = sum(acertos)
    total_de_elementos = len(validacao_marcacoes)

    taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

    msg = "Taxa de acerto do vencedor entre os dois algoritmos no mundo real: {0}".format(taxa_de_acerto)
    print(msg)

from sklearn.naive_bayes import MultinomialNB
modeloMultinomial = MultinomialNB()
resultadoMultinomial = fit_and_predict("MultinomialNB", modeloMultinomial, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes)

from sklearn.ensemble import AdaBoostClassifier
modeloAdaBoost = AdaBoostClassifier()
resultadoAdaBoost = fit_and_predict("AdaBoostClassifier", modeloAdaBoost, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes)

if resultadoMultinomial > resultadoAdaBoost:
    vencedor = modeloMultinomial
else:
    vencedor = modeloAdaBoost

teste_real(vencedor, validacao_dados, validacao_marcacoes)

acerto_base = max(Counter(validacao_marcacoes).values())
taxa_de_acerto_base = 100.0 * acerto_base / len(validacao_marcacoes)
print("Taxa de acerto base: %f" % taxa_de_acerto_base)

total_de_elementos = len(validacao_dados)
print("Total de teste: %d" % total_de_elementos)

Em Python3

import pandas as pd
from collections import Counter

df = pd.read_csv('situacao_do_cliente.csv')
X_df = df[['recencia','frequencia', 'semanas_de_inscricao']]
Y_df = df['situacao']

Xdummies_df = pd.get_dummies(X_df)
Ydummies_df = Y_df

X = Xdummies_df.values
Y = Ydummies_df.values

porcentagem_de_treino = 0.8
porcentagem_de_teste = 0.1

tamanho_de_treino = int(porcentagem_de_treino * len(Y))
tamanho_de_teste = int(porcentagem_de_teste * len(Y))
tamanho_de_validacao = len(Y) - tamanho_de_treino - tamanho_de_teste

treino_dados = X[:tamanho_de_treino]
treino_marcacoes = Y[:tamanho_de_treino]

fim_de_treino = tamanho_de_treino + tamanho_de_teste

teste_dados = X[tamanho_de_treino:fim_de_treino]
teste_marcacoes = Y[tamanho_de_treino:fim_de_treino]

validacao_dados = X[fim_de_treino:]
validacao_marcacoes = Y[fim_de_treino:]


def fit_and_predict(nome, modelo, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes):
    modelo.fit(treino_dados, treino_marcacoes)

    resultado = modelo.predict(teste_dados)

    acertos = resultado == teste_marcacoes

    total_de_acertos = sum(acertos)
    total_de_elementos = len(teste_dados)

    taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

    msg = "Taxa de acerto do algoritmo {0}: {1}".format(nome, taxa_de_acerto)

    print(msg)
    return taxa_de_acerto

def teste_real(modelo, validacao_dados, validacao_marcacoes):
    resultado = modelo.predict(validacao_dados)
    acertos = resultado == validacao_marcacoes

    total_de_acertos = sum(acertos)
    total_de_elementos = len(validacao_marcacoes)

    taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

    msg = "Taxa de acerto do vencedor entre os dois algoritmos no mundo real: {0}".format(taxa_de_acerto)
    print(msg)

from sklearn.naive_bayes import MultinomialNB
modeloMultinomial = MultinomialNB()
resultadoMultinomial = fit_and_predict("MultinomialNB", modeloMultinomial, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes)

from sklearn.ensemble import AdaBoostClassifier
modeloAdaBoost = AdaBoostClassifier()
resultadoAdaBoost = fit_and_predict("AdaBoostClassifier", modeloAdaBoost, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes)

if resultadoMultinomial > resultadoAdaBoost:
    vencedor = modeloMultinomial
else:
    vencedor = modeloAdaBoost

teste_real(vencedor, validacao_dados, validacao_marcacoes)

acerto_base = max(Counter(validacao_marcacoes).values())
taxa_de_acerto_base = 100.0 * acerto_base / len(validacao_marcacoes)
print("Taxa de acerto base: %f" % taxa_de_acerto_base)

total_de_elementos = len(validacao_dados)
print("Total de teste: %d" % total_de_elementos)

Copie o código e cole no arquivo situacao_do_cliente.py. A única diferença entre esse código e o que utilizamos no classifica_buscas.py, é que apagamos as marcações dos testes que realizamos, pois eles eram válidos para aquele outro conjunto de dados que havíamos utilizados e também o nome das variáveis:

Pois, utilizaremos os dados para essa nova situação que estamos, que é avaliar a situação do cliente entre: alegre, neutro ou chateado. Mas e esses novos dados? Qual é a diferença deles com o que tinhamos anteriormente? Vejamos:

recencia,frequencia,semanas_de_inscricao,situacao
1,4,4,2
2,1,2,1
1,4,2,2
1,3,8,1
2,2,1,1
1,4,2,2
1,1,5,1
1,3,8,1
3,1,1,1
...
4,1,6,0

Observe que anteriormente, não havíamos utilizados dados com marcações com mais de 2 valores, porém, dessa vez, estamos variando entre 3 valores (0, 1 ou 2).

Será que tanto o algoritmo AdaBoost quanto o Multinomial conseguem trabalhar de forma eficiente com uma variável de marcação que varia entre 3 valores? Como podemos verificar? Simples! Rodando o nosso arquivo situacao_do_cliente.py:

> python situacao_do_cliente.py
Taxa de acerto do algoritmo MultinomialNB: 72.7272727273
Taxa de acerto do algoritmo AdaBoostClassifier: 68.1818181818
Taxa de acerto do vencedor entre os dois algoritmos no mundo real: 82.6086956522
Taxa de acerto base: 82.608696
Total de teste: 23

Nesse primeiro teste que realizamos podemos concluir que o algoritmo Multinomial obteve um resultado de 72,72% e o AdaBoost 68,18%, ou seja, o algoritmo vencedor foi o Multinomial. Ao executar o teste do mundo real ele obteve um resultado superior ao esperado, nesse caso, 82,60%, porém, mesmo sendo um resultado superior ao dos testes, ele é equivalente ao resultado do algoritmo base, ou seja, que chuta o mesmo valor para todos. Podemos até mesmo verificar o resultado do nosso algoritmo Multinomial imprimindo o resultado dentro da função teste_real:

def teste_real(modelo, validacao_dados, validacao_marcacoes):
    resultado = modelo.predict(validacao_dados)

    print resultado

    # restante do código

Resultado:

> python situacao_do_cliente.py
Taxa de acerto do algoritmo MultinomialNB: 72.7272727273
Taxa de acerto do algoritmo AdaBoostClassifier: 68.1818181818
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
Taxa de acerto do vencedor entre os dois algoritmos no mundo real: 82.6086956522
Taxa de acerto base: 82.608696
Total de teste: 23

Repare que o nosso algoritmo que faz diversos cálculos para tentar adivinhar o que cada dado é chuta o mesmo valor para todos! Portanto, tanto o Multinomial quanto o AdaBoost, não são tão bons para dados com variáveis que possuem 3 valores distintos. Isso significa que, para esse tipo de cenário que nos deparamos, não faz sentido utilizarmos algum desses algoritmos. Então o que faremos? Precisamos utilizar algum outro algoritmo que seja capaz de resolver esse problema de uma maneira mais eficaz, isto é, com 3 valores diferentes para a variável de classificação.

Sobre o curso Machine Learning: Avançando com tipos diferentes de classificação

O curso Machine Learning: Avançando com tipos diferentes de classificação possui 224 minutos de vídeos, em um total de 54 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!

  • 1056 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

  • 1056 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

  • 1056 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

  • 1056 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 toda semana