1
resposta

Gráfico diferente com o apresentado na aula

Olá, pessoal! Estou com alguns problemas para gerar para gerar o gráfico de horas X preco tal qual mostrado na aula. Baixei o .py para ver se vocês conseguem me dar uma ajuda. Desde já agradeço:

# -*- coding: utf-8 -*-
"""playground_3.ipynb

Automatically generated by Colaboratory.

Original file is located at
    https://colab.research.google.com/drive/13hrLVCm5adV9fAPlIC8OGo3d6oRJg7Ef
"""

!pip install seaborn==0.9.0

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

# Inicializao

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

# dados

# Tratamento inicial
dados_mapper = {
    'unfinished': 'nao_finalizado',
    'expected_hours': 'horas_esperadas',
    'price': 'preco'
}

dados.rename(columns=dados_mapper, inplace=True)

if 'nao_finalizado' in dados:
  dados['finalizado'] = dados['nao_finalizado'].replace({0: 1, 1: 0})
  del dados['nao_finalizado']

# dados

# Plotagem inicial de todos os dados
sns.scatterplot(data=dados, x='horas_esperadas', y='preco', hue='finalizado')

# Inicio dos dados de testagem
SEED = 5
np.random.seed(SEED)

x = dados[['preco', 'horas_esperadas']]
y = dados['finalizado']

x_treino, x_teste, y_treino, y_teste = train_test_split(x, y, test_size=1/4, stratify = y, random_state=SEED)

print(y_teste)

print('Usando %d para treino e %d para teste' % (len(x_treino), len(x_teste)))

# Treinando o modelo
modelo = LinearSVC(dual = False, random_state=SEED)
modelo.fit(x_treino, y_treino.values)

# Teste de precisao baseline

baseline_previsao = np.ones(len(x_teste))
precisao = accuracy_score(y_teste, baseline_previsao) * 100

print('Precisao baseline foi de %.2f%%' %(precisao))

# Teste de precisao linear
previsoes = modelo.predict(x_teste)
precisao = accuracy_score(y_teste, previsoes) * 100

print('Precisao linear foi de %.2f%%' %(precisao))

# Conclusao: precisao linear ruim nessa aplicacao;
# Plotagem do grafico no qual o algoritimo deve reconhcer o padrao de curva

sns.scatterplot(data=x_teste, x='horas_esperadas', y='preco', hue=y_teste)

# Analizar a decisao do algo em "todos" pontos possiveis do gráfico, com finalidade de visualizar a curva compreendida pelo algoritimo
# Montar os pontos

x_min = x_teste.horas_esperadas.min()
x_max = x_teste.horas_esperadas.max()
y_min = x_teste.preco.min()
y_max = x_teste.preco.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(x_teste.horas_esperadas, x_teste.preco, c=y_teste, s=1)

from sklearn.svm import SVC

SEED = 5
np.random.seed(SEED)
treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, test_size = 0.25,
                                                         stratify = y)
print("Treinaremos com %d elementos e testaremos com %d elementos" % (len(treino_x), len(teste_x)))

modelo = SVC(gamma='auto')
modelo.fit(treino_x, treino_y)

data_x = x_teste['horas_esperadas']
data_y = x_teste['preco']

x_min = data_x.min()
x_max = data_x.max()
y_min = data_y.min()
y_max = data_y.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)

import matplotlib.pyplot as plt

plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(data_x, data_y, c=y_teste, s=1)

1 resposta

Oi Daniel! Tudo bem com você? Espero que sim!

Testei seu código e notei que a diferença é resultante de uma pequena diferença na criação dos valores de teste e treino no seu código, mais precisamente, na seleção das colunas de dados para x:

x = dados[['preco', 'horas_esperadas']]

No entanto, toda a análise da aula e do seu código é feita considerando a ordem inversa da seleção das colunas, ou seja:

x = dados[['horas_esperadas','preco']]

Então, para solucionar a diferença dos gráficos você pode apenas trocar a ordem das colunas bem como mostrado no código acima.

Eu espero ter te ajudado! Se surgir outra dúvida estarei à disposição.

Bons estudos!

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