Применение PCA к одному образцу - PullRequest
3 голосов
/ 01 мая 2019

В настоящее время я работаю над проектом по распознаванию изображений с машинным обучением.

  • В состав поезда входит 1600 изображений с размером 300x300, поэтому 90000 функций на изображение.
  • Для ускорениятренируясь, я применяю PCA с n_components = 50
  • В тестовом наборе 450 изображений, и я могу успешно протестировать модель в этом тестовом наборе.

Теперь я хочу предсказать одинизображение, которое захватывает веб-камера.Вопрос в том, должен ли я применять PCA к этому изображению?

  • Если я не применяю PCA, я получаю ValueError: X.shape[1] = 90000 should be equal to 50, the number of features at training time
  • Если я применяю PCA, я получаю ValueError: n_components=50 must be between 0 and min(n_samples, n_features)=1 with svd_solver='full'

Я использую Python 3, scikit-learn 0.20.3, вот как я применяю PCA:

from sklearn.decomposition import PCA
pca = PCA(50)
pca.fit_transform(features)

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Вам также необходимо применить PCA на вашем тестовом наборе.

Вы должны рассмотреть, что делает PCA:

PCA создает новый набор функций (содержащий меньше функций, чем исходное пространство функций), а затем вы впоследствии обучаетесь этому новому набору функций. Вам нужно создать этот новый набор функций, чтобы тестовый набор для вашей модели был действительным!

Важно отметить, что каждая функция в вашем «сокращенном» наборе функций представляет собой линейную комбинацию исходных функций, где для заданного числа новых функций (n_components) они представляют собой набор функций, которые максимизируют дисперсию оригинальное пространство сохранилось в новом пространстве.

Практически, чтобы выполнить соответствующее преобразование на вашем тестовом наборе, вам нужно сделать:

# X_test - your untransformed test set

X_test_reduced = pca.transform(X_test)

где pca - это экземпляр PCA(), обученный на вашем тренировочном наборе. По сути, вы строите преобразование в пространство более низкого измерения, и вы хотите, чтобы это преобразование было одинаковым для обучающего и тестового набора! Если вы тренируете pca независимо как в обучающем, так и в тестовом наборе, вы (почти наверняка) встраиваете данные в разные низкоразмерные представления и имеете разные наборы функций.

1 голос
/ 01 мая 2019

Да, вам необходимо применить PCA, следуя принципу выполнения одних и тех же действий с данными во время обучения и тестирования.

Однако главное в том, что вы не должны «переобучать» / приспосабливать PCA снова,Используйте PCA transform

pca.transform(X_test) #where X_test is a collection of images for testing, should be similar to your features.

Идея состоит в том, что fit_transform представляет собой двухэтапный процесс, состоящий из подбора PCA и последующего соответствующего преобразования наборов данных.

...