Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Erro no predict utilizando a função Reshape

Quando gerei o predict (modelo.predict(27.74456356)) usei a função Reshape para organizar os dados em Array e código gerou o erro abaixo :

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-57-3e5aae9f4605> in <module>
----> 1 modelo.predict(27.74456356)

~/opt/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/_base.py in predict(self, X)
    223             Returns predicted values.
    224         """
--> 225         return self._decision_function(X)
    226 
    227     _preprocess_data = staticmethod(_preprocess_data)

~/opt/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/_base.py in _decision_function(self, X)
    205         check_is_fitted(self)
    206 
--> 207         X = check_array(X, accept_sparse=['csr', 'csc', 'coo'])
    208         return safe_sparse_dot(X, self.coef_.T,
    209                                dense_output=True) + self.intercept_

~/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    547                     "Reshape your data either using array.reshape(-1, 1) if "
    548                     "your data has a single feature or array.reshape(1, -1) "
--> 549                     "if it contains a single sample.".format(array))
    550             # If input is 1D raise error
    551             if array.ndim == 1:

ValueError: Expected 2D array, got scalar array instead:
array=27.74456356.
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

Mas quando usei o dado da bilheteria (bilheteria = 27.74456356) diretamente na função (modelo.coef_*27.74456356 + modelo.intercept_) consegui encontrar o valor do investimento. O que aconteceu de errado ?

5 respostas
solução

Fala, Jayson! Tudo certo por aí?

Ali no final da mensagem de erro diz que o método predict esperava um vetor 2D, mas recebeu um vetor unidimensional. Isso porque só temos uma variável como preditora. O método fit também, por isso nós precisamos transformar os dados com o reshape antes de treinar o modelo. Tenta rodar o seguinte:

modelo.predict(np.array(27.74456356).reshape(-1, 1))

Nesse caso, transformamos um float em um vetor com uma única instância pra respeitar a restrição do tipo de entrada.

Quando você usou modelo.coef_*27.74456356 + modelo.intercept_ deu certo porque, nesse caso, o vetor de coeficientes tem só uma instância por termos só uma variável preditora. Repare que o resultado dessa linha de código é um array. Repetir esse processo pra uma regressão com mais de uma uma variável preditora não retornaria um resultado correto.

Lá na documentação tem explicações bem completas sobre as entradas e as saídas dos atributos e métodos, mas espero ja ter dado uma luz.

Abraço.

Fala Leonel, tudo bem obrigado. E com você ?

Muito obrigado pela ajuda e pela rápida resposta! Já me deu uma enorme ajuda.

Na realidade preciso estudar um pouco mais a documentação porque muitas vezes não é evidente o passo a passo que o instrutor faz na aula, mas se tivermos o hábito que dar uma olhada na documentação isso nos auxilia muito nos estudos.

Valeu pela ajuda e Feliz Páscoa para você e sua família!

Forte abraço.

Olá Leonel, Gostaria de retomar minha dúvida mas ainda no tópico reshape(-1, 1). Fiz a leitura na documentação do Numpy referente ao método reshape tanto no array como no nparray, mas confeso que a documentação, para este tópico, não é clara kkkkEntendo que o reshape, como o próprio nome diz, cria um novo formato para uma matriz ou vetor. Mas a dúvida está mais relacionada ao (-1). Fiz mais pesquisas no stackoverflow e em outros sites também para ver alguns exemplos de aplicação, mas com explicação confusas como que o reshape cria uma 'dimensão desconhecida', etc. Por favor, poderia me explicar o que realmente o reshape faz quando é utilizado com o (-1) nos casos específicos de : reshape(1, -1) ou reshape(-1, 1). Poderia dar alguns exemplos para estes casos para que possa visualizar e compreender exatamente o que acontece com o vetor, matriz, array. Agradeço antecipadamente. Grande abraço.

Opa! Tudo certo?

Eu vou confessar que ainda sou bem júnior em muita coisa. Abri o código fonte e não consegui tirar uma explicação, mas dando uma olhada na documentação e alguns fóruns por aí e fazendo uns testes, a minha conclusão é que o -1 vêm da notação indicial.

Ali na mensagem de erro, diz que precisamos usar (-1, 1) pra quando temos apenas uma feature e (1, -1) pra quando temos apenas uma instância. Lembrando que o primeiro item da tupla representa o novo número de linhas e o segundo, o novo número de colunas. Imagino que, de alguma forma, internamente o numpy use o numero de itens do array e esse -1 indique que é até o último porque nós não temos um número fixo pra esse valor. É sempre 1 linha e n colunas ou n linhas pra 1 coluna.

array = np.array([[1, 2, 3],
                  [4, 5, 6]])

reshaped1 = array.reshape(1, -1)
reshaped2 = array.reshape(-1, 1)

print(reshaped1)
print(reshaped2)

Espero ter ajudado.

Até mais.

Olá Leonel,

Velho pra estagiário você está com conhecimento bem avançado! Suas explicações ajudaram muito! Show.

Parabéns pela dedicação e pela disponibilidade em ajudar!

Muito obrigado mais uma vez.

Forte abraço.