6
votes

ValueError: valeur illégale dans le 4-ème argument de None interne lors de l'exécution de sklearn LinearRegression (). Fit ()

Pour une raison quelconque, je ne peux plus faire fonctionner correctement ce bloc de code:

 ** On entry to DLASCLS parameter number  4 had an illegal value
Traceback (most recent call last):
  File ".\run.py", line 18, in <module>
    lm.fit(x.reshape(-1, 1), y)
  File "C:\Python37\lib\site-packages\sklearn\linear_model\_base.py", line 547, in fit
    linalg.lstsq(X, y)
  File "C:\Python37\lib\site-packages\scipy\linalg\basic.py", line 1224, in lstsq
    % (-info, lapack_driver))
ValueError: illegal value in 4-th argument of internal None
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# Create linear data with some noise
x = np.random.uniform(0, 100, 1000)
y = 2. * x + 3. + np.random.normal(0, 10, len(x))

# Plot data
plt.scatter(x, y)
plt.plot(np.linspace(0, 100, 10), 2. * np.linspace(0, 100, 10) + 3., ls='--', c='red')

# Fit linear data with sklearn LinearRegression
lm = LinearRegression()
lm.fit(x.reshape(-1, 1), y)

Je ne sais pas pourquoi j'obtiens cette erreur sur un exemple aussi simple. Voici mes versions actuelles:

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# Create linear data with some noise
x = np.random.uniform(0, 100, 1000)
y = 2. * x + 3. + np.random.normal(0, 10, len(x))

# Fit linear data with sklearn LinearRegression
lm = LinearRegression()
lm.fit(x.reshape(-1, 1), y)

J'exécute ceci sur Windows 10 Entreprise 64 bits et Python 3.7.3. J'ai essayé de désinstaller et de réinstaller scipy et scikit-learn. J'ai essayé une version antérieure de scipy. J'ai essayé de désinstaller et de réinstaller Python et aucun de ceux-ci n'a résolu le problème.

Mise à jour : il semble donc également lié à matplotlib. J'exécutais cet exemple précédemment dans Pycharm, mais je suis passé à l'exécuter directement à partir de PowerShell. Donc, si j'exécute ce code en dehors de Pycharm, je n'obtiens pas d'erreur

scipy.__version__
'1.5.0'
sklearn.__version__
'0.23.1'

Cependant, si je trace les données pendant cela, j'obtiens une erreur:

Traceback (most recent call last):
  File "<input>", line 2, in <module>
  File "C:\Python37\lib\site-packages\sklearn\linear_model\_base.py", line 547, in fit
    linalg.lstsq(X, y)
  File "C:\Python37\lib\site-packages\scipy\linalg\basic.py", line 1224, in lstsq
    % (-info, lapack_driver))
ValueError: illegal value in 4-th argument of internal None
import numpy as np
from sklearn.linear_model import LinearRegression

# Create linear data with some noise
x = np.random.uniform(0, 100, 1000)
y = 2. * x + 3. + np.random.normal(0, 10, len(x))

# Fit linear data with sklearn LinearRegression
lm = LinearRegression()
lm.fit(x.reshape(-1, 1), y)

Mais si je commente la ligne plt.plot(np.linspace(0, 100, 10), 2. * np.linspace(0, 100, 10) + 3., ls='--', c='red') ça marche bien.


10 commentaires

Il vous manque la bibliothèque lapack (elle fait de l'algèbre linéaire). Comment avez-vous installé python? Essayez plutôt d'utiliser miniconda .


J'ai installé du python avec du chocolat. LAPACK était l'une de mes intuitions, mais je ne savais pas comment diagnostiquer si c'était réellement le problème


dlascls est de lapack. Vous pouvez trouver de nombreux appels à l'aide montrant le même message concernant le paramètre 4. Peut-être que l'utilisation d'une version plus récente ou d'une implémentation différente aiderait?


Quelle est la meilleure façon d'installer / désinstaller / mettre à jour lapack sous Windows?


Permettez-moi de suggérer à nouveau miniconda :)


J'ai installé un nouvel environnement python avec miniconda et installé LAPACK avec conda install -c conda-forge lapack mais j'obtiens toujours la même erreur


Vous devez simplement installer numpy / scipy / scikit via conda. Et assurez-vous que vous utilisez le python de conda et non votre ancien python. Le moyen le plus simple est d'utiliser le terminal anaconda (l'invite doit avoir un (base) avant le répertoire courant)


Oui c'est ce que j'ai essayé et j'ai toujours eu le même problème


Désolé, j'ai installé ces packages avec PIP à l'intérieur de l'invite anaconda mais je les ai juste désinstallés et réinstallés avec conda et cela semble fonctionner!


Génial! Conda peut parfois donner des maux de tête


7 Réponses :


0
votes

Vous manquez plt.show () dans votre code. Mettez-le après cette ligne:

plt.plot(np.linspace(0, 100, 10), 2. * np.linspace(0, 100, 10) + 3., ls='--', c='red')
plt.show()


0 commentaires

1
votes

Depuis numpy 1.19.1 et sklearn v0.23.2, j'ai trouvé que polyfit (deg = 1) et LinearRegression (). Fit () donnaient des erreurs inattendues sans aucune bonne raison. Non, les données n'avaient aucune valeur NaN ou Inf. J'ai finalement utilisé scipy.stats.linregress ().

slope, intercept, r_value, p_value, std_err = stats.linregress(x.astype(np.float32), y.astype(np.float32))


0 commentaires

0
votes

Je vous suggère d'utiliser le paramètre normalize=True dans votre code pour éviter cela.

LinearRegression(fit_intercept=True,
                 normalize=True,
                 copy_X=True,
                 n_jobs=None)

Cela a résolu l'erreur pour moi.


0 commentaires

0
votes

Vérifiez d'abord les valeurs nan, inf. et essayez aussi normalize = True

try: 
    lreg=LinearRegression(fit_intercept=True, normalize=True, copy_X=True).fit()
except:
    lreg=LinearRegression(fit_intercept=True, normalize=True, copy_X=True).fit()

Mais cela n'a pas fonctionné pour moi. De plus, mes données n'avaient aucune valeur nan ou inf. Mais en expérimentant, j'ai trouvé que l'exécution du même code une deuxième fois fonctionne. donc je l'ai fait

lreg=LinearRegression(fit_intercept=True, normalize=True, copy_X=True).fit() 

Je ne sais pas pourquoi ce travail, mais cela a résolu le problème pour moi. Donc, essayer d'exécuter le même code deux fois a fait l'affaire pour moi.


0 commentaires

0
votes

Dans votre code, changez-le:

lm.fit(x.reshape(-1, 1).astype(np.float32), y)

sur:

lm.fit(x.reshape(-1, 1), y)   


0 commentaires

1
votes

Il semble que cela n'arrive que lorsque vous imprimez la figure en utilisant matplotlib, sinon vous pouvez exécuter l'algorithme d'ajustement autant de fois que vous le souhaitez.

Cependant, si vous changez le type de données de float64 en float32 (réponse Grzesik), assez étrangement l'erreur disparaît. Cela me semble être un bogue Pourquoi changer le type de données affecterait-il l'interaction entre matplotlib et la fonction lapack_function dans sklearn?

Plus une question qu'une réponse, mais il est un peu effrayant de trouver ces interactions inattendues entre les fonctions et les types de données.

if __name__ == "__main__":
    np.random.seed(64)
    main(print_matplotlib = True, dtype=np.float32)
    np.random.seed(64)
    main(print_matplotlib = True, dtype=np.float32)
    pass

Pas de traçage

float64
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-52593a548324> in <module>
      3     main(print_matplotlib = True)
      4     np.random.seed(64)
----> 5     main(print_matplotlib = True)
      6 
      7     pass

<ipython-input-1-11139051f2d3> in main(print_matplotlib, dtype)
     11     x = x.reshape((-1,1))
     12 
---> 13     reg=LinearRegression().fit(x,y)
     14     print(reg.intercept_,reg.coef_)
     15 

~\Anaconda3\lib\site-packages\sklearn\linear_model\_base.py in fit(self, X, y, sample_weight)
    545         else:
    546             self.coef_, self._residues, self.rank_, self.singular_ = \
--> 547                 linalg.lstsq(X, y)
    548             self.coef_ = self.coef_.T
    549 

~\AppData\Roaming\Python\Python37\site-packages\scipy\linalg\basic.py in lstsq(a, b, cond, overwrite_a, overwrite_b, check_finite, lapack_driver)
   1249         if info < 0:
   1250             raise ValueError('illegal value in %d-th argument of internal %s'
-> 1251                              % (-info, lapack_driver))
   1252         resids = np.asarray([], dtype=x.dtype)
   1253         if m > n:

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

Tracer dtype = np.float64

if __name__ == "__main__":
    np.random.seed(64)
    main(print_matplotlib = True, dtype=np.float64)
    np.random.seed(64)
    main(print_matplotlib = True, dtype=np.float64)
    pass

float64
0.5957165420019624 [0.91960601]

Parcelle 1

if __name__ == "__main__":
    np.random.seed(64)
    main(print_matplotlib = False, dtype=np.float64)
    np.random.seed(64)
    main(print_matplotlib = False, dtype=np.float64)  
    pass

float64
0.5957165420019624 [0.91960601]
float64
0.5957165420019624 [0.91960601]

Tracer dtype = np.float32

import numpy as np
import sklearn
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt


def main(print_matplotlib=False,dtype=np.float64):
    x = np.linspace(-3,3,100).astype(dtype)
    print(x.dtype)
    y = 2*np.random.rand(x.shape[0])*x + np.random.rand(x.shape[0])
    x = x.reshape((-1,1))

    reg=LinearRegression().fit(x,y)
    print(reg.intercept_,reg.coef_)
    
    yh = reg.predict(x)
    
    if print_matplotlib:
        plt.scatter(x,y)
        plt.plot(x,yh)
        plt.show()


Sortie 2


0 commentaires

0
votes

Cela semble être dû à un bogue dans Windows (mise à jour 2004?).

  1. Le problème affiché https://github.com/scipy/scipy/issues/12893
  2. est un double de https://github.com/scipy/scipy/issues/12747 et
  3. est causé par https://github.com/numpy/numpy/issues/16744

Il s'agit de savoir si Numpy peut s'interfacer avec un sous-programme d'algèbre linéaire de base (BLAS) particulier.

Les solutions de contournement les plus courantes consistent à installer Numpy en utilisant conda ou à utiliser un système non-Windows (par exemple GNU / Linux OS ). conda regroupe la bibliothèque Intel Math Kernel (MKL) qui n'a pas le problème. Les systèmes non Windows n'ont pas les problèmes de Windows. On suppose que Microsoft fournira un correctif vers janvier 2021.

Si ce problème vous affecte, comme beaucoup d'autres, n'oubliez pas que pour Numpy, ainsi que Python et de nombreux autres packages gratuits, la licence indique clairement,

CE LOGICIEL EST FOURNI PAR LES TITULAIRES DES DROITS D'AUTEUR ET LES CONTRIBUTEURS «EN L'ÉTAT»

Veuillez en tenir compte (c'est-à-dire être poli et respectueux) dans tout commentaire adressé aux développeurs de ces systèmes.


0 commentaires