web-dev-qa-db-ja.com

sklearnのPLSRegression: "ValueError:配列にinfまたはNaNを含めることはできません"

使用する場合 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)

私は得る:

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

何が問題になる可能性がありますか?

私は知っています scikit-learn GitHub問題#2089 ですが、scikit-learn 0.16.1(with Python 2.7.10 x64)を使用しているので、この問題は解決しました(GitHubの問題に記載されているコードスニペットは正常に機能します)。

5

この問題は、scikit-learnのバグが原因で発生します。 GitHubで報告しました: https://github.com/scikit-learn/scikit-learn/issues/2089#issuecomment-152753095

2

渡される値のいずれかがNaNまたはinfであるかどうかを確認してください。

np.isnan(xx).any()
np.isnan(yy).any()

np.isinf(xx).any()
np.isinf(yy).any()

それらのいずれかが真である場合。 nanエントリまたはinfエントリを削除します。例えば。次の方法で0に設定できます。

xx = np.nan_to_num(xx)
yy = np.nan_to_num(yy)

また、numpyにこのような大きな正の値、負の値、およびゼロの値が与えられ、ライブラリの奥深くにある方程式がゼロ、NanまたはInfを生成する可能性もあります。奇妙なことに、1つの回避策は、より小さな数(たとえば、-1から1までの代表的な数)を送信することです。これを行う1つの方法は、標準化によるものです。 https://stackoverflow.com/a/36390482/445131を参照)

それでも問題が解決しない場合は、使用しているライブラリの低レベルのバグ、またはデータのある種の特異点に対処している可能性があります。 sscce を作成し、stackoverflowに投稿するか、ソフトウェアを維持しているライブラリに新しいバグレポートを作成します。

7
eickenberg

同じバグを再現できます。すべての0をフィルタリングして、このバグを沈黙させました。

threshold_for_bug = 0.00000001 # could be any value, ex numpy.min
xx[xx < threshold_for_bug] = threshold_for_bug

これはバグを沈黙させます(私は精度の違いを決してチェックしません)

私のシステム情報:

numpy-1.11.2
python-3.5
macOS Sierra
1
Charles Chow

このエラーは負の重みでもトリガーされるため、負の値の重みを確認することをお勧めします。

私は私のために働くトリッキーな小さな解決策を見つけました。

私はこのコードでセシウムを介して時系列の機能化を行っていました:

timeInput = np.array(timeData)
valueInput = np.array(data)

#Featurizing Data
featurizedData = featurize.featurize_time_series(times=timeInput,
                                                     values=valueInput,
                                                     errors=None,
                                                     features_to_use=featuresToUse)

このエラーが発生していました:

ValueError: array must not contain infs or NaNs

笑いのために、私はデータの長さと種類をチェックしました:

data:
70
<class 'numpy.int32'>

timeData: 
70
<class 'numpy.float64'>

私の時間はミリ秒単位のデルタデータから計算されたので、これは理にかなっています。

この1行のコードでデータ型を変換しようと決心しました。

valueInput = valueInput.astype(float)

そしてそれは機能し、次のコードになりました:

timeInput = np.array(timeData)
valueInput = np.array(data)
valueInput = valueInput.astype(float)

#Featurizing Data
try:
    featurizedData = featurize.featurize_time_series(times=timeInput,
                                                     values=valueInput,
                                                     errors=None,
                                                     features_to_use=featuresToUse)

このようなエラーが発生した場合は、一致するデータ型を試してみてください

1
Warlax56