我有一个非常大的训练数据集。我的训练数据集包含1050个手势,每个手势包含12000个数据点。给我们的机器学习模型提供这么多数据点将导致性能非常慢和准确性较差。因此,我使用PCA从高维空间中去除不相关的特征,并将最重要的特征投影到低维子空间中,提高了分类精度并减少了计算时间。使用PCA,我们将每个手势的12000个数据点减少到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()
是的,可以在训练集上拟合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