Sklearn 中的 PCA 内存错误:Alternative Dim Reduction?
PCA memory error in Sklearn: Alternative Dim Reduction?
我试图在 Sklearn 中使用 PCA 来减少一个非常大的矩阵的维数,但它会产生内存错误(所需的 RAM 超过 128GB)。我已经设置了 copy=False 并且我正在使用计算成本较低的随机 PCA。
有解决办法吗?如果不是,我可以使用哪些其他需要更少内存的暗淡减少技术。谢谢。
更新:我尝试 PCA 的矩阵是一组特征向量。它来自通过预训练的 CNN 传递一组训练图像。矩阵是 [300000, 51200]。尝试过的 PCA 组件:100 到 500。
我想降低它的维度,以便我可以使用这些功能来训练 ML 算法,例如 XGBoost。谢谢。
最后,我使用了 TruncatedSVD 而不是 PCA,它能够处理大型矩阵而不会出现内存问题:
from sklearn import decomposition
n_comp = 250
svd = decomposition.TruncatedSVD(n_components=n_comp, algorithm='arpack')
svd.fit(train_features)
print(svd.explained_variance_ratio_.sum())
train_features = svd.transform(train_features)
test_features = svd.transform(test_features)
您可以使用 SK 学习中提供的 IncrementalPCA
。 from sklearn.decomposition import IncrementalPCA
。界面的其余部分与 PCA
相同。您需要传递一个额外的参数 batch_size
,它需要 <= #components。
但是,如果需要应用像 KernelPCA
这样的非线性版本,似乎不支持类似的东西。 KernelPCA
内存需求绝对爆炸,请参阅本文 about Non Linear Dimensionality Reduction on Wikipedia
import numpy as np
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1)
mnist.target = mnist.target.astype(np.uint8)
# Split data into training and test
X, y = mnist["data"], mnist["target"]
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
del mnist
# Use Incremental PCA to avoid MemoryError: Unable to allocate array with shape
from sklearn.decomposition import IncrementalPCA
m, n = X_train.shape
n_batches = 100
n_components=154
ipca = IncrementalPCA(
copy=False,
n_components=n_components,
batch_size=(m // n_batches)
)
X_train_recuced_ipca = ipca.fit_transform(X_train)
我试图在 Sklearn 中使用 PCA 来减少一个非常大的矩阵的维数,但它会产生内存错误(所需的 RAM 超过 128GB)。我已经设置了 copy=False 并且我正在使用计算成本较低的随机 PCA。
有解决办法吗?如果不是,我可以使用哪些其他需要更少内存的暗淡减少技术。谢谢。
更新:我尝试 PCA 的矩阵是一组特征向量。它来自通过预训练的 CNN 传递一组训练图像。矩阵是 [300000, 51200]。尝试过的 PCA 组件:100 到 500。
我想降低它的维度,以便我可以使用这些功能来训练 ML 算法,例如 XGBoost。谢谢。
最后,我使用了 TruncatedSVD 而不是 PCA,它能够处理大型矩阵而不会出现内存问题:
from sklearn import decomposition
n_comp = 250
svd = decomposition.TruncatedSVD(n_components=n_comp, algorithm='arpack')
svd.fit(train_features)
print(svd.explained_variance_ratio_.sum())
train_features = svd.transform(train_features)
test_features = svd.transform(test_features)
您可以使用 SK 学习中提供的 IncrementalPCA
。 from sklearn.decomposition import IncrementalPCA
。界面的其余部分与 PCA
相同。您需要传递一个额外的参数 batch_size
,它需要 <= #components。
但是,如果需要应用像 KernelPCA
这样的非线性版本,似乎不支持类似的东西。 KernelPCA
内存需求绝对爆炸,请参阅本文 about Non Linear Dimensionality Reduction on Wikipedia
import numpy as np
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1)
mnist.target = mnist.target.astype(np.uint8)
# Split data into training and test
X, y = mnist["data"], mnist["target"]
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
del mnist
# Use Incremental PCA to avoid MemoryError: Unable to allocate array with shape
from sklearn.decomposition import IncrementalPCA
m, n = X_train.shape
n_batches = 100
n_components=154
ipca = IncrementalPCA(
copy=False,
n_components=n_components,
batch_size=(m // n_batches)
)
X_train_recuced_ipca = ipca.fit_transform(X_train)