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

retorno prompt aula 02 - curso Machine Learning

Boa tarde, estou rodando o seguinte programa passado pelo professor, na aula 02 do curso Machine Learning: Introdução a Classificação

from ML_acessos 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)

Contudo, estou tendo o seguinte retorno no prompt:

C:\Users\oggui\OneDrive\Área de Trabalho\Alura\Machine Learning>python classifica_acessos.py
C:\Users\oggui\AppData\Local\Programs\Python\Python37-32\lib\site-packages\sklearn\utils\validation.py:761: 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_acessos.py", line 18, in <module>
    acertos = [d for d in diferencas if d == 0]
  File "classifica_acessos.py", line 18, in <listcomp>
    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()

Estou rodando exatamente o mesmo programa que o professor fez na aula, não entendo o por que do erro. Previamente quebrei o "for" e o "if", e o erro está aparentemente no "if d ///==0" mas não consigo entender o motivo.

Obs.: Professor está rodando no MAC e no python 2.7, eu estou rodando no W10 e no python 3.6, mas o "if" não era para apresentar diferença, ou é esse o problema?

2 respostas

Quebrando o for e if, conforme havia comentado, fico com o código da seguinte forma:

from ML_acessos 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

for d in diferencas:
    if d == 0:
        acertos = 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)

Recebendo o retorno do prompt:

C:\Users\oggui\AppData\Local\Programs\Python\Python37-32\lib\site-packages\sklearn\utils\validation.py:761: 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 "verifica_erro.py", line 19, 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()

Ainda não consegui resolver esta questão, aguardo retorno.

solução!

Boa tarde Guilherme, tudo bem?

Este erro ocorre porque nesta compressão de lista: [d for d in diferencas if d == 0] d é um array do numpy e não um valor. Por isso na hora de comparar com 0 é apresentado um erro.

mude no carregar_acessos de

Y.append([int(comprou)])

para

Y.append(int(comprou))

Bons estudos!