PCAとトレイン/テスト/検証の分割

Aug 19 2020

1149個の観測値と13,454個の予測子を持つバイナリ分類の問題があります。私はによって記載された方法論適用したいSXに不満cbeleitesにおけるPCAや電車/テスト分割を。

これに関連して、2つの質問があります。

(i)使用するPCの数をグリッド検索する場合、テストセット内の観測数よりも多い使用するPCの数をテストするのは正しくありませんか?グリッド検索でテストする必要のあるPCの最大数は、テストセットの観測値の数以下でなければならないことは直感的に思えます(おそらくp >> nの状況を防ぐため)。

(ii)ホールドアウトセットを使用する方が正しいですか?つまり、最初に10分割交差検定を使用して、SX不満のあるcbeleitesによって説明されているように、データの90%を使用してPCの最適数を見つけ、次に、で使用されたすべてのデータを使用てPCの最適数を使用して新しい推定量を適合させます。最初のステップは、ホールドアウトセットのクラスの確率を予測しますか?

編集より明確にするために、私のコードは次のようになります。

tests=[]
pps=[]
pcs=[]
skf=model_selection.StratifiedKFold(n_splits=10,random_state=61,shuffle=True)

for i in (2,5,10,25,50,100,114):

    tmp_pps=[]
    tmp_tests=[]

    for train_index, test_index in skf.split(X, y):
    
        estimator = SVC(probability=True)
        pca = PCA(i, svd_solver='arpack')
        scaler= StandardScaler()
    
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
    
        fScaler = scaler.fit(X_train)
        X_train_scaled = fScaler.transform(X_train)
        X_test_scaled = fScaler.transform(X_test)
    
        fpca = pca.fit(X_train_scaled)
        X_train_PCA = pca.transform(X_train_scaled)
        X_test_PCA = pca.transform(X_test_scaled)
    
        ft = estimator.fit(X_train_PCA, y_train)
        pp = estimator.predict_proba(X_test_PCA)[:, 1]
    
        tmp_tests.append(y_test)
        tmp_pps.append(pp)
    
    tests.append(tmp_tests)
    pps.append(tmp_pps)
    pcs.append(i)

for i in range(len(pcs)):
    pp = np.concatenate(res[i]).ravel()
    y_test = np.concatenate(tests[i]).ravel()
    score = roc_auc_score(y_test, pp)
    print(pcs[i],score)

これは正しくない/偏ったアプローチですか?

回答

gunes Aug 19 2020 at 01:30

i)はい、PCの数は観測値の数以下である必要があります。これは、データマトリックス(一般性を失うことなく正規化された平均を想定)、 $X_{n\times p}$、ランクがあります $\leq \min(n,p)=n$、 この場合。 $X^TX$ ランクがあります $\leq n$ 同様に理由は $\text{rank}(AB)\leq \text{rank}(A)$

ii)観測数が少ないため、最適な数のPCを選択する際に交差検定を使用する方がよい場合があります。さまざまなフォールドからの決定を融合するための基準(たとえば、95%の分散をカバーする)と適切な投票スキームを見つける必要があります。最終的には、すべてのトレーニングデータを使用してPCを見つけることができます。テストセットは最初から分離する必要があります。つまり、PCの数を選択する場合でも使用しないでください。