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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 import numpy as np 
 import pandas as pd 

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

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

https://archive.ics.uci.edu/ml/datasets/iris

Набор данных состоит из 150 записей о растении ирис с четырьмя характеристиками: «длина чашелистика», «ширина чашелистика», «длина лепестка» и «ширина лепестка». Все функции числовые. Записи были разделены на один из трех классов, а именно «Ирис сетоса», «Ирис разноцветный» или «Ирис вергиника».

Выполните следующий скрипт, чтобы загрузить набор данных с помощью 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 5.1 3.5 1.4 0,2 Ирис-сетоса 1 4.9 3.0 1.4 0,2 Ирис-сетоса 2 4,7 3,2 1.3 0,2 Ирис-сетоса 3 4.6 3.1 1.5 0,2 Ирис-сетоса 4 5.0 3,6 1.4 0,2 Ирис-сетоса

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

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

 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 с использованием библиотеки Python Scikit-Learn достаточно всего трех строк кода. Для этого используется класс 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 теперь представляет собой массив типа с плавающей запятой, который содержит отношения дисперсии для каждого главного компонента. Значения explained_variance выглядят следующим образом:

0,722265

0,239748

0,0333812

0,0046056

Видно, что первый главный компонент отвечает за дисперсию 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 основными компонентами

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

 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 из сценария, который мы написали выше. Результаты с полным набором функций без применения PCA выглядят следующим образом:

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

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

Обсуждение

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

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

ВариантПК{.ezlazyload .img-responsive}

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

Ресурсы

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

comments powered by Disqus