В нашей предыдущей статье Реализация 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, вам следует ознакомиться с более глубокими ресурсами, такими как .