6
respostas

Resultado para o "buscas2.csv"

Boa tarde!

Essa foi a resposta do exercício:

Resultado para o buscas2.csv:
> python classifica_buscas.py 
Taxa de acerto do algoritmo MultinomialNB: 85.7142857143
Taxa de acerto do algoritmo AdaBoostClassifier: 85.7142857143
Taxa de acerto base: 71.428571
Total de teste: 7

Esse foi o meu resultado:

C:\Users\jonasbj\Desktop\Alura-ML>python classifica_buscas.py
Taxa de acerto do algoritmo MultinomialNB: 75.0
Taxa de acerto do algoritmo AdaBoostClassifier: 75.0
Taxa de acerto base: 62.500000

C:\Users\jonasbj\Desktop\Alura-ML>
6 respostas

E esse é meu código:

# -*- coding: utf-8 -*-

######################################################################
# Importação da Biblioteca collections
######################################################################
from collections import Counter

######################################################################
# Importação da Biblioteca pandas
######################################################################
import pandas as pd

######################################################################
# Criação dos Data Frames (df) a partir do arquivo CSV
######################################################################
df = pd.read_csv('buscas2.csv')

X_df = df[['home','busca','logado']]
Y_df = df['comprou']

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

X = Xdummies_df.values
Y = Ydummies_df.values

######################################################################
# Definição dos percentuais de treino e teste
######################################################################
porcentagem_treino = 0.9

tamanho_de_treino = int(porcentagem_treino * len(Y))
tamanho_de_teste = len(Y) - tamanho_de_treino

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

teste_dados = X[-tamanho_de_teste:]
teste_marcacoes = Y[-tamanho_de_teste:]

######################################################################
# Importação da Biblioteca scikit-learn
# Algoritmos MultinomialNB e AdaBoostClassifier
######################################################################
from sklearn.naive_bayes import MultinomialNB
from sklearn.ensemble import AdaBoostClassifier

modeloMultinomial = MultinomialNB()
modeloAdaBoostClassifier = AdaBoostClassifier()

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)

######################################################################
# Cálculo da taxa de acerto base
######################################################################
# acerto_base = max(Counter(Y).intervalues())
acerto_base = max(Counter(teste_marcacoes).values())
taxa_de_acerto_base = 100.0 * acerto_base / len(teste_marcacoes)

######################################################################
# Exibição dos resultados
######################################################################
fit_and_predict('MultinomialNB', modeloMultinomial, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes)
fit_and_predict('AdaBoostClassifier', modeloAdaBoostClassifier, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes)
print('Taxa de acerto base: %f') % taxa_de_acerto_base
# print('Taxa de acerto: %f') % taxa_de_acerto
# print(total_de_elementos)

Oi Jonas, boa tarde!

Deixe-me ver se entendi a sua dúvida.

Você acha que poder ter algo errado no seu código, pois o resultado que colocou aqui está diferente, seria isso?

Olá Cássia! Bom dia! Sim, seria isso! O código ficou igual, salvo engano meu, mas o resultado ficou diferente. Obrigado pela resposta! :-)

Bom dia, Jonas! :)

Muitas vezes dentro do Machine Learning, devido a algumas coisas randômicas que ocorrem por internamente nos próprios algoritmos, o resultado varia e temos até meios de controlar essa variação. Pode ser que seja isso que tenha acontecido.

Mas, pelo o que eu vi nesse código que você compartilhou, tem algumas diferenças entre ele o do github do curso que foi usado para obter esses resultados.

A primeira que acredito que seja uma boa ajustar e testar novamente é a entre dados de treino e teste. No código do curso, a porcentagem de treino é de 0.8, e no que você compartilhou é de 0.9, isso já dá uma boa diferença de resultado. Eu aconselho alterar e testar novamente.

Além disso, o do curso considera a de teste também, pois precisamos dela para o modelo classificar. Eu rodaria de novo e também incluiria porcentagem_de_teste = 0.1 (só pra ter certeza).

Também reparei em algumas diferenças de type casting, então ao invés de

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

temos

Xdummies_df = pd.get_dummies(X_df)

e de

tamanho_de_treino = int(porcentagem_treino * len(Y))

temos

tamanho_de_treino = porcentagem_de_treino * len(Y)

Procure testar com essas alterações e, se continuar diferente damos mais uma olhada, só voltar aqui no Fórum :).

Cássia

Fiz as alterações que você indicou, rodei novamente e apareceu essa mensagem:

python teste.py
Traceback (most recent call last):
  File "teste.py", line 38, in <module>
    treino_dados = X[:tamanho_de_treino]
TypeError: slice indices must be integers or None or have an __index__ method

Dei um print na variável "tamanho de treino" e verifiquei que ela era float, por isso precisei alterar para inteiro.

Rodei novamente e deu esse resultado:

python teste.py
Taxa de acerto do algoritmo MultinomialNB: 80.0
Taxa de acerto do algoritmo AdaBoostClassifier: 73.3333333333
Taxa de acerto base: 73.333333

Ainda diferente da resposta do exercício. Vou continuar investigando aqui e qualquer coisa eu te dou um retorno.

Obrigado pela atenção!

Puxa Jonas, pelo menos aproximou mais do resultado do exercício hehe.

Como eu só tinha passado o Github, o arquivo do código é este aqui, pode ser uma boa roda-lo e talvez te facilite.

Agora reparei também que o finalzinho do código está um pouco diferente. Essa parte aqui:

acerto_base = max(Counter(validacao_marcacoes).itervalues())
taxa_de_acerto_base = 100.0 * acerto_base / len(validacao_marcacoes)
print("Taxa de acerto base: %f" % taxa_de_acerto_base)
print("Total de testes: %d " % len(validacao_dados))

Veja se funciona, e beleza, vai me falando!