PCA 및 학습 / 테스트 / 검증 분할

Aug 19 2020

1149 개의 관측 값과 13,454 개의 예측 변수가있는 이진 분류 문제가 있습니다. 나는 PCA의 SX 와 train / test split 에 불만을 가진 cbeleites가 설명한 방법론을 적용하고 싶습니다 .

이 맥락에서 두 가지 질문이 있습니다.

(i) 사용할 PC 수에 대한 그리드 검색을 수행하는 경우 사용할 PC 수를 테스트 세트의 관측치 수보다 많이 테스트하는 것이 올바르지 않습니까? 그리드 검색에서 테스트해야하는 최대 PC 수는 테스트 세트의 관측치 수와 같거나 낮아야한다는 것이 직관적 인 것 같습니다 (p >> n 상황을 방지하기 위해).

(ii) 홀드 아웃 세트를 사용하는 것이 더 정확합니까? 설명으로 처음 사용 된 데이터의 90 %를 사용하여 PC에 최적 번호를 찾기 위해 교차 검증 1/10 즉 SX 불행 cbeleites 후 사용 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 수를 선택하는데도 사용해서는 안됩니다.