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

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

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

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

PCA vs LDA: В чем разница?

И PCA, и LDA являются методами линейного преобразования. Однако PCA-это неконтролируемый метод, в то время как LDA-это контролируемый метод уменьшения размерности.

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

В отличие от PCA, LDA пытается уменьшить размеры набора функций, сохраняя при этом информацию, которая различает выходные классы. LDA пытается найти границу принятия решений вокруг каждого кластера класса. Затем он проецирует точки данных на новые измерения таким образом, чтобы кластеры были как можно более отделены друг от друга, а отдельные элементы внутри кластера были как можно ближе к центроиду кластера. Новые измерения ранжируются на основе их способности максимизировать расстояние между кластерами и минимизировать расстояние между точками данных внутри кластера и их центроидами. Эти новые измерения формируют линейные дискриминанты набора признаков.

Давайте теперь посмотрим, как мы можем реализовать LDA с помощью Python Scikit-Learn.

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

Как и PCA, библиотека Scikit-Learn содержит встроенные классы для выполнения LDA над набором данных. В этом разделе мы применим LDA к набору данных Iris, так как мы использовали тот же набор данных для статьи PCA, и мы хотим сравнить результаты LDA с PCA. Информация о наборе данных Iris доступна по следующей ссылке:

Как и PCA, библиотека || Scikit-Learn || содержит встроенные классы для выполнения LDA над набором данных. В этом разделе мы применим LDA к набору данных Iris, так как мы использовали тот же набор данных для статьи PCA, и мы хотим сравнить результаты LDA с PCA. Информация о наборе данных Iris доступна по следующей ссылке:

Остальные разделы следуют нашему традиционному конвейеру машинного обучения:

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

import numpy as np
import pandas as pd

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

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)

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

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

X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values

Приведенный выше скрипт присваивает первые четыре столбца набора данных, т. е. набор объектов, переменной X , в то время как значения в пятом столбце (метки) присваиваются переменной y .

Следующий код делит данные на обучающие и тестовые наборы:

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

from sklearn.preprocessing import StandardScaler

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

Выполнение LDA

Для выполнения LDA с помощью Scikit-Learn требуется всего четыре строки кода. Класс Linear Discriminant Analysis библиотеки sklearn.discriminant_analysis может быть использован для выполнения LDA в Python. Взгляните на следующий сценарий:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

lda = LDA(n_components=1)
X_train = lda.fit_transform(X_train, y_train)
X_test = lda.transform(X_test)

В приведенном выше скрипте класс Линейный дискриминантный анализ импортируется как LDA . Как и PCA, мы должны передать значение параметра n_components LDA, которое относится к числу линейных дискриминантов, которые мы хотим получить. В этом случае мы устанавливаем значение n_components равным 1, так как сначала хотим проверить производительность нашего классификатора с помощью одного линейного дискриминанта. Наконец, мы выполняем методы fit и transform , чтобы фактически получить линейные дискриминанты.

Обратите внимание, что в случае LDA метод transform принимает два параметра: X_train и y_train . Однако в случае PCA метод transform требует только одного параметра, т. е. X_train . Это отражает тот факт, что LDA учитывает метки выходного класса при выборе линейных дискриминантов, в то время как PCA не зависит от меток выходного класса.

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

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

Выполните следующий код:

from sklearn.ensemble import RandomForestClassifier

classifier = RandomForestClassifier(max_depth=2, random_state=0)

classifier.fit(X_train, y_train)
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' + str(accuracy_score(y_test, y_pred)))

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

[[11  0  0]
 [ 0 13  0]
 [ 0  0  6]]
Accuracy 1.0

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

PCA vs LDA: Что выбрать для уменьшения размерности?

В случае равномерно распределенных данных LDA почти всегда работает лучше, чем PCA. Однако если данные сильно искажены (неравномерно распределены), то рекомендуется использовать PCA, поскольку LDA может быть смещена в сторону класса большинства.

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

Для получения дополнительной информации о том, как вы можете использовать Python для обработки ваших задач data science, вам следует ознакомиться с более глубокими ресурсами, такими как .