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

Dúvidas em torno do SEED

Tenho diversas dúvidas quanto ao utilização do SEED no curso, visto que a partir do momento que os resultados começaram a ser plotados, meus resultados divergiram MUITO aos apresentados em aula (embora isso não faça sentido uma vez que o SEED está sendo o mesmo). Entendo que o fato de ter que utilizar o (dual = False) no LinearSVC() para tirar o Warning tenha interferido nos resultados, visto que na própria documentação há algo sobre isso (embora que no SVC() eu não utilizei o dual = False e mesmo assim os resultados foram diferentes dos do instrutor), mas tentarei me ater a uma pergunta apenas:

  • Nessa aula de utilização do SVC(), mesmo usando o SEED = 5 e o np.random.seed(SEED), quando eu executo meu código, a acurácia sempre ALTERNA entre dois valores: 66.85% (como está na aula, OK), e 55.19%. Por que isso ocorre?

Acredito eu que meu código não está incorreto, já que verifiquei inúmeras vezes (inclusive para tentar entender do porquê meus resultados anteriores divergirem TANTO), mas segue ele:

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import numpy as np

SEED = 5
np.random.seed(SEED)  # Essa função determina uma SEED específica para todo o modelo, não precisamos repetir para outras funções

raw_treino_x, raw_teste_x, treino_y, teste_y = train_test_split(x, 
                                                        y,
                                                        test_size = 0.25,
                                                        stratify = y) # estratificando de acordo com o y para ficar os resultados ficarem mais proporcionais
print('Treinaremos com %d elementos, e testaremos com %d elementos.' % (len(treino_x), len(teste_x)))

scaler = StandardScaler()
scaler.fit(treino_x)
treino_x = scaler.transform(raw_treino_x) # esse scaler.transofrom() transforme o df Pandas em uma array de arrays
teste_x = scaler.transform(raw_teste_x)

modelo = SVC()
modelo.fit(treino_x, treino_y)
previsoes = modelo.predict(teste_x)

acuracia = accuracy_score(teste_y, previsoes) * 100
print('A acurácia foi de %.2f%%.' % acuracia)

Output: Ora é Treinaremos com 1617 elementos, e testaremos com 540 elementos. A acurácia foi de 66.85%.

Ora é Treinaremos com 1617 elementos, e testaremos com 540 elementos. A acurácia foi de 55.19%.

2 respostas
solução!

Oii Bruno, tudo certinho por ai? Espero que sim!!

Alguns resultados provavelmente vão divergir com os apresentados durante o curso, o dataset que temos disponível no GitHub para utilização durante as aulas foi atualizado, então quando o Guilherme gravou o curso, por exemplo, o valor de y_max do dataset dele é de 27738, já no dataset disponível para usarmos o y_max é de 30223.

Agora, sobre seu problema de variação de acurácia, eu testei seu código por aqui e ele realmente estava tendo a variação com os mesmos valores que você comentou, porém encontrei um pequeno detalhe que pode ter passado batido por ti. Em scaler.fit() precisamos usar o raw_treino_x e não apenas o treino_x. Depois de fazer essa alteração, a acurácia estabilizou em 66,85%, o seu código já com a correção está a seguir:

#início do código

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import numpy as np

SEED = 5
np.random.seed(SEED)  # Essa função determina uma SEED específica para todo o modelo, não precisamos repetir para outras funções

raw_treino_x, raw_teste_x, treino_y, teste_y = train_test_split(x,y,
                                                        test_size = 0.25,
                                                        stratify = y) # estratificando de acordo com o y para ficar os resultados ficarem mais proporcionais
print('Treinaremos com %d elementos, e testaremos com %d elementos.' % (len(treino_x), len(teste_x)))

scaler = StandardScaler()
scaler.fit(raw_treino_x) #aqui estava o treino_x ao invés de raw_treino_x
treino_x = scaler.transform(raw_treino_x) # esse scaler.transofrom() transforme o df Pandas em uma array de arrays
teste_x = scaler.transform(raw_teste_x)

modelo = SVC()
modelo.fit(treino_x, treino_y)
previsoes = modelo.predict(teste_x)

acuracia = accuracy_score(teste_y, previsoes) * 100
print('A acurácia foi de %.2f%%.' % acuracia)

#final do código

Sobre os warnings que podem aparecer pelo código, indicando que o código não convergiu, eles não interferem nos seus resultados, então não tem problema você tirar eles de vista. Inclusive, tenho uma recomendação para que os warnings não apareçam pelo código, você pode usar o código abaixo. E se quiser saber mais sobre as categorias de warnings, desativação de warnings e parâmetros que podem ser passados nessa biblioteca, recomendo ler a documentação de warnings.

# início do código

import warnings
warnings.filterwarnings("ignore")

#final do código

Espero ter conseguido te auxiliar, mas qualquer outra dúvida estou por aqui!

Bons estudos ^^

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

Obrigado Sthefanie!