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

Problemas com o Matplotlib, não faz o gráfico

Olá

Vi que uma pessoa teve o mesmo problema, mas mesmo eu usando o:

Z = modelo.predict(pontos)
Z = Z.reshape(xx.shape)

Ainda da erro com o Matplotlib. Fiz tudo igual, pelo menos eu acho hehe, só não traduzi as colunas. Estou usando o VSCode.

Erro: ValueError: 'c' argument must be a color, a sequence of colors, or a sequence of numbers, not finalizado ValueError: Invalid RGBA argument: 'finalizado'

Parece que no c=teste_y, ele quer uma cor.

O que eu posso fazer?

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
import numpy as np

uri = "https://gist.githubusercontent.com/guilhermesilveira/1b7d5475863c15f484ac495bd70975cf/raw/16aff7a0aee67e7c100a2a48b676a2d2d142f646/projects.csv"
dados = pd.read_csv(uri)

troca = {
    0:1,
    1:0
}

dados['finalizado'] = dados.unfinished.map(troca)

x = dados[['expected_hours', 'price']]
y = dados[['finalizado']]
SEED = 20

treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, random_state=SEED,  test_size=0.25, stratify= y)

modelo = LinearSVC()
modelo.fit(treino_x, treino_y)
previsoes = modelo.predict(teste_x)
acuracia = accuracy_score(teste_y, previsoes) * 100

x_min = teste_x.expected_hours.min()
x_max = teste_x.expected_hours.max()
y_min = teste_x.price.min()
y_max = teste_x.price.max()

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.scatter(teste_x.expected_hours, teste_x.price, c=teste_y, s=1)
plt.show()
2 respostas
solução!

Olá, Matheus! Tudo tranquilo por aí?

O erro está acontecendo porque o parâmetro c está esperando uma Series do pandas e você está passando um DataFrame.

Para resolver esse problema basta alterar a forma como você está obtendo o y (pois o teste_y depende dessa variável ao realizar o train_test_split) para obter uma Series para a seguinte forma:

y = dados['finalizado']

Você está passando entre colchetes:

y = dados[['finalizado']]

O código completo fica da seguinte forma:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
import numpy as np

uri = "https://gist.githubusercontent.com/guilhermesilveira/1b7d5475863c15f484ac495bd70975cf/raw/16aff7a0aee67e7c100a2a48b676a2d2d142f646/projects.csv"
dados = pd.read_csv(uri)

troca = {
    0:1,
    1:0
}

dados['finalizado'] = dados.unfinished.map(troca)

x = dados[['expected_hours', 'price']]
y = dados['finalizado']
SEED = 20

np.random.seed(SEED)

treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, test_size=0.25, stratify= y)

modelo = LinearSVC()
modelo.fit(treino_x, treino_y)
previsoes = modelo.predict(teste_x)
acuracia = accuracy_score(teste_y, previsoes) * 100

x_min = teste_x.expected_hours.min()
x_max = teste_x.expected_hours.max()
y_min = teste_x.price.min()
y_max = teste_x.price.max()

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(teste_x.expected_hours, teste_x.price, c=teste_y, s=1)
plt.show()

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!

Nossa, muito obrigado!! Nunca imaginei que esse era o problema.