В нашей предыдущей статье « Реализация PCA в Python с помощью Scikit-Learn» мы изучили, как можно уменьшить размерность набора функций с помощью PCA. В этой статье мы изучим еще один очень важный метод уменьшения размерности:линейный дискриминантный анализ (или LDA). Но сначала давайте кратко обсудим, чем PCA и LDA отличаются друг от друга.
PCA против 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 доступна по следующей ссылке:
https://archive.ics.uci.edu/ml/datasets/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 требуется всего четыре строки
кода. LinearDiscriminantAnalysis
класс 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)
В приведенном выше LinearDiscriminantAnalysis
класс
LinearDiscriminantAnalysis импортируется как 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 против LDA: что выбрать для уменьшения размерности?
В случае равномерно распределенных данных LDA почти всегда работает лучше, чем PCA. Однако, если данные сильно искажены (неравномерно распределены), рекомендуется использовать PCA, поскольку LDA может быть смещено в сторону большинства классов.
Наконец, полезно, что PCA можно применять как к помеченным, так и к немаркированным данным, поскольку он не зависит от выходных меток. С другой стороны, LDA требует выходных классов для поиска линейных дискриминантов и, следовательно, требует помеченных данных.
Для получения дополнительной информации о том, как вы можете использовать Python для решения ваших задач в области науки о данных, вам следует ознакомиться с более подробными ресурсами, такими как Data Science in Python, Pandas, Scikit-learn, Numpy, Matplotlib{.udemy-link} .