17. Алгоритм уменьшения размерности для машинного обучения 2.

Python

Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.

Важный параметр n_components

  • n_components - это размерность, которая нам нужна после уменьшения размерности, то есть количество признаков, которые должны быть сохранены после уменьшения размерности, значение k, которое должно быть подтверждено на втором этапе процесса уменьшения размерности, обычно введите целое число в диапазоне [0 , мин(X.форма)] . Когда дело доходит до K, все могут подумать, что он похож на K в KNN и случайном лесу.
  • n_estimators, это гиперпараметр, который нам нужно подтвердить вручную, и установленное нами число повлияет на производительность модели. Если осталось слишком много признаков, эффект уменьшения размерности не будет достигнут.Если осталось слишком мало признаков, новый вектор признаков может не вместить большую часть информации в исходном наборе данных.Поэтому n_components должны не быть ни слишком большим, ни слишком большим. тогда что нам делать?
  • Давайте начнем с нашей цели по уменьшению размерности: если мы хотим визуализировать набор данных для наблюдения за распределением данных, мы склонны уменьшать данные до менее чем трех измерений, часто двух измерений, то есть значение n_components равно 2.
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
iris = load_iris()
y = iris.target
X = iris.data
#作为数组,X是几维?
X.shape#(150, 4)
#作为数据表或特征矩阵,X是几维?
import pandas as pd
pd.DataFrame(X).head()

image.png

#调用PCA
pca = PCA(n_components=2)           #实例化
pca = pca.fit(X)                    #拟合模型
X_dr = pca.transform(X)             #获取新矩阵
 
X_dr
#也可以fit_transform一步到位
#X_dr = PCA(2).fit_transform(X)

#要将三种鸢尾花的数据分布显示在二维平面坐标系中,对应的两个坐标(两个特征向量)应该是三种鸢尾花降维后的x1和x2,怎样才能取出三种鸢尾花下不同的x1和x2呢?
 
X_dr[y == 0, 0] #这里是布尔索引,看出来了么?
 
#要展示三中分类的分布,需要对三种鸢尾花分别绘图
#可以写成三行代码,也可以写成for循环
"""
plt.figure()
plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0])
plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])
plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()
"""
 
colors = ['red', 'black', 'orange']
iris.target_names
 
plt.figure()
for i in [0, 1, 2]:
    plt.scatter(X_dr[y == i, 0]
                ,X_dr[y == i, 1]
                ,alpha=.7#指画出的图像的透明度
                ,c=colors[i]
                ,label=iris.target_names[i]
               )
plt.legend()#图例
plt.title('PCA of IRIS dataset')
plt.show()

image.pngРаспределение ириса показано перед нами, очевидно, что это кластерное распределение, и распределение между каждым кластером относительно очевидно, возможно, будет некоторая неправильная классификация между двумя цветами разноцветным и виргинским, но сетоза уверена, что не будет неправильно классифицирована. . Такие данные легко классифицировать.Видно, что KNN, случайный лес, нейронная сеть, наивный Байес, Adaboost эти классификаторы могут иметь точность около 95%, когда они не настроены на набор данных радужной оболочки.

Выбор лучших n_components: кумулятивная кривая вклада объясненной дисперсии

  • Если в параметре n_components не указано значение, по умолчанию возвращаются признаки min(X.shape).Вообще говоря, размер выборки будет больше, чем количество признаков, поэтому ничего не заполнять эквивалентно преобразованию нового пространства признаков. , но не уменьшая число особенностей. Как правило, этот метод ввода не используется. Но мы можем использовать этот метод ввода, чтобы нарисовать кривую вклада кумулятивной объясненной дисперсии, чтобы выбрать наилучшее целочисленное значение n_components.
  • Совокупная кривая коэффициента вклада объяснимой дисперсии представляет собой кривую с количеством признаков, оставшихся после уменьшения размерности, по оси абсцисс, и коэффициентом вклада интерпретируемой дисперсии, полученным новой матрицей признаков после уменьшения размера, Кривая может помочь нам выбрать наилучший выбор для n_components , значение.
import numpy as np
pca_line = PCA().fit(X)
# pca_line.explained_variance_ratio_#array([0.92461872, 0.05306648, 0.01710261, 0.00521218])
plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()

image.png