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.
7 Réponses :
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()
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))
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.
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.
Dans votre code, changez-le:
lm.fit(x.reshape(-1, 1).astype(np.float32), y)
sur:
lm.fit(x.reshape(-1, 1), y)
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]
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()
Cela semble être dû à un bogue dans Windows (mise à jour 2004?).
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.
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