1
resposta

ConvergenceWarning: Liblinear failed to converge(...)

o meu modelo está dando uma acurácia diferente do que foi proposto no exercício e logo abaixo aparece esse "erro".

Não consigo identificar o porque disso, já que o código está exatamente igual.

Treinaremos com 1617 elementos e testaremos com 540 elementos A acurácia foi 47.41% /usr/local/lib/python3.7/dist-packages/sklearn/svm/_base.py:1208: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations. ConvergenceWarning,

1 resposta

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!