7
respostas

Erros no for acertos

Boa tarde a todos!

Estive fazendo os exercícios quando me deparei com o seguinte problema,

/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py:515: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape
of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
Traceback (most recent call last):
  File "classifica_acesso.py", line 18, in <module>
    acertos = [d for d in diferencas if d == 0]
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Eu não sou programador Python e, coincidentemente estou tento problemas com a instrução for filtrada dentro de um array para conter somente os valores 2, e acabei pensando claro que eu tô errado! Eu nem programo Python! Daí resolvi copiar a risca o código exemplo e ver se ele executava, mas aí me deparei com o mesmo problema no trecho:

acertos = [d for d in diferencas if d == 0]

Segue o fonte completo, sim eu copiei tudo pra testar:

from dados import carregar_acessos
X,Y = carregar_acessos()

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

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

from sklearn.naive_bayes import MultinomialNB
modelo = MultinomialNB()
modelo.fit(treino_dados, treino_marcacoes)

resultado = modelo.predict(teste_dados)

diferencas = resultado - teste_marcacoes

acertos = [d for d in diferencas if d == 0]
total_de_acertos = len(acertos)
total_de_elementos = len(teste_dados)

taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

print(taxa_de_acerto)
print(total_de_elementos)

Grato desde já!

7 respostas

tenta fazer o for assim:

for d in diferencas: if d == 0: acertos.append(d)

Ignore o meu comentário acima.

Tenta fazer o for assim:

for d in diferencas:
    if d == 0:
        acertos.append(d)

Bom dia Thiago!!

Primeiramente obrigado pela ajuda, e desculpa pela demora.

Eu fiz o for conforme o indicado mas o problema ainda não foi sanado. Segue o trecho e o erro:

#acertos = [d for d in diferencas if d == 0]

for d in diferencas:
    if d == 0:
        acertos.append(d)

O erro obtido é:

/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py:515: DataConversionWarning: A column-vec
tor y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example u
sing ravel().
  y = column_or_1d(y, warn=True)
Traceback (most recent call last):

  File "classifica_acesso.py", line 21, in <module>
    if d == 0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Olá, Ney, tudo bem?

Tenta coloca isto, uma linha antes do for:

acertos=[]

ficando assim:

acertos=[]
for d in diferencas:
    if d == 0:
        acertos.append(d)

Sem diferenças no resultado

acertos = []

for d in diferencas:
    if d == 0:
        acertos.append(d)

Erro:

python classifica_acesso.
py
/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py:515: DataConvers
ionWarning: A column-vector y was passed when a 1d array was expected. Please chang
e the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
Traceback (most recent call last):
  File "classifica_acesso.py", line 23, in <module>
    if d == 0:
ValueError: The truth value of an array with more than one element is ambiguous. Us
e a.any() or a.all()

Fonte completo:

from dados import carregar_acessos
X,Y = carregar_acessos()

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

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

from sklearn.naive_bayes import MultinomialNB
modelo = MultinomialNB()
modelo.fit(treino_dados, treino_marcacoes)

resultado = modelo.predict(teste_dados)

diferencas = resultado - teste_marcacoes

#acertos = [d for d in diferencas if d == 0]

acertos = []

for d in diferencas:
    if d == 0:
        acertos.append(d)

total_de_acertos = len(acertos)
total_de_elementos = len(teste_dados)

taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

print(taxa_de_acerto)
print(total_de_elementos)

Oi faça como abaixo:

acertos = []
for d in diferencas:
    if (d == 0).any():
        acertos.append(d)

Olá Ney.

Verifique a função carrega_acessos ela provavelmente está carregando os dados de forma incorreta gerando esse erro.

import csv

def carregar_acessos():

    X = []
    Y = []

    arquivo = open('acesso.csv', 'r')
    leitor = csv.reader(arquivo)

    next(leitor)

    for home, como_funciona, contato, comprou in leitor:

        dado = [int(home), int(como_funciona), int(contato)]
        X.append(dado)
        Y.append(int(comprou))

    return X, Y

Fiz alguns testes aqui e seu código funciona normalmente, então o erro provavelmente vem da função que carrega os dados, que está retornando os dados no tipo incorreto acarretando nesse problema de a variável d ser um array invés de um valor booleano.

Qualquer duvida não hesite em perguntar, bons estudos.