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

PCA с использованием Python (scikit-learn, pandas)

Чтобы понять ценность использования PCA для визуализации данных, в первой части этого учебного поста рассматривается базовая визуализация набора данных IRIS после применения PCA. Во второй части используется PCA для ускорения алгоритма машинного обучения (логистическая регрессия) в наборе данных MNIST.

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

Мой последний учебник был посвящен Логистической регрессии с использованием Python . Одна из вещей, которую мы узнали, заключалась в том, что вы можете ускорить подгонку алгоритма машинного обучения, изменив алгоритм оптимизации. Более распространенным способом ускорения алгоритма машинного обучения является использование анализа главных компонентов (PCA). Если ваш алгоритм обучения слишком медленный из-за слишком высокого входного измерения, то использование PCA для его ускорения может быть разумным выбором. Это, вероятно, наиболее распространенное применение СПС. Еще одним распространенным применением PCA является визуализация данных.

Чтобы понять ценность использования PCA для визуализации данных, в первой части этого учебного поста рассматривается базовая визуализация набора данных IRIS после применения PCA. Во второй части используется PCA для ускорения алгоритма машинного обучения (логистическая регрессия) в наборе данных MNIST.

С этого и начнем! Если вы заблудились, я рекомендую открыть видео ниже в отдельной вкладке.

PCA с использованием видео на Python

Код, используемый в этом учебнике, доступен ниже

PCA для визуализации данных

PCA для ускорения алгоритмов машинного обучения

Начало работы (Предварительные условия)

Если у вас уже установлена anaconda, перейдите к следующему разделу. Я рекомендую установить anaconda (либо Python2, либо 3 хорошо подходит для этого урока), чтобы у вас не возникло проблем с импортом библиотек.

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

Установите Anaconda в Windows: Ссылка

Установите Anaconda на Mac: Ссылка

Установите Anaconda на Ubuntu (Linux): Ссылка

Для многих приложений машинного обучения это помогает визуализировать ваши данные. Визуализация 2-х или 3-х мерных данных не так уж сложна. Однако даже набор данных Iris, используемый в этой части учебника, является 4-мерным. Вы можете использовать PCA, чтобы уменьшить эти 4-мерные данные до 2 или 3 измерений, чтобы вы могли построить график и, надеюсь, лучше понять данные.

Загрузить набор данных Радужной Оболочки Глаза

Набор данных Iris-это один из наборов данных, которые поставляются с scikit-learn и не требуют загрузки какого-либо файла с какого-либо внешнего веб-сайта. Приведенный ниже код загрузит набор данных iris.

import pandas as pd

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

# load dataset into Pandas DataFrame
df = pd.read_csv(url, names=['sepal length','sepal width','petal length','petal width','target'])

Оригинальные панды df (особенности + цель)

Стандартизация данных

PCA зависит от масштаба, поэтому вам необходимо масштабировать функции в ваших данных перед применением PCA. Используйте StandardScaler , чтобы помочь вам стандартизировать функции наборов данных в единичном масштабе и), что является требованием для оптимальной производительности многих алгоритмов машинного обучения. Если вы хотите увидеть отрицательный эффект, который может иметь не масштабирование ваших данных, в scikit-learn есть раздел, посвященный эффектам не стандартизации ваших данных .

from sklearn.preprocessing import StandardScaler
features = ['sepal length', 'sepal width', 'petal length', 'petal width']

# Separating out the features
x = df.loc[:, features].values

# Separating out the target
y = df.loc[:,['target']].values

# Standardizing the features
x = StandardScaler().fit_transform(x)

Массив x (визуализируется фреймом данных pandas) до и после стандартизации

Проекция PCA в 2D

Исходные данные состоят из 4 столбцов (длина чашелистика, ширина чашелистика, длина лепестка и ширина лепестка). В этом разделе код проецирует исходные данные, которые являются 4-мерными, в 2 измерения. Я должен отметить, что после уменьшения размерности каждому основному компоненту обычно не присваивается определенное значение. Новые компоненты – это всего лишь два основных измерения вариации.

from sklearn.decomposition import PCA

pca = PCA(n_components=2)

principalComponents = pca.fit_transform(x)

principalDf = pd.DataFrame(data = principalComponents , columns = ['principal component 1', 'principal component 2'])

PCA и сохранение 2-х основных компонентов

finalDf = pd.concat([principalDf, df[['target']]], axis = 1)

Объединение фрейма данных вдоль. finalDf-это конечный кадр данных перед построением графика данных.

Объединение фреймов данных по столбцам для создания finalDf перед построением графиков

Визуализация 2D Проекции

В этом разделе просто строятся 2-мерные данные. Обратите внимание на график ниже, что классы кажутся хорошо отделенными друг от друга.

fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1) 
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
colors = ['r', 'g', 'b']
for target, color in zip(targets,colors):
    indicesToKeep = finalDf['target'] == target
    ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']
               , finalDf.loc[indicesToKeep, 'principal component 2']
               , c = color
               , s = 50)
ax.legend(targets)
ax.grid()

2 Компонента PCA Диаграмма

Объясненная Дисперсия

Объясненная дисперсия показывает, сколько информации (дисперсии) можно отнести к каждому из основных компонентов. Это важно, так как, хотя вы можете преобразовать 4-мерное пространство в 2-мерное пространство, при этом вы теряете часть дисперсии (информации). Используя атрибут explained_variance_ratio_ , вы можете увидеть, что первый основной компонент содержит 72,77% дисперсии, а второй основной компонент содержит 23,03% дисперсии. Вместе эти два компонента содержат 95,80% информации.

pca.explained_variance_ratio_

Одним из наиболее важных приложений PCA является ускорение алгоритмов машинного обучения. Использование набора данных IRIS здесь было бы непрактичным, так как набор данных содержит только 150 строк и только 4 столбца объектов. База данных рукописных цифр MNIST более подходит, поскольку она содержит 784 столбца функций (784 измерения), обучающий набор из 60 000 примеров и тестовый набор из 10 000 примеров.

Загрузите и загрузите данные

Вы также можете добавить параметр data_home в fetch_data , чтобы изменить место загрузки данных.

from sklearn.datasets import fetch_mldata

mnist = fetch_mldata('MNIST original')

Загруженные вами изображения содержатся в файле mnist.data и имеют форму (70000, 784), что означает, что существует 70 000 изображений с размерами 784 (784 объекта).

Метки (целые числа 0-9) содержатся в файле mnist.target . Объекты имеют размерность 784 (28 х 28 изображений), а метки-это просто числа от 0 до 9.

Разделение данных на обучающие и тестовые наборы

Как правило, разделение теста на поезд составляет 80% обучения и 20% теста. В этом случае я выбрал 6/7 данных для обучения и 1/7 данных для набора тестов.

from sklearn.model_selection import train_test_split

# test_size: what proportion of original data is used for test set
train_img, test_img, train_lbl, test_lbl = train_test_split( mnist.data, mnist.target, test_size=1/7.0, random_state=0)

Стандартизация данных

Текст в этом абзаце является почти точной копией того, что было написано ранее. PCA зависит от масштаба, поэтому вам необходимо масштабировать объекты в данных перед применением PCA. Вы можете преобразовать данные в единичный масштаб и), что является требованием для оптимальной производительности многих алгоритмов машинного обучения. StandardScaler помогает стандартизировать функции наборов данных. Обратите внимание, что вы вписываетесь в набор тренировок и трансформируетесь в набор тренировок и тестов. Если вы хотите увидеть отрицательный эффект, который может иметь не масштабирование ваших данных, в scikit-learn есть раздел, посвященный эффектам не стандартизации ваших данных .

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

# Fit on training set only.
scaler.fit(train_img)

# Apply transform to both the training set and the test set.
train_img = scaler.transform(train_img)
test_img = scaler.transform(test_img)

Импорт и применение PCA

Обратите внимание, что приведенный ниже код имеет значение .95 для параметра количество компонентов. Это означает, что scikit-learn выбирает минимальное количество основных компонентов таким образом, чтобы 95% дисперсии сохранялось.

from sklearn.decomposition import PCA

# Make an instance of the Model
pca = PCA(.95)

Установите PCA на тренировочный набор. Примечание: вы устанавливаете PCA только на тренировочный набор.

pca.fit(train_img)

Примечание: Вы можете узнать, сколько компонентов PCA выбирает после подгонки модели, используя pca.n_components_ . В этом случае 95% дисперсии составляет 154 основных компонента.

Примените сопоставление (преобразование) как к обучающему набору, так и к тестовому набору.

train_img = pca.transform(train_img)
test_img = pca.transform(test_img)

Примените логистическую регрессию к преобразованным данным

Шаг 1: Импортируйте модель, которую вы хотите использовать

В sklearn все модели машинного обучения реализованы в виде классов Python

from sklearn.linear_model import LogisticRegression

Шаг 2: Создайте экземпляр модели.

# all parameters not specified are set to their defaults
# default solver is incredibly slow which is why it was changed to 'lbfgs'
logisticRegr = LogisticRegression(solver = 'lbfgs')

Шаг 3: Обучение модели на основе данных, хранение информации, извлеченной из данных

Модель изучает взаимосвязь между цифрами и метками

logisticRegr.fit(train_img, train_lbl)

Шаг 4: Прогнозирование меток новых данных (новых изображений)

Использует информацию, полученную моделью в процессе обучения модели

Приведенный ниже код предсказывает для одного наблюдения

# Predict for One Observation (image)
logisticRegr.predict(test_img[0].reshape(1,-1))

Приведенный ниже код предсказывает сразу несколько наблюдений

# Predict for One Observation (image)
logisticRegr.predict(test_img[0:10])

Измерение производительности Модели

Хотя точность не всегда является лучшей метрикой для алгоритмов машинного обучения (точность, отзыв, оценка F1 и т. Д. Были бы лучше), Она используется здесь для простоты.

logisticRegr.score(test_img, test_lbl)

Сроки подгонки логистической регрессии после PCA

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

Время, необходимое для подгонки логистической регрессии после PCA с сохранением различных долей дисперсии

Восстановление изображения из сжатого представления

В предыдущих частях учебника было продемонстрировано использование PCA для сжатия данных с высокой размерностью в данные с более низкой размерностью. Я хотел бы вкратце упомянуть, что PCA также может вернуть сжатое представление данных (данные с более низкой размерностью) к аппроксимации исходных данных с высокой размерностью. Если вас интересует код, который создает изображение ниже, проверьте мой github .

Заключительные Мысли

Это сообщение, на котором я мог бы писать намного дольше, поскольку asPCA имеет много разных применений. Я надеюсь, что этот пост поможет вам во всем, над чем вы работаете. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы здесь или на странице видео YouTube !