1
resposta

Erro do tipo ValueError ao utilizar o método fit() em modelos de Regressão Linear

Estava tentando rodar um algoritmo de Regressão Linear, utilizando o LinearRegression() do sklearn, para calcular o R^2 e também plotar a distribuição dos resíduos. Entretanto, toda vez em que utilizo o método LinearRegression().fit() a função scipy.linalg.lstsq() é chamada e ela gera um erro de incompatibilidade nos seus parâmetros. O erro é especificamente gerado no 4o parâmetro e pode ser visualizado a seguir:

~\miniconda3\lib\site-packages\scipy\linalg\basic.py in lstsq(a, b, cond, overwrite_a, overwrite_b, check_finite, lapack_driver)
   1221             raise LinAlgError("SVD did not converge in Linear Least Squares")
   1222         if info < 0:
-> 1223             raise ValueError('illegal value in %d-th argument of internal %s'
   1224                              % (-info, lapack_driver))
   1225         resids = np.asarray([], dtype=x.dtype)

ValueError: illegal value in 4-th argument of internal None

Os códigos que estou tentando rodar, que contam com os métodos fit() para a Regressão Linear, são os seguintes:

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

def roda_regressao_linear(train_x, test_x, train_y, test_y):
    modelo = LinearRegression()
    modelo.fit(train_x, train_y)
    predicao_modelo = modelo.predict(test_x)
    r2_score = modelo.score(test_x, test_y)

    mse = mean_squared_error(y_true = test_y, y_pred = predicao_modelo)
    mae = mean_absolute_error(y_true = test_y, y_pred = predicao_modelo)

    print("*" * 80)
    print(f"r2 score = {r2_score:.4f}")
    print(f"mse = {mse:.2f}")
    print(f"mae = {mae:.2f}")

    return modelo

modelo_reg_linear = roda_regressao_linear(train_x, test_x, train_y, test_y)
from yellowbrick.regressor import PredictionError
from yellowbrick.regressor import ResidualsPlot
from yellowbrick.regressor import residuals_plot

def visualiza_erros(train_x,train_y,test_x,test_y):
    visualizer = PredictionError(LinearRegression())
    visualizer.fit(train_x, train_y)
    visualizer.score(test_x, test_y)
    visualizer.poof()

    visualizer = ResidualsPlot(LinearRegression())
    visualizer.fit(train_x, train_y)
    visualizer.score(test_x, test_y)
    visualizer.poof()

visualiza_erros(train_x,train_y,test_x,test_y)
1 resposta

Olá, Douglas! Tudo bom com você? Espero que sim!

Primeiro, desculpa pela demora em responder.

Esse erro pode ter 4 soluções possíveis para ser corrigido.

Solução 1:

Elimine os valores NaN ou inf no seu banco de dados, esses valores podem gerar erros pois a biblioteca não vai saber trabalhar com eles. Então, você pode deletar esses dados utilizando o código abaixo:

df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all")

Solução 2:

Troque o dtype do array do seu banco de dados. Você pode fazer essa alteração antes de executar o fit(), para alterar o dtype do array você pode utilizar o código abaixo:

# sendo X e y variáveis do tipo array numpy
x = np.float32(x)
y = np.float32(x)

Solução 3:

Esse erro também pode ser gerado pela biblioteca Matplotlib e o LinearRegression, na hipótese de você estar fazendo algum plot com Matplotlib, você pode utilizar a biblioteca seaborn, nesse caso.

Solução 4:

A interface do Numpy pode estar associada a um programa específico, que gera um erro na execução de certas funções. Então, você pode instalar o Numpy pelo conda (caso você tenha o anaconda instalado) que vai associar ao Intel Math Kernel Library (MKL) que não gera esse erro. Se não tiver o Anaconda instalado, aconselho muito que o instale, você pode fazer isso seguindo esse guia de instalação no Windows. Para instalar o Numpy com o anaconda, abra o Anaconda Prompt pela barra de pesquisa: alt: Barra de pesquisa do Windows escrito Anaconda Prompt, uma seta vermelha está destacando o símbolo do Anaconda Prompt (Anaconda 3) que aparece após a pesquisa Depois de iniciada a prompt, execute o seguinte código:

conda install numpy

Eu espero ter te ajudado! 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!