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

erro

O meu código está idêntico ao do curso, porem parece o seguinte erro:

Taxa de acerto do algoritmo MultinomialNB: 82.0
acertou 164 de 200 elementos
Taxa de acerto do algoritmo AdaBoostClassifier: 84.5
acertou 169 de 200 elementos
Traceback (most recent call last):
  File "classifica_busca.py", line 79, in <module>
    teste_real(vencedor, validacao_dados, validacao_marcacoes)
  File "classifica_busca.py", line 54, in teste_real
    resultado = modelo.predict(validacao_dados)
  File "C:\Python27\lib\site-packages\sklearn\ensemble\weight_boosting.py", line 600, in predict
    pred = self.decision_function(X)
  File "C:\Python27\lib\site-packages\sklearn\ensemble\weight_boosting.py", line 659, in decision_function
    X = self._validate_X_predict(X)
  File "C:\Python27\lib\site-packages\sklearn\ensemble\weight_boosting.py", line 267, in _validate_X_predict
    X = check_array(X, accept_sparse='csr', dtype=DTYPE)
  File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 416, in check_array
    context))
ValueError: Found array with 0 sample(s) (shape=(0, 5)) while a minimum of 1 is required.

O meu código é:

from collections import Counter
import pandas as pd
df = pd.read_csv('busca_substituido.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 = 0.8
porcentagem_teste = 0.1
qtd_de_treino = porcentagem * len(Y)
qtd_de_teste = porcentagem * len(Y)
qtd_de_validacao = len(Y) - qtd_de_treino - qtd_de_teste

qtd_de_treino = int(qtd_de_treino)
qtd_de_teste = int(qtd_de_teste)
qtd_de_validacao = int(qtd_de_validacao)

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

fim_teste = qtd_de_treino + qtd_de_teste
teste_dados = X[qtd_de_treino:fim_teste]
teste_marcacoes = Y[qtd_de_treino:fim_teste]

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



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

    resultado = modelo.predict(teste_dados)

    acertos = resultado == teste_marcacoes

    total_de_elementos = len(teste_dados)
    total_de_acertos = sum(acertos)
    taxa_acerto =  100.0 * total_de_acertos/total_de_elementos

    print("Taxa de acerto do algoritmo {0}: {1}".format(nome, taxa_acerto))
    print("acertou %s de %s elementos" % (total_de_acertos, total_de_elementos))
    return taxa_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
from sklearn.ensemble import AdaBoostClassifier

modelo_multinomial = MultinomialNB()
modelo_adabooster = AdaBoostClassifier()

resultado_multinomial = fit_and_predict(modelo_multinomial, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes, 'MultinomialNB')
resultado_adabooster = fit_and_predict(modelo_adabooster, treino_dados, treino_marcacoes, teste_dados, teste_marcacoes, 'AdaBoostClassifier')

if resultado_multinomial > resultado_adabooster:
    vencedor = modelo_multinomial
else:
    vencedor = modelo_adabooster

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("Taxa de acerto do algoritmo base: %s%%" % taxa_de_acerto_base)

Alguém sabe oque significa?

2 respostas
solução!

Oi Gal, tudo bom?

O seu array de validacao_dados porque, na hora de preencher com X[fim_teste:], o fim_teste está com um valor muito maior que o que deveria. Você está usando duas variáveis diferentes, qtd_de_treino e qtd_de_teste, com o mesmo valor. Dá uma olhada melhor no valor que deveria ter cada uma delas.

Se mantiver a dúvida, avisa que explico mais. :)

Ana,

É isso mesmo! foi só mudar o valor do fim_teste que resolveu o problema.

Obrigado