1
resposta

Erro ao usar Yellowbrick

De acordo com o projeto, devemos criar a função split para separar os dados de teste dos dados de treinamento. Assim, construir a função split abaixo:

def split(dados, rotulo):
    # seed
    # train_test_split
    train_x, test_x, train_y, test_y = train_test_split(dados, rotulo, random_state=42367)
    print("*" * 80)
    print("Quebrando em treino (x,y) e teste (x,y)", train_x.shape, train_y.shape, test_x.shape, test_y.shape)
    print("Usando colunas %s como X" % str(train_x.columns.values))
    print("Desvio padrão do conjunto de testes", test_y.std())
    return train_x, test_x, train_y, test_y

O retorno da função split criada no projeto é: Quebrando em treino (x,y) e teste (x,y) (33201, 2) (33201, 1) (11067, 2) (11067, 1) ; Usando colunas ['NU_NOTA_MT' 'NU_NOTA_LC'] como X; Desvio padrão do conjunto de testes nota_total 396.677; dtype: float64.

O erro acontece quando executo o trecho de código abaixo

from yellowbrick.regressor import PredictionError

def visualiza_erros(train_x,train_y,test_x,test_y):
    model = LinearRegression()
    visualizer = PredictionError(model)
    visualizer.fit(train_x, train_y)
    visualizer.score(test_x, test_y)
    visualizer.poof()

visualiza_erros(train_x,train_y,test_x,test_y)

YellowbrickValueError: y must be a (1,) dimensional array not (11067, 1).

O que há de errado?

1 resposta

Olá Ricardo, tudo bem ? Espero que sim.

Pelo erro informado o DataFrame rotulos está com a dimensão errada. Imagino que esteja usando dois colchetes para fazer a seleção da coluna nota_total. Embora o resultado pareça o mesmo, na verdade é diferente.

Trouxe um exemplo para ilustrar isso. Criei um DataFrame simples.

Código:

import pandas as pd
df = pd.DataFrame({"Duração": [10,5,4,9], "Tipo": [1,1,3,1]})
df

Resultado:

DuraçãoTipo
0101
151
243
391

Se fizermos a seleção com dois colchetes, vamos obter um DataFrame com apenas uma coluna.

Código:

df[['Duração']].shape

Resultado:

(4, 1)

Mas se usarmos apenas um colchetes vamos obter uma Series, um objeto diferente de um DataFrame.

Código:

df['Duração'].shape

Resultado:

(4,)

Então o código do yellowbrick, faz a verificação utilizando o shape, para entender se ele é compatível com a transformação interna dele. Algo como transformar a coluna em uma lista.

Se tivermos um DataFrame, nosso resultado será diferente. Com uma lista de listas por exemplo.

Código:

df[['Duração']].values.tolist()

Resultado:

[[10], [5], [4], [9]]

Quando usamos apenas um colchetes, vamos conseguir criar uma lista de números por exemplo.

Código:

df['Duração'].values.tolist()

Resultado:

[10, 5, 4, 9]

Então quando vamos definir o .Y ou seu projeto o rotulo, devemos utilizar apenas um colchetes.

Código:

Y = dados['nota_total']

Código:

rotulo = dados['nota_total']

Espero ter ajudado e qualquer duvida não hesite em perguntar.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!