Python Matrix 上的 PCA 太大,无法放入内存
Python PCA on Matrix too large to fit into memory
我有一个 100,000 行 x 27,000 列的 csv,我正在尝试对其进行 PCA 以生成 100,000 行 X 300 列的矩阵。 csv 有 9GB 大。这是我目前正在做的事情:
from sklearn.decomposition import PCA as RandomizedPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
X = pd.DataFrame.from_csv(dataset)
Y = X.pop("Y_Level")
X = (X - X.mean()) / (X.max() - X.min())
Y = list(Y)
dimensions = 300
sklearn_pca = RandomizedPCA(n_components=dimensions)
X_final = sklearn_pca.fit_transform(X)
当我 运行 上述代码时,我的程序在执行 .from_csv 步骤时被终止。我已经能够通过将 csv 分成 10,000 组来解决这个问题; 1 1 读取它们,然后调用 pd.concat。这使我能够在被杀死之前进入规范化步骤 (X - X.mean())...。我的数据对我的 macbook air 来说太大了吗?或者有更好的方法来做到这一点。我真的很想将我拥有的所有数据用于我的机器学习应用程序。
如果我想按照下面的答案建议使用增量 PCA,我会这样做吗?:
from sklearn.decomposition import IncrementalPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
chunksize_ = 10000
#total_size is 100000
dimensions = 300
reader = pd.read_csv(dataset, sep = ',', chunksize = chunksize_)
sklearn_pca = IncrementalPCA(n_components=dimensions)
Y = []
for chunk in reader:
y = chunk.pop("virginica")
Y = Y + list(y)
sklearn_pca.partial_fit(chunk)
X = ???
#This is were i'm stuck, how do i take my final pca and output it to X,
#the normal transform method takes in an X, which I don't have because I
#couldn't fit it into memory.
我在网上找不到任何好的例子。
PCA 需要计算一个相关矩阵,它是 100,000x100,000。如果数据以双精度存储,则为 80 GB。我敢打赌你的 Macbook 没有 80 GB 内存。
对于大小合理的随机子集,PCA 变换矩阵可能几乎相同。
尝试划分您的数据或将其分批加载到脚本中,并在每个批次上使用 Incremetal PCA 的 partial_fit 方法使您的 PCA 适合。
from sklearn.decomposition import IncrementalPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
chunksize_ = 5 * 25000
dimensions = 300
reader = pd.read_csv(dataset, sep = ',', chunksize = chunksize_)
sklearn_pca = IncrementalPCA(n_components=dimensions)
for chunk in reader:
y = chunk.pop("Y")
sklearn_pca.partial_fit(chunk)
# Computed mean per feature
mean = sklearn_pca.mean_
# and stddev
stddev = np.sqrt(sklearn_pca.var_)
Xtransformed = None
for chunk in pd.read_csv(dataset, sep = ',', chunksize = chunksize_):
y = chunk.pop("Y")
Xchunk = sklearn_pca.transform(chunk)
if Xtransformed == None:
Xtransformed = Xchunk
else:
Xtransformed = np.vstack((Xtransformed, Xchunk))
Useful link
我有一个 100,000 行 x 27,000 列的 csv,我正在尝试对其进行 PCA 以生成 100,000 行 X 300 列的矩阵。 csv 有 9GB 大。这是我目前正在做的事情:
from sklearn.decomposition import PCA as RandomizedPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
X = pd.DataFrame.from_csv(dataset)
Y = X.pop("Y_Level")
X = (X - X.mean()) / (X.max() - X.min())
Y = list(Y)
dimensions = 300
sklearn_pca = RandomizedPCA(n_components=dimensions)
X_final = sklearn_pca.fit_transform(X)
当我 运行 上述代码时,我的程序在执行 .from_csv 步骤时被终止。我已经能够通过将 csv 分成 10,000 组来解决这个问题; 1 1 读取它们,然后调用 pd.concat。这使我能够在被杀死之前进入规范化步骤 (X - X.mean())...。我的数据对我的 macbook air 来说太大了吗?或者有更好的方法来做到这一点。我真的很想将我拥有的所有数据用于我的机器学习应用程序。
如果我想按照下面的答案建议使用增量 PCA,我会这样做吗?:
from sklearn.decomposition import IncrementalPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
chunksize_ = 10000
#total_size is 100000
dimensions = 300
reader = pd.read_csv(dataset, sep = ',', chunksize = chunksize_)
sklearn_pca = IncrementalPCA(n_components=dimensions)
Y = []
for chunk in reader:
y = chunk.pop("virginica")
Y = Y + list(y)
sklearn_pca.partial_fit(chunk)
X = ???
#This is were i'm stuck, how do i take my final pca and output it to X,
#the normal transform method takes in an X, which I don't have because I
#couldn't fit it into memory.
我在网上找不到任何好的例子。
PCA 需要计算一个相关矩阵,它是 100,000x100,000。如果数据以双精度存储,则为 80 GB。我敢打赌你的 Macbook 没有 80 GB 内存。
对于大小合理的随机子集,PCA 变换矩阵可能几乎相同。
尝试划分您的数据或将其分批加载到脚本中,并在每个批次上使用 Incremetal PCA 的 partial_fit 方法使您的 PCA 适合。
from sklearn.decomposition import IncrementalPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
chunksize_ = 5 * 25000
dimensions = 300
reader = pd.read_csv(dataset, sep = ',', chunksize = chunksize_)
sklearn_pca = IncrementalPCA(n_components=dimensions)
for chunk in reader:
y = chunk.pop("Y")
sklearn_pca.partial_fit(chunk)
# Computed mean per feature
mean = sklearn_pca.mean_
# and stddev
stddev = np.sqrt(sklearn_pca.var_)
Xtransformed = None
for chunk in pd.read_csv(dataset, sep = ',', chunksize = chunksize_):
y = chunk.pop("Y")
Xchunk = sklearn_pca.transform(chunk)
if Xtransformed == None:
Xtransformed = Xchunk
else:
Xtransformed = np.vstack((Xtransformed, Xchunk))
Useful link