1
resposta

Dúvida: Erro de formato de variável

Oi, pessoal! Usei o código abaixo para plottar meu scatterplot:

ax = sns.scatterplot(x=y_train, y=y_previsto_train)
ax.set_ylabel("Consumo (em litros)")
ax.set_title("Distribuição de Consumo de Cerveja")

Apesar da semântica do meu código estar correta, está o seguinte erro:

ValueError                                Traceback (most recent call last)
<ipython-input-61-bd5a3c9d1c2e> in <module>
----> 1 ax = sns.scatterplot(x=y_train, y=y_previsto_train)
      2 ax.set_ylabel("Consumo (em litros)")
      3 ax.set_title("Distribuição de Consumo de Cerveja")

~\anaconda3\lib\site-packages\seaborn\_decorators.py in inner_f(*args, **kwargs)
     44             )
     45         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 46         return f(**kwargs)
     47     return inner_f
     48 

~\anaconda3\lib\site-packages\seaborn\relational.py in scatterplot(x, y, hue, style, size, data, palette, hue_order, hue_norm, sizes, size_order, size_norm, markers, style_order, x_bins, y_bins, units, estimator, ci, n_boot, alpha, x_jitter, y_jitter, legend, ax, **kwargs)
    792 
    793     variables = _ScatterPlotter.get_semantics(locals())
--> 794     p = _ScatterPlotter(
    795         data=data, variables=variables,
    796         x_bins=x_bins, y_bins=y_bins,

~\anaconda3\lib\site-packages\seaborn\relational.py in __init__(self, data, variables, x_bins, y_bins, estimator, ci, n_boot, alpha, x_jitter, y_jitter, legend)
    578         )
    579 
--> 580         super().__init__(data=data, variables=variables)
    581 
    582         self.alpha = alpha

~\anaconda3\lib\site-packages\seaborn\_core.py in __init__(self, data, variables)
    602     def __init__(self, data=None, variables={}):
    603 
--> 604         self.assign_variables(data, variables)
    605 
    606         for var, cls in self._semantic_mappings.items():

~\anaconda3\lib\site-packages\seaborn\_core.py in assign_variables(self, data, variables)
    665         else:
    666             self.input_format = "long"
--> 667             plot_data, variables = self._assign_variables_longform(
    668                 data, **variables,
    669             )

~\anaconda3\lib\site-packages\seaborn\_core.py in _assign_variables_longform(self, data, **kwargs)
    909         # Construct a tidy plot DataFrame. This will convert a number of
    910         # types automatically, aligning on index in case of pandas objects
--> 911         plot_data = pd.DataFrame(plot_data)
    912 
    913         # Reduce the variables dictionary to fields with valid data

~\anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
    466 
    467         elif isinstance(data, dict):
--> 468             mgr = init_dict(data, index, columns, dtype=dtype)
    469         elif isinstance(data, ma.MaskedArray):
    470             import numpy.ma.mrecords as mrecords

~\anaconda3\lib\site-packages\pandas\core\internals\construction.py in init_dict(data, index, columns, dtype)
    281             arr if not is_datetime64tz_dtype(arr) else arr.copy() for arr in arrays
    282         ]
--> 283     return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
    284 
    285 

~\anaconda3\lib\site-packages\pandas\core\internals\construction.py in arrays_to_mgr(arrays, arr_names, index, columns, dtype, verify_integrity)
     76         # figure out the index, if necessary
     77         if index is None:
---> 78             index = extract_index(arrays)
     79         else:
     80             index = ensure_index(index)

~\anaconda3\lib\site-packages\pandas\core\internals\construction.py in extract_index(data)
    385 
    386         if not indexes and not raw_lengths:
--> 387             raise ValueError("If using all scalar values, you must pass an index")
    388 
    389         if have_series:

ValueError: If using all scalar values, you must pass an index

Dando uma olhada no código do erro, acho que meus dados precisam de um index para conseguir passar no sns.scatterplot. Pensando dessa forma, verifiquei que meu y_previsto_train era um array e o transformei em Data Frame com o pandas, como demonstrado abaixo:

y_previsto_train = modelo.predict(X_train)
y_previsto_train = pd.DataFrame(y_previsto_train) 

Tentei refazer o gráfico, mas o mesmo erro continua aparecendo. Alguém teria uma sugestão?

1 resposta

Olá Gabriel, tudo bem? Espero que sim!

Fui seguindo o notebook da aula, realizando o train_test_split nos dados e posteriormente criando o modelo de regressão linear, usando o fit e o predict da forma como foi passado em aula e rodei o código que me passou e rodou sem problemas:

Gráfico de dispersão entre o y treino e t previsto

Tente rever a forma como criou o modelo e separou os seus dados de treino e teste. Pode ser que tenha ocorrido um problema nessa parte.

import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

dados = pd.read_csv('../Dados/Consumo_cerveja.csv', sep=';')
y = dados['consumo']
X = dados[['temp_max', 'chuva', 'fds']]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2811)
modelo = LinearRegression()
modelo.fit(X_train, y_train)
y_previsto_train = modelo.predict(X_train)
ax = sns.scatterplot(x=y_train, y=y_previsto_train)
ax.set_ylabel("Consumo (em litros)")
ax.set_title("Distribuição de Consumo de Cerveja")

O resumo dos códigos para chegar até esse ponto deve ser o que foi apresentado acima, com todas as variáveis definidas de maneira correta e todos os imports necessários. Além do conjunto de dados estar na pasta de onde o caminho está sugerindo.

Bons estudos!