sklearn Incremental Pca大数据集

时间:2018-04-02 10:25:53

标签: scikit-learn pca

我有一个大小为42.9 GB的大型数据集,它们存储为numpy的压缩npz格式。加载时的数据

  

n_samples,n_features = 406762,26421

我需要对此进行降维,因此使用sklearn的PCA方法。通常,我执行

from sklearn.decomposition import IncrementalPCA, PCA

pca = PCA(n_components=200).fit(x)
x_transformed = pca.transform(x)

由于数据无法加载到内存中,因此我使用Incremental PCA,因为它提供了partial_fit方法,因为它具有非核心支持。

from sklearn.decomposition import IncrementalPCA, PCA

ipca = IncrementalPCA(n_components=200)

for x in xrange(407):
    partial_x = load("...")
    ipca.partial_fit(partial_x)

现在,一旦模型适合完整数据,我该如何进行转换?由于transform采用整个数据,因此没有给出partial_transform方法。

编辑:#1

一旦计算出数据的简化维数表示,这就是我验证重建错误的方法。

from sklearn.metrics import mean_squared_error

reconstructed_matrix = pca_model.inverse_transform(reduced_x)
error_curr = mean_square_error(reconstructed_x, x)

如何计算大型数据集的错误? 另外,有没有办法可以使用partial_fit作为GridSearch或RandomizedSearch的一部分来找到最好的n_components?

1 个答案:

答案 0 :(得分:3)

您可以按照适合模型的方式进行操作。转换函数不必一次应用于整个数据。

x_transform = np.ndarray(shape=(0, 200))
for x in xrange(407):
    partial_x = load("...")
    partial_x_transform = ipca.transform(partial_x)
    x_transform = np.vstack((x_transform, partial_x_transform))

要计算重建的均方误差,可以使用如下代码:

from sklearn.metrics import mean_squared_error

sum = 0
for i in xrange(407):
    # with a custom get_segment function
    partial_x_reduced = get_segment(x_reduced, i)
    reconstructed_matrix = pca_model.inverse_transform(partial_reduced_x)
    residual = mean_square_error(reconstructed_x, get_segment(x, i))
    sum += residual * len(partial_x_reduced)

mse = sum / len(x_reduced)

对于参数调整,您可以将组件数设置为所需的最大值,转换输入,然后在网格搜索中,仅使用第一个k列,k为你的超参数。每次更改k时,您都不必重新计算整个PCA。