PCA и разделение на поезд / тестирование / проверку
У меня проблема бинарной классификации с 1149 наблюдениями и 13 454 предикторами. Я хочу применить методологию, описанную cbeleites, недовольными SX, в PCA и разделении поезд / тест .
В связи с этим у меня есть два вопроса:
(i) Если я выполняю поиск по сетке для определения количества используемых ПК, неправильно ли тестировать количество используемых ПК, превышающее количество наблюдений в тестовом наборе? Мне кажется интуитивно понятным, что максимальное количество ПК, которые следует тестировать в поиске по сетке, должно быть равно или меньше количества наблюдений в тестовом наборе (предположительно, чтобы предотвратить ситуацию p >> n).
(ii) Правильнее ли использовать набор для удержания? т.е. сначала используйте 10-кратную перекрестную проверку, чтобы найти оптимальное количество ПК с использованием 90% данных, как описано cbeleites, недовольными SX , затем установите новую оценку, используя оптимальное количество ПК, используя все данные, которые использовались в первый шаг предсказать вероятность набора классов удержания?
ИЗМЕНИТЬ Для большей ясности мой код выглядит примерно так:
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)
Это неправильный / необъективный подход?
Ответы
i) Да, количество ПК должно быть меньше или равно количеству наблюдений, потому что матрица данных (предположим, что среднее нормализовано без потери общности), $X_{n\times p}$, имеет звание $\leq \min(n,p)=n$, в этом случае. $X^TX$ будет иметь звание $\leq n$ а также потому что $\text{rank}(AB)\leq \text{rank}(A)$.
ii) Поскольку у вас небольшое количество наблюдений, может быть лучше использовать перекрестную проверку для выбора наилучшего количества ПК. Вам необходимо найти критерии (например, покрыть 95% дисперсии) и правильную схему голосования для объединения решений, исходящих из разных точек зрения. В конце концов, вы можете использовать все свои тренировочные данные, чтобы найти компьютеры. Набор тестов должен быть отдельным с самого начала, т.е. не следует использовать его даже для выбора количества ПК.