Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro 'float' object has no attribute 'predict'

Pessola, estou com alguns problemas e dúvidas para utilizar as arrays, no qual tenho que converter todas para INT, conforme abaixo, para que funcione meu código:

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

fim_de_treino = int(tamanho_de_treino+ tamanho_de_teste)
teste_dados = X[tamanho_de_treino:fim_de_treino]
teste_marcacoes = Y[tamanho_de_treino:fim_de_treino]

fim_de_teste = int(fim_de_treino+ tamanho_de_treino)
validacao_dados = X[fim_de_teste:]
validacao_marcacoes = Y[fim_de_teste:]

Porém ao executar o script, apresenta a mensagem abaixo:

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

Segue meu código no local do erro:

from sklearn.naive_bayes import MultinomialNB
modeloMultinomial = MultinomialNB()
resultadoMultinomialNB = 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 (resultadoMultinomialNB > resultadoAdaBoost):
    vencedor = resultadoMultinomialNB
else:
    vencedor = resultadoAdaBoost

resultado = vencedor.predict(validacao_dados)

Poderiam me ajudar a encontrar a falha?

Obrigado desde já!

9 respostas

Olá, tenho 3 dias já com problemas e ainda não tive nenhum retorno...

Coloca um print ai do vencedor

print vencedor.dtype

Tenta converter

 vencedor = vencedor.astype(float)

print vencedor.dtype

print vencedor.dtype
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'dtype'

vencedor = vencedor.astype(float)

vencedor = vencedor.astype(float)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'astype'

E continua apresentando o erro ao executar o código:

Traceback (most recent call last):
  File "classifica_buscas.py", line 62, in <module>
    resultado = vencedor.predict(validacao_dados)
AttributeError: 'float' object has no attribute 'predict'

Cara, me parece uma incongruencia e algum lugar no codigo que não foi atribuido corretamente as informações, tem um repositorio Git ae ?

Atualizei no Git

https://github.com/LuizHAP/Luiz-Alura/tree/master/Machine%20Learning/classificacao

Eu to achando que é essa parte o problema:

fim_de_treino = int(tamanho_de_treino+ tamanho_de_teste)
teste_dados = X[tamanho_de_treino:fim_de_treino]
teste_marcacoes = Y[tamanho_de_treino:fim_de_treino]

fim_de_teste = int(fim_de_treino+ tamanho_de_treino)
validacao_dados = X[fim_de_teste:]
validacao_marcacoes = Y[fim_de_teste:]

Eu tentei convertei as arrays para int, pq dava um erro antes...

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

Tentei atualizar novamente, copiando o mesmo tópico do GitHub da Alura, sem sucesso... Parece que a versão do SKLEARN que estava no video está diferente da atual...

Alguém mais consegue me ajudar?

solução!

Oi Luiz,

antes de mais nada, veja qual a sua versão de python, ela deve ser a 2.7 (se vier algum número após o 7, não deveria ter diferença na execução do código).

Sobre a dúvida da conversão, está quase :), houve alguma mudança e agora temos mesmo que converter no mínimo essas duas linhas para o código rodar:

tamanho_de_treino = int(porcentagem_treino * len(Y))
fim_de_teste = int(tamanho_de_treino+ tamanho_de_teste)

Eu também dei uma olhada no código que você mandou pra gente, testei e fiz mais alterações nos nomes de variáveis, eu comentei, deixei as linhas originais, e coloquei ele aqui nesse gist.

Caso não consiga vê-lo no gist, eu também estou colando aqui embaixo.

# -*- coding: utf-8 -*-
# adicionei a linha de itf-8 porque o terminal pediu, mas você pode desconsiderá-la
import pandas as pd
from collections import Counter

df = pd.read_csv('busca.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_treino = 0.8
porcentagem_de_teste = 0.1

# na linha baixo precisamos manter a conversao para int no tamanho de treino
tamanho_de_treino = int(porcentagem_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[0:tamanho_de_treino]
treino_marcacoes = Y[0:tamanho_de_treino]

# creio que o fim_de_treino ficou aqui durante o curso, e que ele é o fim_de_teste
# fim_de_treino = int(tamanho_de_treino+ tamanho_de_teste)
# no fim_de_teste também mantenha a conversão para inteiro
# no fim_de_teste, a agregação é de fim de treino e tamanho de treino
fim_de_teste = int(tamanho_de_treino+ tamanho_de_teste)
# abaixo no teste_dados, pegamos o tamanho com o fim de teste ao invés do de treino
# teste_dados = X[tamanho_de_treino:fim_de_treino]
teste_dados = X[tamanho_de_treino:fim_de_teste]
# a mesma coisa do teste_dados para teste_marcacoes: estamos lidando com fim_de_teste ao invés de fim_de_treino
# teste_marcacoes = Y[tamanho_de_treino:fim_de_treino]
teste_marcacoes = Y[tamanho_de_treino:fim_de_teste]


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

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

from sklearn.naive_bayes import MultinomialNB
modeloMultinomial = MultinomialNB()
resultadoMultinomialNB = 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 (resultadoMultinomialNB > resultadoAdaBoost):
    # vencedor = resultadoMultinomialNB
    # aqui precisamos chamar o modelo para usar o classificador: então ao invés de resultado é modelo
    vencedor = modeloMultinomialNB
else:    
    # vencedor = resultadoAdaBoost
    # mesma coisa do que com o MultinomialNB, trocar resultado por modelo que declaramos antes
    vencedor = modeloAdaBoost

resultado = vencedor.predict(validacao_dados)

# acertos = resultado - validacao_marcacoes
# nesta linha estamos comparando o resultado com a validacao ao invés de subtrair
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)

# acerto_base = max(Counter(teste_marcacoes).itervalues())
# aqui estamos contando a partir do teste ao invés da validação
acerto_base = max(Counter(validacao_marcacoes).itervalues())
# taxa_de_acerto_base = 100.0 * acerto_base / len(teste_marcacoes)
# abaixo, ao invés do teste, vamos dividir pelo tamanho da validação_marcações
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(teste_dados))
# abaixo no total, também usamos a validaço ao invés do teste para comparar
print("Total de testes: %d" %len(validacao_dados))

Veja se consegue executar o arquivo sem erros agora, e nos conte se deu certo! :)

Cassia, não sei nem como agradecer! Acabou respondendo algumas perguntas que eu tinha, principalmente na hora de igualar os 2 modelos, que não estava entendendo muito bem.

Acredito que no próprio código no GitHub da Alura também está incorreto, pq copiei de lá para testes, e apresentou a mesma falha.

Obrigado pela ajuda!

Imagine Luiz! Que bom que deu certo!

Obrigada por avisar, vou falar sobre isso para ajustarmos lá no github.