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