Как scikit-learning может выполнять PCA для разреженных данных в формате libsvm?

Я использую scikit-learning, чтобы выполнить некоторую задачу по уменьшению размеров. Мои обучающие/тестовые данные находятся в формате libsvm. Это большая разреженная матрица в полмиллиона столбцов.

Я использую функцию load_svmlight_file для загрузки данных, а с помощью SparsePCA обучение scikit выдает исключение ошибки входных данных.

Как это исправить?


person Bing Hsu    schedule 04.08.2012    source источник
comment
Пожалуйста, опубликуйте хотя бы сообщение об исключении.   -  person Fred Foo    schedule 04.08.2012


Ответы (1)


Разреженный PCA — это алгоритм поиска разреженной декомпозиции (компоненты имеют ограничение разреженности) для плотных данных.

Если вы хотите использовать обычный PCA для разреженных данных, вам следует использовать sklearn.decomposition.RandomizedPCA, который реализует масштабируемый приближенный метод, который работает как с разреженными, так и с плотными данными.

IIRC sklearn.decomposition.PCA в настоящее время работает только с плотными данными. Поддержка разреженных данных может быть добавлена ​​в будущем путем делегирования вычислений SVD в матрице разреженных данных, например, arpack.

Изменить: как отмечено в комментариях, разреженный ввод для RandomizedPCA устарел: вместо этого вы должны использовать sklearn.decomposition.TruncatedSVD, который делает именно то, что RandomizedPCA раньше делал с разреженными данными, но в первую очередь не должен был называться PCA.< /удалить>

Для пояснения: PCA математически определяется как центрирование данных (удаление среднего значения для каждого признака) и последующее применение усеченного SVD к центрированным данным.

Поскольку центрирование данных разрушило бы разреженность и привело бы к плотному представлению, которое часто больше не помещается в памяти, обычно выполняется прямое усечение SVD на разреженных данных (без центрирования). Это похоже на PCA, но это не совсем то же самое. Это реализовано в scikit-learn как sklearn.decomposition.TruncatedSVD.

Изменить (март 2019 г.). В настоящее время ведется работа по реализации PCA для разреженных данных с неявным центрированием: https://github.com/scikit-learn/scikit-learn/pull/12841

person ogrisel    schedule 21.08.2012
comment
В смысле неправильно? Или бесполезен для вашей задачи? Если вы использовали RandomizedPCA, попробуйте поиграть с количеством итераций мощности iterated_power, чтобы увидеть, сможете ли вы улучшить результаты (3 по умолчанию, вы можете попробовать, например, от 0 до 10). - person ogrisel; 23.08.2012
comment
Дополнительные сведения см. в справочной документации scikit-learn. org/dev/modules/generated/ и связанные ссылки. - person ogrisel; 23.08.2012
comment
В интересах других опоздавших RandomizedPCA больше не поддерживает ввод разреженных массивов. См. stackoverflow.com/questions/30242215/ - person josh314; 08.10.2015
comment
Для очень опоздавших RandomizedPCA устарела. Вместо этого используйте PCA с аргументом ключевого слова svd_solver='randomized' - person BallpointBen; 05.12.2016
comment
На разреженных данных PCA с svd_solver='randomized' не удастся. Вместо этого вы должны использовать TruncatedSVD, как указано выше. - person ogrisel; 12.12.2016
comment
@ogrisel У меня большая разреженная матрица, и я думаю об использовании TruncatedSVD, но в TruncatedSVD есть вызов параметра n_iter, которого нет в PCA. Каким должно быть идеальное значение для n_iter и что оно делает? - person user_6396; 07.03.2019
comment
Используйте значение по умолчанию. Если вы не доверяете рандомизированному решателю SVD, вы можете попробовать использовать решатель arpack и сравнить результаты. - person ogrisel; 07.03.2019