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

В нашей предыдущей статье «Реализация PCA в Python с помощью Scikit-Learn [/ implementation-pca-in-python-with-scikit-learn /]» мы изучили, как можно уменьшить размерность набора функций с помощью PCA. В этой статье мы изучим еще один очень важный метод уменьшения размерности: линейный дискриминантный анализ [https://en.wikipedia.org/wiki/Linear_discriminant_analysis] (или LDA). Но сначала давайте кратко обсудим, чем PCA и LDA отличаются друг от друга. PCA против LDA: в чем разница? Оба СПС

В нашей предыдущей статье « Реализация 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} .

comments powered by Disqus