使用PCA值

时间:2017-02-26 11:08:47

标签: python scikit-learn pca knn

新手到数据科学。

我有一个高维度的数据集。有83个样本,2308维,其形状为(83,2308)。另外,我有一组样本类型,长度为83,形状为(83,)。

我尝试使用原始数据集的子集训练KNN分类器(2个邻居),并使用它来预测剩余数据点(测试子集)的样本类型。我的训练数据具有形状(66,2308),并且我将其训练为样本类型的阵列形状(63,)。

我的目标是训练我的KNN分类器,其训练集的维数降低,因此我在其上运行PCA。我只保留了前10台PC。转换训练集后,其形状为(63,10)。

不幸的是,现在我无法使用这种简化的训练集来对我的未减少的测试集进行预测。运行我的代码会给我一个错误:"查询数据维度必须与培训数据维度相匹配"。

我希望能够将前10台PC整合到我的KNN模型中。有没有帮助实现这一目标?

这是我的参考代码:

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

# creates my training and testing partitions
train_ind, test_ind = test_train_id(cancer_types, 0.8)

# create the train partition
genes_train = genes[train_ind, :]

# perform PCA on the train partition
gene_pca = PCA(10)
gene_pca.fit(genes_train)

# transform the gene partition with the PCA
genes_train_red = gene_pca.transform(genes_train) 

# the KNN model
model = KNeighborsClassifier(2)
model.fit(genes_train_red, cancer_types[train_ind])

predict = model.predict(genes[train_ind])

np.mean(predict == cancer_types[test_ind])


print('The unreduced train set has shape',genes[train_ind, :].shape)
print('The label set being trained to has shape', cancer_types[train_ind].shape)
print('------', '\n', 'After PCA, the reduced train set has shape', genes_train_red.shape ,'\n')

print('The unreduced test set has shape', genes[test_ind].shape)

1 个答案:

答案 0 :(得分:1)

您使用该线在缩小尺寸上拟合模型:

model.fit(genes_train_red, cancer_types[train_ind])

现在您要求预测其他一些数据:

predict = model.predict(genes[train_ind])

当然,model.predict()只能预测具有相同输入维度的样本(您只保留10个PCA组件)。因此,如果不改变您的新输入(仍然是原始形式;不会被PCA缩减),它将无效。

正确用法如下:

predict = model.predict(gene_pca.transform(genes[train_ind]))