Алгоритм неконтролируемого машинного обучения для уменьшения размерности

Всем привет! Это второй алгоритм машинного обучения без учителя, который я обсуждаю здесь. На этот раз тема - Анализ главных компонентов (PCA). В самом начале руководства я объясню размерность набора данных, что означает уменьшение размерности, основные подходы к уменьшению размерности, причины уменьшения размерности и что означает PCA. Затем я углублюсь в тему PCA, реализовав алгоритм PCA с библиотекой машинного обучения Scikit-learn. Это поможет вам легко применить PCA к реальному набору данных и очень быстро получить результаты.

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

Рекомендуемые чтения

Я настоятельно рекомендую вам прочитать мои предыдущие статьи, опубликованные в Data Science 365, прежде чем приступить к чтению этой. Это потому, что вы должны иметь четкое представление об основах numpy, pandas, matplotlib, seaborn и машинного обучения, чтобы понимать обсуждаемые здесь коды и концепции.

Что такое уменьшение размерности?

Прежде чем мы рассмотрим уменьшение размерности набора данных, мы должны узнать, что такое размерность. Проще говоря, размерность - это количество измерений, функций или входных переменных, связанных в наборе данных. Часто это можно представить как количество столбцов (кроме столбца метки) в наборе данных. В следующей таблице показана часть набора данных iris, который содержит четыре объекта. Итак, размерностей четыре. Это означает, например, что для демонстрации первой точки данных в четырехмерном пространстве мы используем нотацию p1 (5.1, 3.5, 1.4, 0.2).

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

Основные подходы к снижению размерности

Есть два основных подхода к уменьшению размерности:

  • Линейные методы
  • Нелинейные методы (обучение многообразию)

В этом руководстве я сосредоточусь на анализе главных компонентов, который является одним из линейных методов.

Проклятие размерности

Проклятие размерности - одна из наиболее часто встречающихся проблем машинного обучения. Это проблема, возникающая при работе с данными, имеющими большое количество измерений в пространстве признаков. Многие задачи машинного обучения включают тысячи функций для каждого экземпляра обучения. Все эти функции делают обучение чрезвычайно медленным, а также могут значительно усложнить поиск хорошего решения. Алгоритмы не могут эффективно обучать данные из-за огромного размера пространства функций. Такого рода проблемы часто называют проклятием размерности.

Методы уменьшения размерности помогают избавиться от проклятия размерности. Алгоритмы уменьшения размерности проецируют данные высокой размерности в пространство низкой размерности. Когда данные оказываются в низкоразмерном пространстве, алгоритмы машинного обучения могут более эффективно и результативно определять интересные закономерности.

Что такое анализ главных компонентов (PCA)?

PCA - это метод уменьшения линейной размерности. Он преобразует набор коррелированных переменных (p) в меньшее число k (k ‹p) некоррелированных переменных, называемых главными компонентами, сохраняя при этом как можно больше вариаций в исходном набор данных, насколько это возможно.

Основная концепция PCA - это рассмотрение корреляции между функциями. Если корреляция между подмножеством признаков очень высока, PCA попытается объединить сильно коррелированные признаки и представить эти данные с меньшим количеством линейно некоррелированных признаков. Алгоритм продолжает выполнять это сокращение корреляции, находя направления максимальной дисперсии в исходных многомерных данных и проецируя их на меньшее размерное пространство. Эти новые производные компоненты известны как главные компоненты.

С помощью этих компонентов можно восстановить оригинальные черты - не совсем точно, но в целом достаточно близко. Алгоритм PCA активно пытается минимизировать ошибку реконструкции во время поиска оптимальных компонентов.

Уменьшая размерность данных, PCA уменьшит размер данных, улучшив производительность алгоритмов машинного обучения.

PCA - это неконтролируемый метод, то есть он не использует информацию из целевого вектора, а вместо этого учитывает только матрицу признаков.

Масштабирование функций в PCA

Важно выполнить масштабирование функций перед запуском PCA, если существует значительная разница в масштабе между функциями набора данных; например, одна функция имеет значения от 0 до 1, а другая - от 100 до 1000. PCA очень чувствителен к относительным диапазонам исходных функций. Мы можем применить стандартизацию z-оценки, чтобы привести все функции в одну шкалу , используя Scikit-learn StandardScaler () , который находится в подмодуле предварительной обработки в Scikit-learn.

Использование Scikit-learn для PCA

Теперь давайте поработаем над примером, чтобы увидеть, как реализовать PCA с помощью библиотеки Scikit-learn. В этом примере мы будем использовать встроенный в Scikit-learn набор данных груди_cancer, который содержит 30 функций и 569 наблюдений. Следующие шаги описывают процесс внедрения PCA в набор данных с помощью Scikit-learn.

Шаг 1. Импортируйте библиотеки и установите стили печати.

В качестве первого шага мы импортируем различные библиотеки Python, которые полезны для нашего анализа данных, визуализации данных, расчетов и задач построения моделей. При импорте этих библиотек мы используем следующие соглашения.

Обратите внимание, что мы еще не импортировали какой-либо класс или функцию Scikit-learn. Мы импортируем их один за другим, когда нам нужно их использовать.

Шаг 2. Получите и подготовьте данные

Набор данных, который мы здесь используем, доступен в Scikit-learn. Но это не тот формат, который нам нужен. Итак, нам нужно проделать некоторые манипуляции, чтобы подготовить набор данных для нашей задачи. Сначала мы загружаем набор данных с помощью функции Scikit-learn load_breast_cancer (). Затем мы конвертируем данные в pandas DataFrame, который является знакомым нам форматом.

Теперь переменная df содержит фрейм данных pandas из набора данных груди_cancer. Мы можем увидеть его первые 5 строк, вызвав метод head (). На следующем изображении показана часть набора данных.

Полный набор данных содержит 30 столбцов и 569 наблюдений.

Шаг 3: Примените PCA

В нашем наборе данных груди_cancer исходное пространство объектов имеет 30 измерений, известных как размеры p. PCA будет проецировать данные на меньшее подпространство с размерами k (где k ‹p), сохраняя при этом как можно больше вариаций. Эти k измерения известны как главные компоненты.

Применяя PCA, мы теряем часть дисперсии (то есть информацию). Уменьшая размерность данных, PCA уменьшит размер данных.

  • Это улучшит производительность алгоритмов машинного обучения.
  • Это снизит требования к оборудованию и ускорит процесс обучения.
  • Это позволит нам легко понять основную структуру данных.
  • Это позволит нам визуализировать данные на 2-м или 3-м графике (если мы выберем количество основных компонентов как 2 или 3).

3.a. Получите матрицу характеристик

Матрица объектов содержит значения всех 30 объектов в наборе данных. Это двумерный массив Numpy размером 569x30. Он хранится в переменной X.

3.b. При необходимости стандартизируйте функции

Вы можете видеть, что значения набора данных не масштабируются одинаково. Итак, нам нужно применить стандартизацию z-оценки, чтобы учесть все функции в одной шкале. Для этого мы используем класс Scikit-learn StandardScaler (), который находится в подмодуле предварительная обработка в Scikit-learn.

Сначала мы импортируем класс StandardScaler (). Затем мы создаем объект этого класса и сохраняем его в переменной scaler. Затем мы используем метод fit () объекта scaler с входным значением X (матрица признаков). Это позволит вычислить среднее значение и стандартное отклонение для каждой переменной в наборе данных. Наконец, мы выполняем преобразование с помощью метода transform () объекта scaler. Преобразованные (масштабированные) значения X хранятся в переменной X_scaled, которая также является Двумерный массив Numpy 569x30.

3.c. Выберите правильное количество размеров (k)

Теперь мы готовы применить PCA к нашему набору данных. Перед этим нам нужно выбрать правильное количество измерений (то есть правильное количество главных компонентов - k). Для этого мы применяем PCA с исходным числом измерений (т. Е. 30) и смотрим, насколько хорошо PCA улавливает дисперсию данных.

В Scikit-learn PCA применяется с использованием класса PCA (). Он находится в подмодуле декомпозиция в Scikit-learn. Самый важный гиперпараметр в этом классе - n_components. Может принимать значения одного из следующих типов.

  • Нет: это значение по умолчанию. Если мы не укажем значение, все компоненты сохранятся. В нашем примере это точно так же, как n_components = 30.
  • int: Если это положительное целое число, такое как 1, 2, 30, 100 и т. д., алгоритм вернет это количество основных компонентов. Целочисленное значение должно быть меньше или равно исходному количеству объектов в наборе данных.
  • float: если 0 ‹n_components‹ 1, PCA будет выберите такое количество компонентов, которое необходимо объяснить. Например, если n_components = 0,95, алгоритм выберет количество компонентов при сохранении 95% изменчивости данных.

При применении PCA все, что вам нужно сделать, это создать экземпляр класса PCA () и подогнать его, используя масштабированные значения X. Затем примените трансформацию. Переменная X_pca_30 хранит преобразованные значения основных компонентов, возвращаемых классом PCA (). X_pca_30 - это двумерный массив Numpy размером 569x30.

Мы установили n_components = 30. Исходное количество измерений в нашем наборе данных также равно 30. Мы вообще не уменьшили размерность (мы просто преобразовали данные). Следовательно, процент отклонения, объясняемый 30 основными компонентами, должен составлять 100%.

Атрибут объясненная_вариация_ratio_ класса PCA () возвращает одномерный массив numpy, который содержит значения процента дисперсии, объясняемой каждым из выбранных компонентов.

Только первый компонент охватывает около 44,27% изменчивости в наборе данных, а второй компонент охватывает около 18,97% изменчивости в наборе данных и так далее. Также обратите внимание, что значения указанного выше массива отсортированы в порядке убывания. Сумма вышеуказанного массива вернет общую дисперсию, объясняемую каждым из выбранных компонентов.

Если мы получим совокупную сумму указанного выше массива, мы сможем увидеть следующий массив.

Затем создаем следующий сюжет.

Результат:

Теперь мы в правильном месте. Посмотрев на этот сюжет, мы можем увидеть следующее.

Вы можете видеть, что первые 10 основных компонентов сохраняют около 95,1% изменчивости в наборе данных, уменьшая при этом 20 (30–10) функций в наборе данных. Замечательно. Остальные 20 функций содержат менее 5% изменчивости данных.

Когда мы говорим о графиках, невозможно создать диаграмму рассеяния для исходного набора данных, потому что он содержит 30 объектов. Уменьшение количества измерений до двух или трех позволяет создать двумерную диаграмму рассеяния или трехмерную диаграмму рассеяния, которая помогает нам обнаруживать такие закономерности, как кластеры. Следовательно, уменьшение размерности чрезвычайно полезно для визуализации данных. Но имейте в виду, что в нашей задаче, если мы создадим двумерную диаграмму рассеяния с использованием первых двух основных компонентов, она объяснит только около 63,24% изменчивости данных, а если мы создадим трехмерную диаграмму рассеяния с использованием первых трех основных компонентов, она объясняет только около 72,64% изменчивости данных!

3.d: примените PCA, установив n_components = 2

Давайте применим PCA к нашему набору данных с n_components = 2. Это спроецирует наши исходные данные на двумерное подпространство. Это вернет 2 компонента, которые охватывают 63,24% изменчивости данных.

Теперь мы создаем 2-мерную диаграмму рассеяния данных, используя значения двух основных компонентов.

Результат:

Другой способ создать двухмерную диаграмму рассеяния - использовать библиотеку визуализации машинного обучения Yellowbrick. Используя визуализатор PCA (объект, который учится на данных для создания визуализации), мы можем создать еще более информативную 2-мерную диаграмму рассеяния с помощью всего нескольких строк кода.

Результат:

3.e: примените PCA, установив n_components = 3

Давайте применим PCA к нашему набору данных с n_components = 3. Это спроецирует наши исходные данные на трехмерное подпространство. Это вернет 3 компонента, которые охватывают 72,64% изменчивости данных.

Теперь мы создаем трехмерную диаграмму рассеяния данных, используя значения трех основных компонентов.

Результат:

Другой способ создать трехмерную диаграмму рассеяния - использовать библиотеку визуализации машинного обучения Yellowbrick. Используя визуализатор PCA (объект, который учится на данных для создания визуализации), мы можем создать еще более информативную трехмерную диаграмму рассеяния с помощью всего нескольких строк кода.

Результат:

3.f: применить PCA, установив n_components = 0,95

Давайте применим PCA к нашему набору данных с n_components = 0,95. Этот выберет количество компонентов с сохранением 95% изменчивости данных.

Форма массива X_pca_95:

Это означает, что алгоритм нашел 10 основных компонентов, чтобы сохранить 95% изменчивости данных. Массив X_pca_95 содержит значения всех 10 основных компонентов. Мы можем визуализировать эти значения, как на следующем графике.

Результат:

Давайте создадим DataFrame pandas, используя значения всех 10 основных компонентов, и добавим столбец метки исходного набора данных.

Размер df_new, включая столбец метки, составляет:

Когда мы сравниваем с исходным набором данных, который содержит 30 функций, он содержит только 10 функций, но с 95% изменчивости данных. Для дальнейшего использования мы можем сохранить наш новый набор данных в виде файла Excel или CSV. При установке index = False метки индекса строки не сохраняются в файлах.

После выполнения вышеуказанного кода файлы будут сохранены в вашем текущем рабочем каталоге. Используя новый набор данных, вы можете применять алгоритмы классификации, такие как логистическая регрессия, опорные векторные машины и K-ближайшие соседи, для дальнейшего анализа данных.

Вот и все. В следующей статье я расскажу о математике, лежащей в основе анализа основных компонентов, путем ручного выполнения алгоритма с использованием мощных библиотек numpy и pandas. Это поможет вам понять, как PCA действительно работает за кулисами.

Это конец сегодняшней публикации. Мои читатели могут подписаться на членство по следующей ссылке, чтобы получить полный доступ ко всем рассказам, которые я пишу, и я получу часть вашего членского взноса.

Ссылка для регистрации: https://rukshanpramoditha.medium.com/membership

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

Особая благодарность авторам следующих двух книг, которые я упомянул, чтобы познакомиться с PCA.

  • Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow от Орелиен Жерон, 2019 г.
  • Практическое обучение без учителя с использованием Python, Анкур А. Патель, 2019 г.

Рукшан Прамодитха
2020–08–04