[Stove AI] Машинное обучение 053-Трюк с уменьшением размерности данных-PCA и ядерный PCA

машинное обучение искусственный интеллект Python scikit-learn

[Stove AI] Машинное обучение 053-Трюк с уменьшением размерности данных-PCA и ядерный PCA

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)

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

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

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

Для теоретического вывода и более глубокой математической логики PCA, пожалуйста, обратитесь к сообщению в блогеАлгоритм PCA


1. Используйте PCA для уменьшения размерности набора данных

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

# 假如某个项目有5个特征,这五个特征分别为:
f1=np.random.normal(size=250)
f2=np.random.normal(size=250)
# 后面的三个特征是前面两个特征演变而来,即与前面两特征具有很强的相关性
f3=2*f1+3*f2
f4=4*f1-f2
f5=f3+2*f4

Много раз мы хотим посмотреть на корреляцию между векторами признаков в наборе данных следующим образом.

# 将这些特征组合成数据集
dataset_X=np.c_[f1,f2,f3,f4,f5]
# 计算各特征列之间的相关系数
df=pd.DataFrame(dataset_X,columns=['f1','f2','f3','f4','f5'])
print(df.corr())

------------------------------------- потерять-- ------------------------------

     f1        f2        f3        f4        f5

f1 1.000000 -0.002496 0.528931 0.966354 0.994370 f2 -0.002496 1.000000 0.847342 -0.259627 0.103485 f3 0.528931 0.847342 1.000000 0.292844 0.615884 f4 0.966354 -0.259627 0.292844 1.000000 0.933656 f5 0.994370 0.103485 0.615884 0.933656 1.000000

--------------------------------------------Заканчивать----- --------------------------------

Хорошо видно, что в наборе данных есть много признаков с сильной корреляцией, таких как f1-f5, f1-f4 и т. д.

Таким образом, мы можем использовать PCA для уменьшения размерности:

# 可以看出f1-f5,f1-f4,f2-f3等之间具有强相关性,故而可以用PCA降维
from sklearn import decomposition
pca=decomposition.PCA()
pca.fit(dataset_X) # 用PCA降维
# 打印降维后的新特征
variances=pca.explained_variance_
print(variances) # 可以理解成该特征的重要性,后面三个数字非常小,即特征不重要

------------------------------------- потерять-- ------------------------------

[1.15552796e+02 1.14453854e+01 3.08872295e-31 8.39043564e-32 1.18268234e-32]

--------------------------------------------Заканчивать----- --------------------------------

# 故而可以为重要性设置一个阈值,小于该阈值的认为该特征不重要,可删除
thresh=0.8
useful_features=variances>thresh
print(useful_features) # 标记为True的表示重要特征,要保留,False则删除

------------------------------------- потерять-- ------------------------------

[ True True False False False]

--------------------------------------------Заканчивать----- --------------------------------

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

useful_features_num=np.sum(useful_features) # 计算True的个数

# 进行PCA降维之后的新数据集为:
pca.n_components=useful_features_num # 即设置PCA的新特征数量为n_components
new_dataset_X=pca.fit_transform(dataset_X)
print('before PCA, dataset shape: ', dataset_X.shape)
print('after PCA, dataset shape: ', new_dataset_X.shape)

------------------------------------- потерять-- ------------------------------

before PCA, dataset shape: (250, 5) after PCA, dataset shape: (250, 2)

--------------------------------------------Заканчивать----- --------------------------------

Плюсы и минусы ПКС:

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

2. Ограничений по параметрам нет вообще, а результат обработки связан только с данными, а не с пользователем: в процессе расчета PCA нет необходимости вручную задавать параметры или вмешиваться в расчет по какой-либо эмпирической модели , а конечный результат связан только с данными. Актуален, не зависит от пользователя.

Недостатки: 1. PCA работает линейно. Если набор данных не организован линейным образом, то эффект PCA очень плохой. В это время мы можем выполнить нелинейное преобразование данных заранее в соответствии с предварительными знаниями, и преобразовать нелинейный набор данных. В пространстве убеждений этот метод анализа называется Kernel-PCA, также известный как ядро ​​PCA. Он устраняет недостаток, заключающийся в том, что PCA может обрабатывать только линейные наборы данных, и сочетает в себе некоторые ограничения априорных знаний. более популярный метод в настоящее время.

2. Распределение некоторых наборов данных не удовлетворяет распределению Гаусса. В случае негауссовского распределения основные признаки, полученные с помощью PCA, могут быть не оптимальными. При поиске основных признаков дисперсию нельзя использовать в качестве меры важности.В соответствии с распределением данных необходимо выбрать соответствующую переменную, описывающую полное распределение, и рассчитать корреляцию распределения двух характеристических данных по определенной формуле распределения вероятностей.Этот метод анализа называется независимым основным компонентная декомпозиция (ICA).

Вы можете обратиться к сообщению в блоге:Анализ главных компонентов - интерпретация ошибки методом наименьших квадратов


2. Снижение размерности наборов данных с помощью ядра PCA

Как упоминалось ранее, метод PCA хоть и хорош, но не универсален: для наборов данных, организованных нелинейным образом, метод PCA может быть менее эффективным, и для его решения необходимо использовать метод ядра PCA.

Давайте посмотрим на типичный набор данных, организованный нелинейным образом:

# 准备数据集
from sklearn.datasets import make_circles
dataset_X,dataset_y=make_circles(n_samples=500,factor=0.2,noise=0.04)

Двумерная карта распределения этого набора данных:

Итак, если мы используем обычный PCA для уменьшения размерности этого набора данных, что мы получим?

# 如果用普通的PCA来降维
from sklearn.decomposition import PCA
pca = PCA()
dataset_X_pca = pca.fit_transform(dataset_X)
print(dataset_X_pca.shape)
visual_2D_dataset(dataset_X_pca,dataset_y,'PCA transformed dataset')
# 从图中几乎看不出PCA降维前后有啥区别

Если ядро ​​PCA используется для уменьшения размерности, набор данных можно преобразовать в линейно разделимый следующим образом:

# 用核PCA方法来降维
from sklearn.decomposition import KernelPCA
kernel_pca = KernelPCA(kernel="rbf", fit_inverse_transform=True, gamma=10)
X_kernel_pca = kernel_pca.fit_transform(dataset_X)
print(X_kernel_pca.shape) # 2维特征变成了465维,降维?增维?
visual_2D_dataset(X_kernel_pca[:,:2],dataset_y,'Kernel PCA transformed dataset')

Очевидно, что полученный новый набор данных линейно разделим.

Другими словами, как исходные 2 функции увеличились до 465 после уменьшения размерности PCA ядра? Уменьшение размерности или увеличение размерности? хе-хе.

Таким образом, новый набор данных из этого PCA ядра можно вернуть в исходный набор данных?

# 如何从Kernel PCA得到的数据集反向计算出原始的数据集
dataset_X_inverse = kernel_pca.inverse_transform(X_kernel_pca)
print(dataset_X_inverse.shape)
visual_2D_dataset(dataset_X_inverse,dataset_y,'inversed dataset_X from KernelPCA')

Видно, что распределение восстановленного набора данных такое же, как и у исходного набора данных.

########################резюме########################## ######

1. Уменьшение размерности набора данных может хорошо решить проблему трудоемкого обучения и раздутой структуры модели, вызванной слишком большим количеством функций.Существует много методов уменьшения размерности, и метод уменьшения размерности PCA может решать данные линейным методом. Однако метод ядра PCA может уменьшить размерность наборов данных с нелинейной организацией.

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.