- Rukovodstvo
- статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
- Реализация PCA на Python с помощью Scikit-Learn
- Благодаря наличию высокопроизводительных процессоров и графических процессоров, практически возможно решить все проблемы регрессии, классификации, кластеризации и другие связанные проблемы с использованием моделей машинного обучения и глубокого обучения. Тем не менее, существуют различные факторы, которые вызывают узкие места в производительности при разработке таких моделей. Большое количество функций в наборе данных является одним из факторов, влияющих как на время обучения, так и на точность моделей машинного обучения. У вас есть разные варианты действий
- Анализ главных компонентов
- Преимущества PCA
- Нормализация функций
- Реализация PCA с помощью Scikit-Learn
- Импорт библиотек
- Импорт набора данных
- Предварительная обработка
- Применение PCA
- Обучение и прогнозирование
- Оценка эффективности
- Результаты с 2 и 3 основными компонентами
- Результаты с полным набором функций
- Обсуждение
- Ресурсы
Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Реализация PCA на Python с помощью Scikit-Learn
Благодаря наличию высокопроизводительных процессоров и графических процессоров, практически возможно решить все проблемы регрессии, классификации, кластеризации и другие связанные проблемы с использованием моделей машинного обучения и глубокого обучения. Тем не менее, существуют различные факторы, которые вызывают узкие места в производительности при разработке таких моделей. Большое количество функций в наборе данных является одним из факторов, влияющих как на время обучения, так и на точность моделей машинного обучения. У вас есть разные варианты действий
Благодаря наличию высокопроизводительных процессоров и графических процессоров, практически возможно решить все проблемы регрессии, классификации, кластеризации и другие связанные проблемы с использованием моделей машинного обучения и глубокого обучения. Тем не менее, существуют различные факторы, которые вызывают узкие места в производительности при разработке таких моделей. Большое количество функций в наборе данных является одним из факторов, влияющих как на время обучения, так и на точность моделей машинного обучения. У вас есть разные варианты работы с огромным количеством функций в наборе данных.
- Попробуйте обучить модели исходному количеству функций, на это уйдут дни или недели, если количество функций слишком велико.
- Уменьшите количество переменных, объединив коррелированные переменные.
- Извлеките наиболее важные функции из набора данных, которые отвечают за максимальную вариативность выходных данных. Для этой цели используются различные статистические методы, например линейный дискриминантный анализ, факторный анализ и анализ главных компонент.
В этой статье мы увидим, какможно реализовать анализ основных компонентов с помощью библиотеки Python Scikit-Learn .
Анализ главных компонентов
Анализ главных компонентов, или PCA , представляет собой статистический метод преобразования данных большой размерности в данные низкой размерности путем выбора наиболее важных функций, которые собирают максимум информации о наборе данных. Функции выбираются на основе отклонений, которые они вызывают в выходных данных. Признак, вызывающий наибольшую дисперсию, — это первый главный компонент. Признак, отвечающий за вторую по величине дисперсию, считается вторым главным компонентом и так далее. Важно отметить, что основные компоненты никак не связаны друг с другом.
Преимущества PCA
У уменьшения размерности с помощью PCA есть два основных преимущества.
- Время обучения алгоритмов значительно сокращается с меньшим количеством функций.
- Не всегда можно анализировать данные в больших измерениях. Например, если в наборе данных 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 доступна по адресу:
Набор данных состоит из 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)
Давайте посмотрим, как выглядит наш набор данных:
Выполнение указанной выше команды отобразит первые пять строк нашего набора данных, как показано ниже:
длина чашелистика ширина чашелистика длина лепестка ширина лепестка Класс
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 — это двухэтапный процесс:
- Инициализируйте PCA , передав количество компонентов конструктору.
- Вызовите 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 выглядят следующим образом:
Видно, что первый главный компонент отвечает за дисперсию 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%).
Количество основных компонентов, которые необходимо сохранить в наборе функций, зависит от нескольких условий, таких как емкость хранилища, время обучения, производительность и т. Д. В некоторых наборах данных все функции в равной степени вносят вклад в общую дисперсию, поэтому все основные компоненты имеют решающее значение для предсказания, и ни одно нельзя игнорировать. Общее эмпирическое правило состоит в том, чтобы взять количество главных из главных компонентов, которые вносят вклад в значительную дисперсию, и игнорировать те, которые имеют убывающую доходность дисперсии. Хороший способ — построить график дисперсии по отношению к основным компонентам и игнорировать основные компоненты с убывающими значениями, как показано на следующем графике:
Например, на приведенной выше диаграмме мы видим, что после третьего главного компонента изменение дисперсии почти уменьшается. Следовательно, можно выбрать первые три компонента.
Ресурсы
Хотите узнать больше о Scikit-Learn и других методах и алгоритмах машинного обучения? Я бы порекомендовал поискать более подробные ресурсы, например, один из этих онлайн-курсов:
Licensed under CC BY-NC-SA 4.0