gpt4 book ai didi

python - 如何使用sklearn的IncrementalPCApartial_fit

转载 作者:行者123 更新时间:2023-11-30 08:54:06 25 4
gpt4 key购买 nike

我有一个相当大的数据集,我想分解它,但太大而无法加载到内存中。研究我的选择,似乎 sklearn's IncrementalPCA是一个不错的选择,但我不太清楚如何让它发挥作用。

我可以很好地加载数据:

f = h5py.File('my_big_data.h5')
features = f['data']

来自 this example ,看来我需要决定我想从中读取什么大小的 block :

num_rows = data.shape[0]     # total number of rows in data
chunk_size = 10 # how many rows at a time to feed ipca

然后我可以创建我的 IncrementalPCA,逐 block 流式传输数据,并部分拟合它(同样来自上面的示例):

ipca = IncrementalPCA(n_components=2)
for i in range(0, num_rows//chunk_size):
ipca.partial_fit(features[i*chunk_size : (i+1)*chunk_size])

这一切都没有错误,但我不知道下一步该做什么。我实际上如何进行降维并获得一个可以进一步操作并保存的新 numpy 数组?

编辑
上面的代码用于测试数据的较小子集 - 正如 @ImanolLuengo 正确指出的那样,在最终代码中使用更多的维度和 block 大小会更好。

最佳答案

正如您所猜测的,拟合已正确完成,尽管我建议将 chunk_size 增加到 100 或 1000(甚至更高,具体取决于数据的形状)。

你现在要做的就是改造它,实际上是 transform正在阅读:

out = my_new_features_dataset # shape N x 2
for i in range(0, num_rows//chunk_size):
out[i*chunk_size:(i+1) * chunk_size] = ipca.transform(features[i*chunk_size : (i+1)*chunk_size])

这应该会给你带来新的转变功能。如果内存中仍然有太多样本,我建议使用 out 作为另一个 hdf5 数据集。

此外,我认为将庞大的数据集减少为 2 个组件可能不是一个好主意。但如果不知道你的特征的形状,就很难说。我建议将它们减少到 sqrt(features.shape[1]),因为这是一个不错的启发式方法,或者专业提示:使用 ipca.explained_variance_ratio_ 来确定最佳数量您可以承受的信息丢失阈值的功能。

<小时/>

编辑:对于explained_variance_ratio_,它返回一个维度n_components的向量(作为参数传递给IPCA的n_components),其中每个值i表示由第i个新组件解释的原始数据方差的百分比。

您可以按照 this answer 中的步骤操作提取前 n 个组件保留了多少信息:

>>> print(ipca.explained_variance_ratio_.cumsum())
[ 0.32047581 0.59549787 0.80178824 0.932976 1. ]

注意:数字是从上面的答案中虚构的,假设您已将 IPCA 减少到 5 个组件。第 i 个数字表示有多少原始数据由前 [0, i] 个分量解释,因为它是解释方差比的累积和。

因此,通常所做的是将 PCA 拟合到与原始数据相同数量的组件:

ipca = IncrementalPCA(n_components=features.shape[1])

然后,在对整个数据进行训练(使用迭代 + partial_fit)后,您可以绘制 explain_variance_ratio_.cumsum() 并选择您想要丢失的数据量。或者自动执行:

k = np.argmax(ipca.explained_variance_ratio_.cumsum() > 0.9)

上面将返回 cumcum 数组上的第一个索引,其值为 > 0.9,这表示保留至少 90% 原始数据的 PCA 分量的数量。

然后您可以调整转换以反射(reflect)它:

cs = chunk_size
out = my_new_features_dataset # shape N x k
for i in range(0, num_rows//chunk_size):
out[i*cs:(i+1)*cs] = ipca.transform(features[i*cs:(i+1)*cs])[:, :k]

注意对 :k 的切片仅选择前 k 组件,而忽略其余组件。

关于python - 如何使用sklearn的IncrementalPCApartial_fit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44334950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com