Scikit-learn Incremental PCA - ValueError: array must not contain infs or NaNs
Scikit-learn Incremental PCA - ValueError: array must not contain infs or NaNs
我正在尝试使用 scikit-learn 中的 IncrementalPCA。由于我的应用程序的在线性质,我真的需要算法的增量版本。我的代码再简单不过了:
from sklearn.decomposition import IncrementalPCA
import pandas as pd
with open('C:/My/File/Path/file.csv', 'r') as fp:
data = pd.read_csv(fp)
ipca = IncrementalPCA(n_components=4)
ipca.fit(data)
但启动时它是这样完成的:
C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py:293: RuntimeWarning: overflow encountered in long_scalars
np.sqrt((self.n_samples_seen_ * n_samples) /
C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py:293: RuntimeWarning: invalid value encountered in sqrt
np.sqrt((self.n_samples_seen_ * n_samples) /
Traceback (most recent call last):
File "C:/Users/myuser/AppData/Roaming/JetBrains/PyCharmCE2020.1/scratches/scratch_9.py", line 6, in <module>
ipca.fit(data)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py", line 215, in fit
self.partial_fit(X_batch, check_input=False)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py", line 298, in partial_fit
U, S, V = linalg.svd(X, full_matrices=False)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\scipy\linalg\decomp_svd.py", line 106, in svd
a1 = _asarray_validated(a, check_finite=check_finite)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\scipy\_lib\_util.py", line 263, in _asarray_validated
a = toarray(a)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\numpy\lib\function_base.py", line 498, in asarray_chkfinite
raise ValueError(
ValueError: array must not contain infs or NaNs
Process finished with exit code 1
我的数据是 243 列,只有 0 和 1。我已经检查过:
- 我的数据中没有任何 NaN
- 我的数据中没有任何信息
- 我有 scikit-learn v0.22.2.post1,我更新到 0.23.1,没有区别
- 如果我使用 PCA 而不是 IncrementalPCA,而其他一切都保持不变,则一切正常,没有警告,没有错误,一切都很好
- 以前的版本也有类似的问题,但它们指的是 0.16/0.17 左右的版本,大多数代码更复杂,并且都围绕这些版本进行了修复
如果有人能帮助我,我将不胜感激
编辑:
我的数据,就像我将它们提供给上面的代码一样
https://drive.google.com/file/d/1JBIliADt9TViTk8qjnmIS3RFEO934dY6/view?usp=sharing
编辑 2:
尝试同时使用
data = pd.read_csv(fp, dtype = 'Int64')
和
data = pd.read_csv(fp, dtype = np.float64)
结果没有差异。
编辑 3:
似乎问题与数据集大小有关。如果我尝试适应较小的部分,一切正常。直到我得到大约 1800000 行。这就是错误开始显示的地方。
您的数据有问题。
这是一个使用一些人工数据(n=2000000 和 d=243)的 100% 工作示例。
为了提供更多帮助,请上传导致错误的数据示例。
from sklearn.decomposition import IncrementalPCA
import pandas as pd, numpy as np
n=2000000
d=243
data = pd.DataFrame(np.ones((n,d)))
ipca = IncrementalPCA(n_components=4)
ipca.fit(data.values)
我将它发给了 scikit-learn,他们很快就收到了。发生这种情况是因为 numpy 数组在 Windows 上默认为 int32,这会导致回溯顶部的 RuntimeWarning 并升级为将 NaN 传递给 partial_fit()。我暂时搬到 Linux 等待修复。
Here 遇到类似问题的任何人都可以在将来跟踪其解决方案。
tl;dr: 检查上面 link 以查看问题是否已解决。如果不是,请使用 batch_size,例如 batch_size * n_samples < 2^31 - 1。如果这对您来说不可能,请移至 Linux.
我正在尝试使用 scikit-learn 中的 IncrementalPCA。由于我的应用程序的在线性质,我真的需要算法的增量版本。我的代码再简单不过了:
from sklearn.decomposition import IncrementalPCA
import pandas as pd
with open('C:/My/File/Path/file.csv', 'r') as fp:
data = pd.read_csv(fp)
ipca = IncrementalPCA(n_components=4)
ipca.fit(data)
但启动时它是这样完成的:
C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py:293: RuntimeWarning: overflow encountered in long_scalars
np.sqrt((self.n_samples_seen_ * n_samples) /
C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py:293: RuntimeWarning: invalid value encountered in sqrt
np.sqrt((self.n_samples_seen_ * n_samples) /
Traceback (most recent call last):
File "C:/Users/myuser/AppData/Roaming/JetBrains/PyCharmCE2020.1/scratches/scratch_9.py", line 6, in <module>
ipca.fit(data)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py", line 215, in fit
self.partial_fit(X_batch, check_input=False)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\sklearn\decomposition\_incremental_pca.py", line 298, in partial_fit
U, S, V = linalg.svd(X, full_matrices=False)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\scipy\linalg\decomp_svd.py", line 106, in svd
a1 = _asarray_validated(a, check_finite=check_finite)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\scipy\_lib\_util.py", line 263, in _asarray_validated
a = toarray(a)
File "C:\Users\myuser\PycharmProjects\mushu\venv\lib\site-packages\numpy\lib\function_base.py", line 498, in asarray_chkfinite
raise ValueError(
ValueError: array must not contain infs or NaNs
Process finished with exit code 1
我的数据是 243 列,只有 0 和 1。我已经检查过:
- 我的数据中没有任何 NaN
- 我的数据中没有任何信息
- 我有 scikit-learn v0.22.2.post1,我更新到 0.23.1,没有区别
- 如果我使用 PCA 而不是 IncrementalPCA,而其他一切都保持不变,则一切正常,没有警告,没有错误,一切都很好
- 以前的版本也有类似的问题,但它们指的是 0.16/0.17 左右的版本,大多数代码更复杂,并且都围绕这些版本进行了修复
如果有人能帮助我,我将不胜感激
编辑:
我的数据,就像我将它们提供给上面的代码一样
https://drive.google.com/file/d/1JBIliADt9TViTk8qjnmIS3RFEO934dY6/view?usp=sharing
编辑 2:
尝试同时使用
data = pd.read_csv(fp, dtype = 'Int64')
和
data = pd.read_csv(fp, dtype = np.float64)
结果没有差异。
编辑 3:
似乎问题与数据集大小有关。如果我尝试适应较小的部分,一切正常。直到我得到大约 1800000 行。这就是错误开始显示的地方。
您的数据有问题。
这是一个使用一些人工数据(n=2000000 和 d=243)的 100% 工作示例。 为了提供更多帮助,请上传导致错误的数据示例。
from sklearn.decomposition import IncrementalPCA
import pandas as pd, numpy as np
n=2000000
d=243
data = pd.DataFrame(np.ones((n,d)))
ipca = IncrementalPCA(n_components=4)
ipca.fit(data.values)
我将它发给了 scikit-learn,他们很快就收到了。发生这种情况是因为 numpy 数组在 Windows 上默认为 int32,这会导致回溯顶部的 RuntimeWarning 并升级为将 NaN 传递给 partial_fit()。我暂时搬到 Linux 等待修复。
Here 遇到类似问题的任何人都可以在将来跟踪其解决方案。
tl;dr: 检查上面 link 以查看问题是否已解决。如果不是,请使用 batch_size,例如 batch_size * n_samples < 2^31 - 1。如果这对您来说不可能,请移至 Linux.