Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro na implementação

O código é este

from collections import Counter
import pandas as pd


df= pd.read_csv('buscas1.csv')

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

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=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[:int(tamanho_de_treino)]
treino_marcacoes= Y[:int(tamanho_de_treino)]

fim_de_treino=int(tamanho_de_treino+tamanho_de_teste)

teste_dados= X[int(tamanho_de_treino):int(fim_de_treino)]
teste_marcacoes= Y[int(tamanho_de_treino):int(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 {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
modelo=MultinomialNB()
resultadoMultinomial = fit_and_predict("MultinomialNB",modelo,treino_dados,treino_marcacoes,teste_dados,teste_marcacoes)

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

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

teste_real(vencedor,validacao_dados,validacao_marcacoes)
#a eficacia do algoritmo que chuta tudo um unico valor
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))

e o erro é este aqui

Taxa de acerto do MultinomialNB:82.0
Taxa de acerto do AdaBoostClassifier:84.0
Traceback (most recent call last):
  File "classifica_buscas.py", line 74, in <module>
    teste_real(vencedor,validacao_dados,validacao_marcacoes)
  File "classifica_buscas.py", line 50, in teste_real
    resultado= modelo.predict(validacao_dados)
AttributeError: 'float' object has no attribute 'predict'

P.S os int que eu tive que colocar dentro das arrays foi para tirar um outro erro que estava dando. Estava dizendo que o que estava dentro não era um número.

1 resposta
solução!

Bom dia Thiago

Acho que no if/else que define o vencedor você deve definir o modelo, e não o resultado. Ai ele vai usar o modelo no teste real

att