プログラムでは、2.5 秒ごとに 40 x 64 x 64 の画像の時系列で取得された多数の脳サンプルをスキャンしています。したがって、各画像の「ボクセル」(3D ピクセル) の数は ~ 168,000 っぽい (40 * 64 * 64) であり、それぞれが画像サンプルの「機能」です。
Recursive Feature Elimination (RFE) を使用することを考えました。次に、次元削減を実行するために n が非常に高いため、これを主成分分析 (PCA) でフォローアップします。
予測するクラスは 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 に対してのみトレーニングされるため、数値が低いことはあまり心配していません。
トレーニング サイズを 2 倍にしてみましたが、92%の精度が得られました。これはかなり良いです。しかし、データセット全体に対してトレーニングを行ったところ、92.5%の精度が得られました。
したがって、データセットが 6 倍に増加したため、精度が 0.5% 向上しました。さらに、データ サンプルにはノイズがありません。したがって、サンプルに問題はありません。
また、データセットのトレーニング サイズの 1/12 では、n_features_to_select = 1000 を選択すると、同じ 76.92% が得られます (20000 でも同じです!!) RFE の実行中。ここに何か問題があるに違いありません。このように少ない数の機能を選択しても同じパフォーマンスが得られるのはなぜですか?