如何存储拟合的 PCA 以便我可以转置未见过的测试数据集?我不想将大型训练数据集保留在我的 CPU 上

问题描述 投票:0回答:1

我有一个非常大的训练数据集。我的训练数据集包含 1050 个手势,每个手势包含 12,000 个数据点。向我们的机器学习模型提供如此多的数据点将导致性能非常慢且准确性差。因此,我使用 PCA 从高维空间中去除不相关的特征,并将最重要的特征投影到较低维的子空间中,从而提高分类精度并减少计算时间。使用 PCA,我们将每个手势的 12,000 个数据点减少到 15 个 PC,而不会影响从数据中提取的信息。

将来,我想将我的机器学习模型存储到 Arduino 上。 Arduino 是一个小芯片,大约有 256KB 的存储空间。我用来拟合 PCA 的训练数据集的存储空间为 225MB,因此不可能。

有没有办法执行 PCA 并将其拟合到我的训练数据集,以便我将来可以在 Arduino 上转置我未见过的测试数据集,而无需将训练数据集存储到我的 Arduino 进行拟合?

这是我的代码,适合我的训练数据集

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

transposed_normDF.columns = transposed_normDF.columns.map(str)
features = [str(i) for i in range(0,11999)]
x = transposed_normDF.loc[:, features].values
y = df.loc[:,['label']].values

pca = PCA(n_components=0.99)
principalComponents = pca.fit_transform(x)

pc = pca.explained_variance_ratio_.cumsum()
x1 = StandardScaler().fit_transform(principalComponents)
full_newdf = pd.DataFrame(data = x1
             , columns = [f'pc_stdscaled_{i}' for i in range(len(pc))])
full_finalDf = pd.concat([full_newdf, df[['label']]], axis = 1)
print(full_finalDf)
print(full_newdf.shape)

这是我的代码来转置看不见的数据

pca = PCA(n_components=0.99)

newdata_transformed = pca.transform(in_data)
pc = pca.explained_variance_ratio_.cumsum()
x1 = StandardScaler().fit(principalComponents)
X1 = x1.transform(newdata_transformed)
newdf = pd.DataFrame(data = X1
             , columns = [f'pc_stdscaled_{i}' for i in range(len(pc))])
newdf.head()
python machine-learning pca data-preprocessing tinyml
1个回答
1
投票

是的,可以将 PCA 应用于训练集并稍后在另一个程序中重复使用。 您可以使用

pickle
保存模型并加载它。 这是一个代码片段:

from sklearn.decomposition import PCA
import pickle as pk
from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=10, centers=3, n_features=20, random_state=0)
pca = PCA(n_components=2)
result = pca.fit_transform(X) # Assume X is having more than 2 dimensions    
input = X[0]
result = pca.transform([input])
print(result) # output: [[ 25.27946068  -2.74478573]]
pk.dump(pca, open("pca.pkl","wb"))

保存拟合的PCA后,您可以在另一个程序中重新加载并转换新的输入样本,而无需加载训练数据,如下所示:

# later reload the pickle file, no training data needed
pca_reloaded = pk.load(open("pca.pkl",'rb')) 
result_new = pca_reloaded.transform([input]) # X_new is a new data sample
print(result_new) # output: [[ 25.27946068  -2.74478573]]

当您比较

result
result_new
时,您会发现它们是相等的。

来源:https://datascience.stackexchange.com/questions/55066/how-to-export-pca-to-use-in-another-program

© www.soinside.com 2019 - 2024. All rights reserved.