При наличии высокопроизводительных процессоров и графических процессоров практически возможно решить все регрессионные, классификационные, кластерные и другие связанные с ними проблемы с помощью моделей машинного обучения и глубокого обучения. Однако при разработке таких моделей все еще существуют различные факторы, вызывающие узкие места в производительности. Большое количество объектов в наборе данных является одним из факторов, влияющих как на время обучения, так и на точность моделей машинного обучения. У вас есть различные варианты работы с огромным количеством объектов в наборе данных.
- Попробуйте обучить модели на исходном количестве функций, которые занимают дни или недели, если количество функций слишком велико.
- Уменьшите количество переменных, объединив коррелированные переменные.
- Извлеките из набора данных наиболее важные объекты, которые отвечают за максимальную дисперсию выходных данных. Для этого используются различные статистические методы, например линейный дискриминантный анализ, факторный анализ и анализ главных компонент.
В этой статье мы увидим, как анализ основных компонентов может быть реализован с помощью библиотеки Python Scikit-Learn .
Анализ основных компонентов
Анализ главных компонент, или PCA , представляет собой статистический метод преобразования данных высокой размерности в данные низкой размерности путем выбора наиболее важных признаков, которые захватывают максимальную информацию о наборе данных. Объекты выбираются на основе дисперсии, которую они вызывают в выходных данных. Признак, вызывающий наибольшую дисперсию, является первым основным компонентом. Признак, ответственный за вторую по величине дисперсию, считается вторым главным компонентом, и так далее. Важно отметить, что основные компоненты не имеют никакой корреляции друг с другом.
Преимущества PCA
Есть два основных преимущества уменьшения размерности с помощью PCA.
- Время обучения алгоритмов значительно сокращается при меньшем количестве функций.
- Не всегда возможно анализировать данные в больших измерениях. Например, если в наборе данных имеется 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-это двухэтапный процесс:
- Инициализируйте класс
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
теперь является массивом типа 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 и других методах и алгоритмах машинного обучения? Я бы рекомендовал поискать более подробные ресурсы, например один из этих онлайн-курсов: