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

O gráfico continua linear...

Mesmo depois de alterar de LinearSVC para SVC, o gráfico continua com o comprotamento Linear.

import pandas as pd
from sklearn.svm import LinearSVC, SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
import numpy as np
!pip install seaborn==0.9.0
import seaborn as sns
import matplotlib.pyplot as plt

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

renomear = {
    'expected_hours' : 'horas_esperadas',
    'price' : 'preco',
    'unfinished' : 'nao_finalizado'
}
dados = dados.rename(columns = renomear)
dados.head()

change = {0:1, 1:0}
dados['finalizado'] = dados['nao_finalizado'].map(change)

dados_x = dados[['horas_esperadas','preco']]
dados_y = dados['finalizado']

#SEPARAR AMOSTRAS
seed = 10
np.random.seed(seed)
train_x, test_x, train_y, test_y = train_test_split(dados_x, dados_y, test_size = 0.25, stratify = dados_y)

print(f'Treinaremos com {train_y.shape[0]} elementos e testaremos com {test_y.shape[0]} elementos')

#criar modelo
modelo = SVC()
modelo.fit(train_x, train_y)
predict = modelo.predict(test_x)
acuracia = accuracy_score(test_y, predict)
print(f'A acurácia do modelo foi de {round(acuracia*100,2)}%')

x_min = test_x['horas_esperadas'].min()
x_max = test_x['horas_esperadas'].max()
y_min = test_x['preco'].min()
y_max = test_x['preco'].max()

print(x_min, x_max, y_min, 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()]

#usando o modelo
Z = modelo.predict(pontos)
Z = Z.reshape(xx.shape)
Z.shape

import matplotlib.pyplot as plt
plt.contourf(xx, yy, Z, alpha=0.30)
plt.scatter(test_x['horas_esperadas'], test_x['preco'], s=1, c=test_y)
3 respostas

Oi Leonardo! Tudo bom com você?

Aqui mesmo no fórum, existe uma resposta para uma dúvida muito semelhante a sua, você pode checar a resposta no tópico O resultado gráfico não ficou com o esperado.

Se o problema persistir ou surgir outra dúvida estarei disposta a ajudar ;-)

Bons estudos!

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

Acho que a resposta não ajuda o meu caso. Mesmo com alteração nos dados, o gráfico não deveria mais ser linear, já que não estou mais usando o LinearSVC. A imagem que encontro é essa:

Imagem gerada pelo código sem LinearSVC

solução!

Olá, Leonardo!

Observando melhor a documentação desse modelo, é possivel notar que ocorreu uma atualização do padrão do parâmetro gamma. Esse parâmetro é responsável por definir quão importante é um único exemplo. Na época da preparação do curso, gamma estava padronizado como auto que tem o cálculo de gamma definido por 1 / n_features. No entanto, com a atualização, o padrão gamma se tornou scale, que tem a adição do elemento de variância da matriz X, definido por 1 / (n_features * X.var()). A atuação do parâmetro gamma= 'scale' modificou bastante o comportamento esperado para esse gráfico, tornando-o semelhante ao LinearSVC.

Para corrigir essa divergência, você pode adicionar o parâmetro gamma= 'auto' no código do modelo do seguinte modo:

#criar modelo
modelo = SVC(gamma='auto')

Se estiver interessado em saber mais sobre o parâmetro gamma, você pode visualizar a documentação. OBS: Infelizmente a documentação está em inglês, então, caso tenha dificuldade em relação a este idioma, indico que tente utilizar o tradutor do navegador para conseguir efetuar a leitura em português, mas qualquer dúvida ou dificuldade estarei à disposição

Eu espero ter te ajudado! Qualquer outra dúvida estarei disposta a ajudar ;-)

Bons estudos!

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