1
resposta

AttributeError: 'float' object has no attribute 'predict'

from collections import Counter
import sys
sys.path
sys.path.append('/python27/lib/site-packages/naive_bayes.py')

#teste inicial: home, busca, logado
#home, busca
#home, logado
#busca, logado
#busca: 85,71% (7 testes)

import pandas as pd
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

porcentagem_teste = 0.1
porcentagem_treino = 0.8


tamanho_de_treino = int(porcentagem_treino * len(Y))
tamanho_de_teste = int(porcentagem_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:]

#codigo generico de um unico valor


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(vencedor, validacao_dados, validacao_marcacoes):

    resultado = vencedor.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.ensemble import AdaBoostClassifier
modeloAdaBoost = AdaBoostClassifier()
resultadoAdaBoostClassifier = fit_and_predict("AdaBoostClassifier", modeloAdaBoost, treino_dados,treino_marcacoes, teste_dados, teste_marcacoes)


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

if resultadoMultinomial > resultadoAdaBoostClassifier: 
    vencedor = resultadoMultinomial
else: 
    vencedor = resultadoAdaBoostClassifier

teste_real(vencedor, validacao_dados, validacao_marcacoes)

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

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

Só mostra a taxa de acerto dos algoritmos e o restante que era pra mostrar também da esse erro: Taxa de acerto do algoritmo AdaBoostClassifier: 85.7142857143 Taxa de acerto do algoritmo MultinomialNB: 85.7142857143 Traceback (most recent call last): File "D:\codigos\machine_learning\classifica_buscas.py", line 89, in teste_real(vencedor, validacao_dados, validacao_marcacoes) File "D:\codigos\machine_learning\classifica_buscas.py", line 65, in teste_real resultado = vencedor.predict(validacao_dados) AttributeError: 'float' object has no attribute 'predict'

1 resposta

Oi Rafael, tudo bem?

Veja que no vencedor, você está passando o resultado da função fit_and_predict. Essa função retorna um valor float.

Na função teste_real, a gente precisa passar o modelo vencedor, isto é, o modelo MultinomialNB ou o AdaBoost.

Para isso, basta que no local que checamos qual algoritmo foi o melhor, atribuir o modelo ao invés do resultado:

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

teste_real(vencedor, validacao_dados, validacao_marcacoes)