sklearn de PLSRegression: “ValueError: tableau ne doit pas contenir de infs ou NaNs”
Lors de l'utilisation de sklearn.cross_decomposition.PLSRegression
:
import numpy as np
import sklearn.cross_decomposition
pls2 = sklearn.cross_decomposition.PLSRegression()
xx = np.random.random((5,5))
yy = np.zeros((5,5) )
yy[0,:] = [0,1,0,0,0]
yy[1,:] = [0,0,0,1,0]
yy[2,:] = [0,0,0,0,1]
#yy[3,:] = [1,0,0,0,0] # Uncommenting this line solves the issue
pls2.fit(xx, yy)
J'obtiens:
C:\Anaconda\lib\site-packages\sklearn\cross_decomposition\pls_.py:44: RuntimeWarning: invalid value encountered in divide
x_weights = np.dot(X.T, y_score) / np.dot(y_score.T, y_score)
C:\Anaconda\lib\site-packages\sklearn\cross_decomposition\pls_.py:64: RuntimeWarning: invalid value encountered in less
if np.dot(x_weights_diff.T, x_weights_diff) < tol or Y.shape[1] == 1:
C:\Anaconda\lib\site-packages\sklearn\cross_decomposition\pls_.py:67: UserWarning: Maximum number of iterations reached
warnings.warn('Maximum number of iterations reached')
C:\Anaconda\lib\site-packages\sklearn\cross_decomposition\pls_.py:297: RuntimeWarning: invalid value encountered in less
if np.dot(x_scores.T, x_scores) < np.finfo(np.double).eps:
C:\Anaconda\lib\site-packages\sklearn\cross_decomposition\pls_.py:275: RuntimeWarning: invalid value encountered in less
if np.all(np.dot(Yk.T, Yk) < np.finfo(np.double).eps):
Traceback (most recent call last):
File "C:\svn\hw4\code\test_plsr2.py", line 8, in <module>
pls2.fit(xx, yy)
File "C:\Anaconda\lib\site-packages\sklearn\cross_decomposition\pls_.py", line 335, in fit
linalg.pinv(np.dot(self.x_loadings_.T, self.x_weights_)))
File "C:\Anaconda\lib\site-packages\scipy\linalg\basic.py", line 889, in pinv
a = _asarray_validated(a, check_finite=check_finite)
File "C:\Anaconda\lib\site-packages\scipy\_lib\_util.py", line 135, in _asarray_validated
a = np.asarray_chkfinite(a)
File "C:\Anaconda\lib\site-packages\numpy\lib\function_base.py", line 613, in asarray_chkfinite
"array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs
Quel pourrait être le problème?
Je suis conscient de scikit-learn GitHub question n ° 2089, mais depuis que j'utilise scikit-learn 0.16.1 (avec Python 2.7.10 x64), ce problème devrait être résolu (les extraits de code mentionné dans le GitHub question de bien fonctionner).
Est-ce un exemple, vous êtes à essayer de les reproduire ou avez-vous définir ces données? Il peut être le cas que vous avez un problème insoluble, par conséquent, vous obtenez nans ou inf valeurs de certains poids, qui ne parviennent pas à un moment plus tard dans le calcul
Mes données d'origine ont été plus grands (dropbox.com/s/zjrz6upfeln07ga/SE-sklearn-PLSR.zip?dl=0), j'ai essayé de cerner le problème.
Mes données d'origine ont été plus grands (dropbox.com/s/zjrz6upfeln07ga/SE-sklearn-PLSR.zip?dl=0), j'ai essayé de cerner le problème.
OriginalL'auteur Franck Dernoncourt | 2015-10-31
Vous devez vous connecter pour publier un commentaire.
Veuillez vérifier si l'un de vos valeurs transmises sont NaN ou inf:
Si l'un de ces rendements vrai. Supprimer la
nan
entrées ou inf entrées. E. g. vous pouvez les configurer pour0
avec:Il est également possible de numpy être nourris de ces grandes positifs et négatifs et remise à zéro des valeurs, que les équations de profondeur vers le bas dans la bibliothèque sont la production de zéros, Nan ou de l'Inf. Une solution de contournement, curieusement, est à envoyer dans les plus petits nombres (dire représentant des nombres compris entre -1 et 1. Une façon de le faire est par la normalisation, voir: https://stackoverflow.com/a/36390482/445131
Si rien de tout cela résout le problème, alors vous pouvez avoir affaire à un faible niveau bug dans la bibliothèque de votre aide, ou une sorte de singularité dans vos données. Créer un sscce et de la poster sur stackoverflow ou créer un nouveau rapport de bogue sur la bibliothèque de l'entretien de votre logiciel.
np.isnan(xx).any(): False; np.isnan(yy).any(): False
J'ai trouvé le problème: github.com/scikit-learn/scikit-learn/issues/...
Intéressant. Votre github problème des points en vue d'une sorte de singularité dans les données. Ceux-ci devraient être traitées correctement par scikit-learn, donc la façon dont elle agit aujourd'hui est certainement buggy.
nan
etinf
de vérification peuvent être combinés dansnp.isfinite()
OriginalL'auteur eickenberg
Le problème est causé par un bogue dans scikit-learn. Je l'ai signalé sur GitHub: https://github.com/scikit-learn/scikit-learn/issues/2089#issuecomment-152753095
OriginalL'auteur Franck Dernoncourt
Je peux reproduire le même bug, j'ai fait taire ce bug en filtrant tous les
0
s loinCette silences le bug (je n'ai jamais vérifier la précision de différence)
Mon système info:
OriginalL'auteur Charles Chow
Vous voudrez peut-être vérifier votre poids pour les valeurs négatives, puisque cette erreur sera également déclenchée avec le poids est négatif.
OriginalL'auteur Skippy le Grand Gourou