Olá, Lucas! Tudo tranquilo por aí?
O motivo que o resultado obtido pelo professor ser diferente do obtido por você é que no método LinearSVC() possui o parâmetro random_state=None, conforme a documentação. Quando você vê em alguma documentação que o random_state por padrão é None, significa que quando você não passar esse parâmetro o valor usado será totalmente aleatório. Se observarmos esse glossário, na parte que é falado de random_state, é informado que quando o random_state é igual a None é utilizado a instância global de numpy.random, isso significa que podemos definir todos os random_state (dentro da célula do notebook) das funções diretamente passando o seguinte código comandos:
SEED = 20
np.random.seed(SEED)
Então quando apenas definimos o valor de SEED e não utilizamos o parâmetro np.random.seed(SEED)
, o LinearSVC inicia com valores aleatórios também, isso não é possível de notar durante a aula porque o instrutor roda apenas uma vez, então não sabemos ao certo qual o valor que o LinearSVC é iniciado. Então temos duas possibilidades para corrigir esse problema de aleatoriedade, o primeiro é passando o parâmetro random_state=SEED
em LinearSVC(), dessa forma:
# início do código
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
SEED = 20
treino_x, teste_x, treino_y, teste_y = train_test_split(x, y,
random_state = SEED, test_size = 0.25,
stratify = y)
print("Treinaremos com %d elementos e testaremos com %d elementos" % (len(treino_x), len(teste_x)))
modelo = LinearSVC(random_state = SEED)
modelo.fit(treino_x, treino_y)
previsoes = modelo.predict(teste_x)
acuracia = accuracy_score(teste_y, previsoes) * 100
print("A acurácia foi %.2f%%" % acuracia)
Saída:
Treinaremos com 1617 elementos e testaremos com 540 elementos
A acurácia foi 47.41%
ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
warnings.warn(
Ou utilizar a linha de código que define a SEED para todos os random_state necessários do código, o np.random.seed = SEED
.
# início do código
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
import numpy as np
SEED = 20
np.random.seed(SEED)
treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, test_size = 0.25
,random_state = SEED
,stratify = y)
print("Treinaremos com %d elementos e testaremos com %d elementos" % (len(treino_x), len(teste_x)))
modelo = LinearSVC()
modelo.fit(treino_x, treino_y)
previsoes = modelo.predict(teste_x)
acuracia = accuracy_score(teste_y, previsoes) * 100
print("A acurácia foi %.2f%%" % acuracia
Saída:
Treinaremos com 1617 elementos e testaremos com 540 elementos
A acurácia foi 47.41%
ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
warnings.warn(
Dessa forma você vai notar que não vai acontecer mais a variação de valores de acurácia. Sobre o aviso que você está recebendo, ele não afeta em nada seus resultados, só está informando que o modelo não conseguiu convergir e é necessário aumentar o número de iterações, você pode fazer isso passando o parâmetro max_iter = 1500
, por exemplo, dentro de LinearSVC(), como mostro no código abaixo, mas pode ser que a mensagem ainda persista, porque o LinearSVC é usado para problemas lineares e no caso do curso é um problema não linear. Você pode conferir outra resposta sobre o assunto neste link.
# início do código
modelo = LinearSVC(max_iter=1500)
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!