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

Erro no gráfico final

Ao criar último gráfico da aula, é devolvido um erro

'ValueError: 'c' argument has 540 elements, which is inconsistent with 'x' and 'y' with size 1617.' 

O Decision Bundary é mostrado, mas os dados reais não são.

# importando a nova função:
from sklearn.preprocessing import StandardScaler

#### repetindo o restante do código ####

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

# importando dataset
url = 'https://gist.githubusercontent.com/guilhermesilveira/1b7d5475863c15f484ac495bd70975cf/raw/16aff7a0aee67e7c100a2a48b676a2d2d142f646/projects.csv'
dados = pd.read_csv(url)

# ajustando dataset 
map = {
    'expected_hours' : 'horas_esperadas',
    'price' : 'preco',
    'unfinished' : 'nao_finalizado'}

dados = dados.rename(columns = map)

trocar = {
    0 : 1,
    1: 0
}

dados['finalizado'] = dados['nao_finalizado'].map(trocar)


# atribuindo os dados a variáveis x e y
x = dados[['horas_esperadas', 'preco']]
y = dados['finalizado']

# atribuindo valor para aleatoriedade
SEED = 5
np.random.seed(SEED)

# separando os dados de treino e dados de teste (função: train_test_split())
raw_treino_x, raw_teste_x, treino_y, teste_y = train_test_split(x, y, test_size = 0.25, stratify = y, random_state = SEED)

print(f'Treinaremos com {len(treino_x)} elementos e testaremos com {len(teste_x)} elementos!')

##############################################
############ Padronizando escalas ############
##############################################
scaler = StandardScaler()
scaler.fit(treino_x)
treino_x = scaler.transform(raw_treino_x)
teste_x = scaler.transform(raw_teste_x)

# Criando o modelo
modelo = SVC(gamma='auto') 

# Treinando o modelo
modelo.fit(treino_x, treino_y)

# Testando o modelo
previsoes = modelo.predict(teste_x)

# Comparando modelo e gabarito => acurácia
acuracia = accuracy_score(teste_y, previsoes) * 100
print(f'A acurácia foi {acuracia:.2f}.')

# Gerando gráfico
data_x = treino_x[:,0]
data_y = treino_x[:,1]

# Definindo limites
x_min = data_x.min()
x_max = data_x.max()
y_min = data_y.min()
y_max = data_y.max()

# determinando o tamanho do pixel representado
pixels = 100

eixo_x = np.arange(x_min, x_max, (x_max - x_min)/pixels)
eixo_y = np.arange(y_min, y_max, (y_max - y_min)/pixels)

xx, yy = np.meshgrid(eixo_x, eixo_y)
pontos = np.c_[xx.ravel(), yy.ravel()]

Z = modelo.predict(pontos)
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(data_x, data_y, c=teste_y, s=2)
2 respostas
solução!

Olá, Allan! Tudo tranquilo com você?

O está está na seguinte linha de código:

# Gerando gráfico
data_x = treino_x[:,0]
data_y = treino_x[:,1]

como o shape de treino_x é de (1617, 2), quando você executar as linhas de código acima o shape de data_x e data_y serão (1617,), logo quando vai plotar o gráfico scatter, através da seguinte linha de código: plt.scatter(data_x, data_y, c=teste_y, s=2) nos é retornado que os tamanhos dos parâmetros usados estão inconsistentes, pois teste_y tem shape (540,).

Para resolver esse problema basta utilizar o array teste_x, que é o array que o professor utiliza em aula, da seguinte forma:

# Gerando gráfico
data_x = teste_x[:,0]
data_y = teste_x[:,1]

Dessa forma o shape dos vetores usados para plotar o gráfico serão coincidentes e não gerará erros.

Para visualizar o shape de algum array executamos a seguinte linha de código:

treino_x.shape

Saída:

(1617, 2)

1617 é o número de linhas do array, e 2 o número de colunas.

Espero ter ajudado, mas se ainda persistir alguma dúvida estou sempre à disposição.

:)

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

Muito obrigado, Bruno! Reli o código da aula 500 vezes mas não tinha reparado nesse erro haha