Рубрики
Без рубрики

Реализация PCA в Python с помощью Scikit-Learn

Автор оригинала: Usman Malik.

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

  1. Попробуйте обучить модели на исходном количестве функций, которые занимают дни или недели, если количество функций слишком велико.
  2. Уменьшите количество переменных, объединив коррелированные переменные.
  3. Извлеките из набора данных наиболее важные объекты, которые отвечают за максимальную дисперсию выходных данных. Для этого используются различные статистические методы, например линейный дискриминантный анализ, факторный анализ и анализ главных компонент.

В этой статье мы увидим, как анализ основных компонентов может быть реализован с помощью библиотеки Python Scikit-Learn .

Анализ основных компонентов

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

Преимущества PCA

Есть два основных преимущества уменьшения размерности с помощью PCA.

  1. Время обучения алгоритмов значительно сокращается при меньшем количестве функций.
  2. Не всегда возможно анализировать данные в больших измерениях. Например, если в наборе данных имеется 100 объектов. Общее количество точечных диаграмм, необходимых для визуализации данных, будет 100(100-1)2 . Практически невозможно анализировать данные таким образом.

Нормализация функций

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

Наконец, последний момент, который следует запомнить, прежде чем мы начнем кодирование, – это то, что PCA является статистическим методом и может быть применен только к числовым данным. Поэтому категориальные признаки должны быть преобразованы в числовые признаки, прежде чем PCA может быть применен.

Реализация PCA с помощью Scikit-Learn

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

Импорт библиотек

import numpy as np
import pandas as pd

Импорт набора данных

Набор данных, который мы будем использовать в этой статье, – это знаменитый набор данных Iris . Некоторая дополнительная информация о наборе данных Iris доступна по адресу:

Набор данных, который мы будем использовать в этой статье, – это знаменитый набор данных || Iris || . Некоторая дополнительная информация о наборе данных Iris доступна по адресу:

Набор данных состоит из 150 записей растений ириса с четырьмя признаками: “длина чашелистика”, “ширина чашелистика”, “длина лепестка” и “ширина лепестка”. Все функции числовые. Записи были классифицированы на один из трех классов: “Iris-setosa”, “Iris-versicolor” или “Iris-virginica”.

Выполните следующий скрипт для загрузки набора данных с помощью pandas :

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
dataset = pd.read_csv(url, names=names)

Давайте посмотрим, как выглядит наш набор данных:

dataset.head()

Выполнение приведенной выше команды приведет к отображению первых пяти строк нашего набора данных, как показано ниже:

Ирис-сетоза 0 0.2 3.5 1.4 5.1
Ирис-сетоза 1 0.2 3.0 1.4 4.9
Ирис-сетоза 2 0.2 3.2 1.3 4.7
Ирис-сетоза 3 0.2 3.1 1.5 4.6
Ирис-сетоза 4 0.2 3.6 1.4 5.0

Предварительная обработка

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

X = dataset.drop('Class', 1)
y = dataset['Class']

Приведенный выше сценарий хранит наборы функций в переменной X и ряд соответствующих меток в переменной y .

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

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

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

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Применение PCA

Это всего лишь вопрос трех строк кода для выполнения PCA с использованием библиотеки Scikit-Learn Python. Для этой цели используется класс PCA . PCA зависит только от набора функций, а не от данных метки. Поэтому PCA можно рассматривать как неконтролируемую технику машинного обучения.

Выполнение PCA с помощью Scikit-Learn-это двухэтапный процесс:

  1. Инициализируйте класс PCA , передав конструктору количество компонентов.
  2. Вызовите методы fit , а затем transform , передав набор функций этим методам. Метод transform возвращает заданное количество основных компонентов.

Взгляните на следующий код:

from sklearn.decomposition import PCA

pca = PCA()
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

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

Класс PCA содержит explained_variance_ratio_ , который возвращает дисперсию, вызванную каждым из основных компонентов. Выполните следующую строку кода, чтобы найти “объясненный коэффициент дисперсии”.

explained_variance = pca.explained_variance_ratio_

Переменная explained_variance теперь является массивом типа float, который содержит коэффициенты дисперсии для каждого основного компонента. Значения переменной explained_variance выглядят следующим образом:

0.722265
0.239748
0.033381
0.004606

Можно видеть, что первый главный компонент отвечает за 72,22% дисперсии. Аналогично, второй основной компонент вызывает 23,9% – ную дисперсию в наборе данных. В совокупности мы можем сказать, что (72.22 + 23.9) 96.21% процентов классификационной информации, содержащейся в наборе признаков, захватывается первыми двумя основными компонентами.

Давайте сначала попробуем использовать 1 главный компонент для обучения нашего алгоритма. Для этого выполните следующий код:

from sklearn.decomposition import PCA

pca = PCA(n_components=1)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

Остальная часть процесса проста.

Обучение и составление прогнозов

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

from sklearn.ensemble import RandomForestClassifier

classifier = RandomForestClassifier(max_depth=2, random_state=0)
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

Оценка Эффективности

from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score

cm = confusion_matrix(y_test, y_pred)
print(cm)
print('Accuracy' + accuracy_score(y_test, y_pred))

Вывод приведенного выше скрипта выглядит следующим образом:

[[11  0  0]
 [ 0 12  1]
 [ 0  1  5]]
0.933333333333

Из выходных данных видно, что только с одной функцией алгоритм случайного леса способен правильно предсказать 28 из 30 экземпляров, что приводит к точности 93,33%.

Результаты с 2 и 3 основными компонентами

Теперь давайте попробуем оценить эффективность классификации алгоритма случайного леса с 2 основными компонентами. Обновите этот фрагмент кода:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

Здесь количество компонентов для PCA было установлено равным 2. Результаты классификации с 2 компонентами следующие:

[[11  0  0]
 [ 0 10  3]
 [ 0  2  4]]
0.833333333333

При двух основных компонентах точность классификации снижается до 83,33% по сравнению с 93,33% для 1 компонента.

С тремя основными компонентами результат выглядит следующим образом:

[[11  0  0]
 [ 0 12  1]
 [ 0  1  5]]
0.933333333333

С тремя основными компонентами точность классификации снова возрастает до 93.33%

Результаты с полным набором функций

Давайте попробуем найти результаты с полным набором функций. Для этого просто удалите компьютер Отдельно от сценария, который мы написали выше. Результаты с полным набором функций, без применения PCA выглядят следующим образом:

[[11  0  0]
 [ 0 13  0]
 [ 0  2  4]]
0.933333333333

Точность, полученная с полным набором функций для алгоритма случайного леса, также составляет 93,33%.

Обсуждение

В результате вышеприведенных экспериментов мы достигли оптимального уровня точности при значительном сокращении количества объектов в наборе данных. Мы видели, что точность, достигнутая только с 1 основным компонентом, равна точности, достигнутой с набором функций воли, то есть 93,33%. Уместно также отметить, что точность классификатора не обязательно повышается с увеличением числа основных компонентов. Из полученных результатов видно, что точность, достигнутая с одним основным компонентом (93,33%), была больше, чем точность, достигнутая с двумя основными компонентами (83,33%).

Количество основных компонентов, сохраняемых в наборе функций, зависит от нескольких условий, таких как емкость хранилища, время обучения, производительность и т. Д. В некоторых наборах данных все функции в равной степени участвуют в общей дисперсии, поэтому все основные компоненты имеют решающее значение для предсказаний, и ни один из них не может быть проигнорирован. Общее эмпирическое правило состоит в том, чтобы взять количество главных главных компонентов, которые вносят значительный вклад в дисперсию, и игнорировать те, которые имеют уменьшающуюся дисперсию отдачи. Хороший способ-построить дисперсию по основным компонентам и игнорировать основные компоненты с уменьшающимися значениями, как показано на следующем графике:

Дисперсия ПК

Например, на приведенной выше диаграмме мы видим, что после третьего главного компонента изменение дисперсии почти уменьшается. Поэтому можно выбрать первые три компонента.

Ресурсы

Хотите узнать больше о Scikit-Learn и других методах и алгоритмах машинного обучения? Я бы рекомендовал поискать более подробные ресурсы, например один из этих онлайн-курсов: