在该程序中,我每 2.5 秒扫描一系列以 40 x 64 x 64 图像的时间序列采集的大脑样本。因此,每个图像中的“体素”(3D 像素)的数量约为 168,000 ish(40 * 64 * 64),每个都是图像样本的“特征”。
我想到了使用递归特征消除(RFE)。然后使用主成分分析 (PCA) 进行跟进,因为 n 非常高,可以执行降维。
有 9 个类要预测。因此是一个多类分类问题。从 RFE 开始:
estimator = SVC(kernel='linear')
rfe = RFE(estimator,n_features_to_select= 20000, step=0.05)
rfe = rfe.fit(X_train,y_train)
X_best = rfe.transform(X_train)
现在执行 PCA:
X_best = scale(X_best)
def get_optimal_number_of_components():
cov = np.dot(X_best,X_best.transpose())/float(X_best.shape[0])
U,s,v = svd(cov)
print 'Shape of S = ',s.shape
S_nn = sum(s)
for num_components in range(0,s.shape[0]):
temp_s = s[0:num_components]
S_ii = sum(temp_s)
if (1 - S_ii/float(S_nn)) <= 0.01:
return num_components
return s.shape[0]
n_comp = get_optimal_number_of_components()
print 'optimal number of components = ', n_comp
pca = PCA(n_components = n_comp)
pca = pca.fit(X_best)
X_pca_reduced = pca.transform(X_best)
使用 SVM 训练缩减的组件数据集
svm = SVC(kernel='linear',C=1,gamma=0.0001)
svm = svm.fit(X_pca_reduced,y_train)
现在将训练集转换为 RFE-PCA 减少并进行预测
X_test = scale(X_test)
X_rfe = rfe.transform(X_test)
X_pca = pca.transform(X_rfe)
predictions = svm.predict(X_pca)
print 'predictions = ',predictions
print 'actual = ',y_test
我对我的数据子集进行了训练,得到了76.92%。我不太担心数字太低,因为它只针对我的数据集的 1/12 进行训练。
我尝试将训练规模加倍并获得92%的准确率。这很不错。但后来我针对整个数据集进行了训练,准确率达到了92.5%
所以我的数据集增加了 6 倍,准确率提高了 0.5%。此外,数据样本没有噪音。所以样本没有问题。
此外,对于 1/12 的数据集训练大小,当我选择 n_features_to_select = 1000 时,我得到相同的 76.92%。(20000 相同!!)在执行 RFE 时。这里一定有问题。为什么选择这么少的特征时我得到相同的性能?