您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

十二种必须掌握的降维知识(Python代码)

时间:2019-05-15 16:58:07  来源:  作者:
十二种必须掌握的降维知识(Python代码)

CDA数据分析研究院出品

介绍

你是否曾经处理过具有一千多个特征的数据集?5万多个特征呢?我曾经有过,让我告诉你这是一项非常具有挑战性的任务,特别是如果你不知道从哪里开始的时候!拥有大量的变量既是好事,也是坏事。我们有大量的数据用于分析,这很棒,但由于规模太大,它变得非常具有挑战性。

在微观层面分析每个变量是不可行的。我们可能需要几天或几个月才能进行任何有意义的分析,我们将会为我们的业务损失大量的时间和金钱!更不用说这将需要的计算能力。我们需要一种更好的方法来处理高维数据,以便我们能够快速从中提取模式和见解。那么我们如何处理这样的数据集呢?

当然是使用降维技术。你可以使用这个技术来减少数据集中的特征数量,而不必丢失太多信息并保持(或改进)模型的性能。正如你将在本文中看到的,这是处理大型数据集的一种非常强大的方法。

这是一个可以在实际场景中使用的各种降维技术的综合指南。在深入介绍我所涵盖的12种不同技术之前,我们将首先了解这个概念是什么以及为什么要使用它。并且每种技术都有自己的Python实现代码,让你更好的熟悉它。

1.什么是降维?

我们每天都在生成大量的数据。事实上,世界上90%的数据都是在过去的3到4年中产生的!这些数字真的令人难以置信。以下是收集的数据的一些例子:

  • Facebook会收集你喜欢的,分享的,发布的,访问的地点,你喜欢的餐馆等的数据。你的智能手机应用程序会收集大量有关于你的个人信息亚马逊会收集你在其网站上购买,查看,点击等内容的数据赌场会跟踪每位客户的一举一动

随着数据生成和收集量的不断增加,可视化和绘制分析变得越来越具有挑战性。进行可视化的最常见方法之一是通过图表。假设我们有2个变量,年龄Age和身高Height。我们可以使用Age和Height之间的散点图或线图,并轻松地将它们的关系可视化:

十二种必须掌握的降维知识(Python代码)

 

现在考虑我们有100个变量(p = 100)的情况。在这种情况下,我们可以有100(100-1)/ 2 = 5000个不同的图。将它们分别可视化是没有多大意义的,对吧?在我们有大量变量的情况下,最好选择这些变量的一个子集(p << 100),它获取的信息与原始变量集一样多。

让我们用一个简单的例子来理解这一点。考虑下面的图像:

十二种必须掌握的降维知识(Python代码)

 

这里我们有类似物体的重量,单位为Kg(X1)和磅(X2)。如果我们使用这两个变量,它们将传达相类似的信息。因此,仅使用一个变量是有意义的。我们可以将数据从2D(X1和X2)转换为1D(Y1),如下所示:

十二种必须掌握的降维知识(Python代码)

 

类似地,我们可以将数据的p维度减少为k维度的子集(k << n)。这称为降维。

2.为什么需要降维?

以下是将降维应用于数据集的一些好处:

  • 随着维度数量的减少,存储数据所需的空间会减少更少的维度导致更少的计算/训练时间当我们有一个大的维度时,一些算法的表现不佳。因此,需要减少这些维度才能使算法有用它通过删除冗余的特征来处理多重共线性问题。例如,你有两个变量 - “在跑步机上花费的时间”和“燃烧的卡路里”。这些变量是高度相关的,因为你在跑步机上花费的时间越多,你燃烧的卡路里就越多。因此,存储两个变量都没有意义,只有其中一个可以满足需求它有助于可视化数据。如前所述,在高维度中可视化数据是非常困难的,因此将我们的空间缩小到2D或3D可以让我们更清晰地绘制和观察数据

是时候深入了解本文的关键 - 各种降维技术!我们将使用一个实践问题:Big Mart Sales III中的数据集点击这里下载数据提取码为:fmk0 。

3.常用的降维技术

降维可以通过两种不同的方式完成:

  • 仅保留原始数据集中最相关的变量(此技术称为特征选择)通过查找较小的一组新变量,每个变量都是输入变量的组合,包含与输入变量基本相同的信息(此技术称为降维)

我们现在将介绍各种降维技术以及如何在Python中实现它们。

3.1缺失值比率

假设你有一个数据集。你的第一步是什么?在构建模型之前,你应该会希望先探索数据。在研究数据时,你会发现数据集中存在一些缺失值。怎么办?你将尝试找出这些缺失值的原因,然后将输入它们或完全删除具有缺失值的变量(使用适当的方法)。

如果我们有太多的缺失值(比如说超过50%)怎么办?我们应该输入这些缺失值还是直接删除变量?我宁愿放弃变量,因为它没有太多的信息。然而,这不是一成不变的。我们可以设置一个阈值,如果任何变量中缺失值的百分比大于该阈值,我们将删除该变量。

让我们在Python中实现这种方法。

#导入所需要的库

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

首先,让我们加载数据:

#读取数据

train=pd.read_csv("Train_UWu5bXk.csv")

注意:应在读取数据时添加文件的路径。

现在,我们将检查每个变量中缺失值的百分比。我们可以使用.isnull().sum()来计算它。

#检查每个变量中缺失值的百分比

train.isnull().sum()/len(train)*100

十二种必须掌握的降维知识(Python代码)

 

正如你在上表中所看到的,并没有太多的缺失值(实际上只有2个变量具有缺失值)。我们可以使用适当的方法来输入变量,或者我们可以设置阈值,比如20%,并删除具有超过20%缺失值的变量。让我们看看如何在Python中完成此操作:

#保存变量中缺失的值

a = train.isnull().sum()/len(train)*100

#将列名保存在变量中

variables = train.columns

variable = [ ]

for i in range(0,12):

if a[i]<=20: #将阈值设置为20%

variable.Append(variables[i])

因此,要使用的变量存储在“variables”中,它只包含哪些缺失值小于20%的特征

3.2低方差过滤器

假设我们的数据集中的一个变量,其中所有观察值都是相同的,例如1。如果我们要使用此变量,你认为它可以改进我们将要建立的模型么?答案当然是否定的,因为这个变量的方差为零。

因此,我们需要计算给出的每个变量的方差。然后删除与我们的数据集中其他变量相比方差比较小的变量。如上所述,这样做的原因是方差较小的变量不会影响目标变量。

让我们首先使用已知ItemWeight观察值的中值来填充temWeight列中的缺失值。对于OutletSize列,我们将使用已知*OutletSize*值的模式来填充缺失值:

train['Item_Weight'].fillna(train['Item_Weight'].median(), inplace=True)

train['Outlet_Size'].fillna(train['Outlet_Size'].mode()[0], inplace=True)

让我们检查一下是否所有的缺失值都已经被填满了:

train.isnull().sum()/len(train)*100

十二种必须掌握的降维知识(Python代码)

 

嘿瞧!我们都已经准备好了。现在让我们计算所有数值变量的方差。

train.var()

十二种必须掌握的降维知识(Python代码)

 

如上面的输出所示,与其他变量相比,Item_Visibility的方差非常小。我们可以安全地删除此列。这就是我们应用低方差过滤器的方法。让我们在Python中实现这个:

numeric = train[['Item_Weight', 'Item_Visibility', 'Item_MRP', 'Outlet_Establishment_Year']]

var = numeric.var()

numeric = numeric.columns

variable = [ ]

for i in range(0,len(var)):

if var[i]>=10: #将阈值设置为10%

variable.append(numeric[i+1])

上面的代码为我们提供了方差大于10的变量列表。

3.3高度相关过滤器

两个变量之间的高度相关意味着它们具有相似的趋势,并且可能携带类似的信息。这可以大大降低某些模型的性能(例如线性回归和逻辑回归模型)。我们可以计算出本质上是数值的独立数值变量之间的相关性。如果相关系数超过某个阈值,我们可以删除其中一个变量(丢弃一个变量是非常主观的,并且应该始终记住该变量)。

作为一般准则,我们应该保留那些与目标变量显示出良好或高相关性的变量。

让我们在Python中执行相关计算。我们将首先删除因变量(ItemOutletSales)并将剩余的变量保存在新的DataFrame(df)中。

df=train.drop('Item_Outlet_Sales', 1)

df.corr()

十二种必须掌握的降维知识(Python代码)

 

太棒了,我们的数据集中没有任何具有高相关性的变量。通常,如果一对变量之间的相关性大于0.5-0.6,我们真的应该认真的考虑丢弃其中的一个变量。

3.4 随机森林

随机森林是最广泛使用的特征选择算法之一。它附带内置的重要功能,因此你无需单独编程。这有助于我们选择较小的特征子集。

我们需要通过应用一个热编码将数据转换为数字形式,因为随机森林(Scikit-Learn实现)仅采用数字输入。让我们也删除ID变量(Item_IdentifierOutlet_Identifier),因为这些只是唯一的数字,目前对我们来说并不重要。

from sklearn.ensemble import RandomForestRegressor

df=df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1)

model = RandomForestRegressor(random_state=1, max_depth=10)

df=pd.get_dummies(df)

model.fit(df,train.Item_Outlet_Sales)

拟合模型后,绘制特征重要性图:

features = df.columns

importances = model.feature_importances_

indices = np.argsort(importances)[-9:] # top 10 features

plt.title('Feature Importances')

plt.barh(range(len(indices)), importances[indices], color='b', align='center')

plt.yticks(range(len(indices)), [features[i] for i in indices])

plt.xlabel('Relative Importance')

plt.show()

十二种必须掌握的降维知识(Python代码)

 

基于上图,我们可以手动选择最顶层的特征来减少数据集中的维度。值得注意的是,我们可以使用sklearn的SelectFromModel来实现这一点。它根据权重的重要性来选择特征。

from sklearn.feature_selection import SelectFromModel

feature = SelectFromModel(model)

Fit = feature.fit_transform(df, train.Item_Outlet_Sales)

3.5 反向特征消除

按照以下步骤来理解和使用“反向特征消除”技术:

  • 我们首先获取数据集中存在的所有的n个变量,然后使用它们训练模型然后我们计算模型的性能现在,我们在消除每个变量(n次)后计算模型的性能,即我们每次都丢弃一个变量并在剩余的n-1个变量上训练模型我们确定移除变量后对模型性能影响最小(或没有)变化的变量,然后删除该变量重复此过程,直到不能删除任何变量

在构建线性回归或逻辑回归模型时,可以使用此方法。我们来看看它的Python实现:

from sklearn.linear_model import LinearRegression

from sklearn.feature_selection import RFE

from sklearn import datasets

lreg = LinearRegression()

rfe = RFE(lreg, 10)

rfe = rfe.fit_transform(df, train.Item_Outlet_Sales)

我们需要指定算法和要选择的特征数量,并返回从反向特征消除中获得的变量列表。我们还可以使用“ rfe.ranking”命令检查变量的排名。

3.6 正向特征选择

这与我们在上面看到的反向特征消除的过程相反。我们是尝试找到改善模型性能的最佳特征,而不是消除特征。该技术的工作原理如下:

  • 我们从一个特征开始。本质上,我们分别使用每个特征训练模型n次选择性能最佳的变量作为起始变量然后我们重复这个过程并每次只添加一个变量。保留产生最高性能增长的变量我们重复这个过程,直到模型的性能没有显著的改进

让我们用Python实现它:

from sklearn.feature_selection import f_regression

ffs = f_regression(df,train.Item_Outlet_Sales )

这将返回一个数组,其中包含变量的F值和与每个F值对应的p值。为了我们的目的,我们将选择F值大于10的变量:

variable = [ ]

for i in range(0,len(df.columns)-1):

if ffs[0][i] >=10:

variable.append(df.columns[i])

这为我们提供了基于正向特征选择算法的最多变量。

注意:反向特征消除和正向特征选择都是非常耗时且计算成本高的。它们实际上仅用于具有少量输入变量的数据集。

到目前为止我们看到的技术通常在我们的数据集中没有太多变量时使用。这些或多或少的特征选择技术,在接下来的部分中,我们将使用Fashion MNIST数据集,该数据集包含属于不同类型服装的图像,例如T恤,裤子,包等。数据集可点击此处下载,提取码为:a708。

该数据集共有70,000张图像,其中60,000张在训练集中,其余10,000张是测试图像。在本文的范围中,我们将仅处理训练图像。训练集文件采用zip格式。解压缩zip文件后,你将获得一个.csv文件和一个包含这60,000张图像的训练集文件夹。每个图像的相应标签可以在'train.csv'文件中找到。

3.7 因子分析

假设我们有两个变量:收入和教育。这些变量可能具有高度相关性,因为具有较高教育水平的人往往具有显着较高的收入,反之亦然。

在因子分析技术中,变量按其相关性进行分组,即特定组内的所有变量之间具有高度相关性,但往往与其他组的变量之间相关性较低。在这里,每个组都被称为一个因子。与原始数据维度相比,这些因子的数量很少。但是,这些因子往往很难观察到。

让我们先读入训练集文件夹中包含的所有图像:

import pandas as pd

import numpy as np

from glob import glob

import cv2

images = [cv2.imread(file) for file in glob('train/*.png')]

注意:你必须使用train文件夹的路径替换glob函数内的路径。

现在我们将这些图像转换为 numpy数组格式,以便我们可以执行数学运算并绘制图像。

images = np.array(images)

images.shape

(60000,28,28,3)

如上所示,它是一个三维数组。我们必须将它转换为一维的,因为所有即将出现的技术只需要一维输入。为此,我们需要展平图像:

image = []

for i in range(0,60000):

img = images[i].flatten()

image.append(img)

image = np.array(image)

现在让我们创建一个DataFrame,其中包含每个图像中每个像素的像素值,以及它们对应的标签(对于标签,我们将使用train.csv文件)。

train = pd.read_csv("train.csv") # 给出你的train.csv文件的完整路径

feat_cols = [ 'pixel'+str(i) for i in range(image.shape[1]) ]

df = pd.DataFrame(image,columns=feat_cols)

df['label'] = train['label']

现在我们将使用因子分析来分解数据集:

from sklearn.decomposition import FactorAnalysis

FA = FactorAnalysis(n_components = 3).fit_transform(df[feat_cols].values)

这里,n_components将决定转换数据中的因子数量。转换数据后,是时候可视化结果了:

%matplotlib inline

import matplotlib.pyplot as plt

plt.figure(figsize=(12,8))

plt.title('Factor Analysis Components')

plt.scatter(FA[:,0], FA[:,1])

plt.scatter(FA[:,1], FA[:,2])

plt.scatter(FA[:,2],FA[:,0])

十二种必须掌握的降维知识(Python代码)

 

看起来很棒,不是吗?我们可以在上图中看到所有不同的因素。这里,x轴和y轴表示分解因子的值。正如我前面提到的,很难单独观察这些因素,但我们已经能够成功地减少数据的维度。

3.8主成分分析(PCA)

PCA是一种技术,可以帮助我们从现有的大量变量中提取一组新的变量。这些新提取的变量称为主成分。为了便于你快速学习PCA降维,以下是你在进一步处理之前应该了解的关于PCA的一些要点:

  • 主成分是原始变量的线性组合提取主成分的方法是,第一主成分解释数据集中的最大方差第二主成分试图解释数据集中的剩余方差,并与第一主成分不相关第三主成分试图解释前两个主成分无法解释的方差等,以此类推

在继续之前,我们将从我们的数据集中随机绘制一些图像:

rndperm = np.random.permutation(df.shape[0])

plt.gray()

fig = plt.figure(figsize=(20,10))

for i in range(0,15):

ax = fig.add_subplot(3,5,i+1)

ax.matshow(df.loc[rndperm[i],feat_cols].values.reshape((28,28*3)).astype(float))

十二种必须掌握的降维知识(Python代码)

 

让我们使用Python实现PCA降维并转换数据集:

from sklearn.decomposition import PCA

pca = PCA(n_components=4)

pca_result = pca.fit_transform(df[feat_cols].values)

在这种情况下,n_components将决定转换数据中的主要成分的数量。让我们看一下使用这4个成分解释了多少差异。我们将使用explainvarianceratio_来计算相同的内容。

plt.plot(range(4), pca.explained_variance_ratio_)

plt.plot(range(4), np.cumsum(pca.explained_variance_ratio_))

plt.title("Component-wise and Cumulative Explained Variance")

十二种必须掌握的降维知识(Python代码)

 

在上图中,蓝线表示按成分解释的方差,而橙线表示累积解释的方差。我们只用四个组件就可以解释数据集中大约60%的方差变化。现在让我们尝试可视化每个分解的成分:

import seaborn as sns

plt.style.use('fivethirtyeight')

fig, axarr = plt.subplots(2, 2, figsize=(12, 8))

sns.heatmap(pca.components_[0, :].reshape(28, 84), ax=axarr[0][0], cmap='gray_r')

sns.heatmap(pca.components_[1, :].reshape(28, 84), ax=axarr[0][1], cmap='gray_r')

sns.heatmap(pca.components_[2, :].reshape(28, 84), ax=axarr[1][0], cmap='gray_r')

sns.heatmap(pca.components_[3, :].reshape(28, 84), ax=axarr[1][1], cmap='gray_r')

axarr[0][0].set_title(

"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[0]*100),

fontsize=12

)

axarr[0][1].set_title(

"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[1]*100),

fontsize=12

)

axarr[1][0].set_title(

"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[2]*100),

fontsize=12

)

axarr[1][1].set_title(

"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[3]*100),

fontsize=12

)

axarr[0][0].set_aspect('equal')

axarr[0][1].set_aspect('equal')

axarr[1][0].set_aspect('equal')

axarr[1][1].set_aspect('equal')

plt.suptitle('4-Component PCA')

十二种必须掌握的降维知识(Python代码)

 

我们添加到PCA技术中的每个额外维度获取模型中的方差越来越少。第一个部分是最重要的成分,其次是第二个成分,然后是第三个成分,依此类推。

我们还可以使用奇异值分解 (SVD)将我们的原始数据集分解为其成分,从而减少维数。

SVD将原始变量分解为三个组成矩阵。它主要用于从数据集中删除冗余的特征。它使用特征值和特征向量的概念来确定这三个矩阵。由于本文的范围,我们不会深入研究它的理论,但让我们坚持我们的计划,即减少数据集中的维度。

让我们实现SVD并分解我们的原始变量:

from sklearn.decomposition import TruncatedSVD

svd = TruncatedSVD(n_components=3, random_state=42).fit_transform(df[feat_cols].values)

让我们通过绘制前两个主成分来可视化变换后的变量:

plt.figure(figsize=(12,8))

plt.title('SVD Components')

plt.scatter(svd[:,0], svd[:,1])

plt.scatter(svd[:,1], svd[:,2])

plt.scatter(svd[:,2],svd[:,0])

十二种必须掌握的降维知识(Python代码)

 

上面的散点图非常清晰地向我们展示了分解的成分。如前所述,这些组件之间没有太多相关性。

3.9独立成分分析

独立成分分析(ICA)是基于信息理论的,也是最广泛使用的降维技术之一。PCA和ICA之间的主要区别在于PCA寻找不相关的因素,而ICA寻找独立因素。

如果两个变量不相关,则意味着它们之间没有线性关系。如果它们是独立的,则意味着它们不依赖于任何其他变量。例如,一个人的年龄与该人吃什么或他/她看多少电视无关。

该算法假设给定变量是一些未知潜在变量的线性混合。它还假设这些潜在变量是相互独立的,即它们不依赖于其他变量,因此它们被称为观察数据的独立成分。

让我们直观地比较一下PCA和ICA,以便更好地了解它们的不同之处:

十二种必须掌握的降维知识(Python代码)

 

这里,图像(a)表示PCA结果,而图像(b)表示相同数据集上的ICA结果。

PCA的方程是x = W x。

  • x是观察结果W是混合矩阵χ是来源或独立成分

现在我们必须找到一个非混合矩阵,使成分尽可能的独立。测量成分独立性的最常用方法是非高斯性:

  • 根据中心极限定理,独立成分之和的分布倾向于正态分布(高斯分布)。
十二种必须掌握的降维知识(Python代码)

 

  • 因此,我们可以寻找最大化独立成分的每个分量的峰度的变换。峰度是分布的第三阶段。最大化峰度将使分布非高斯分布,因此获得独立成分。
十二种必须掌握的降维知识(Python代码)

 

上述分布是非高斯分布,这又使得各成分互相独立。让我们尝试在Python中实现ICA:

from sklearn.decomposition import FastICA

ICA = FastICA(n_components=3, random_state=12)

X=ICA.fit_transform(df[feat_cols].values)

这里,n_components将决定转换数据中的成分数量。我们使用ICA将数据转换为3个成分。让我们看看它是如何改变数据的:

plt.figure(figsize=(12,8))

plt.title('ICA Components')

plt.scatter(X[:,0], X[:,1])

plt.scatter(X[:,1], X[:,2])

plt.scatter(X[:,2], X[:,0])

十二种必须掌握的降维知识(Python代码)

 

数据已经被分成不同的独立成分,在上图中可以非常清楚地看到。X轴和Y轴表示分解的独立成分的值。

现在我们将看到一些使用投影技术来减少数据维度的方法。

3.10基于投影的方法

首先,我们需要了解投影是什么。假设我们有两个向量,矢量a和矢量b,如下所示:

十二种必须掌握的降维知识(Python代码)

 

我们想求a在b上的投影。那么设a和b之间的角度为∅。投影(a1)看起来像:

十二种必须掌握的降维知识(Python代码)

 

a1是与b平行的向量。因此,我们可以使用以下等式得到向量a在向量b上的投影:

十二种必须掌握的降维知识(Python代码)

 

  • a1 = a到b的投影b = b单位矢量的方向

通过将一个矢量投影到另一个矢量上,可以降低维度。

在投影技术中,可以通过将其点投影到较低维空间来表示多维数据。现在我们将讨论不同的预测方法:

  • 投射到有趣的方向:有趣的方向取决于特定的问题,但一般来说,投影值是非高斯的方向被认为是有趣的与ICA(独立成分分析)类似,投影寻找最大化投影值的峰度的方向,作为非高斯性的度量。
  • 投影集合管:

曾几何时,人们认为地球是平的。无论你去哪里,它都会保持平坦(让我们暂时忽视山脉)。但是,如果你继续向一个方向走,那么你最终会走向何方。如果地球是平坦的,那这就不会发生。地球只是看起来比较平坦,那是因为我们看到的与地球相比是微不足道的。

地球看起来平坦的这些小部分是多方面的,如果我们将所有这些方面组合在一起,我们就可以获得地球的大尺度视图,也就是原始数据。类似地,对于n维曲线,小的平面快是流形,并且这些流形的组合将给出我们原始的n维曲线。让我们看看投影到流形上的步骤:

  • 我们首先寻找一个接近数据的流形然后将数据投影到那个流形上最后为了表示,我们展开了流形有各种技术可以获得流形,所有这些技术都包含三个步骤:从每个数据点收集信息以构建具有一个以数据点作为顶点的图将上面生成的图转换为适合嵌入步骤的输入计算(nXn)本征方程

让我们通过一个例子来理解流形投影技术。

如果一个流形连续可微缩到任意阶,则称为平滑流形或可微分流形。ISOMAP是一种旨在恢复非线性流形的完整低维表示的算法。它假设流形是平滑的。

它还假设对于流形上的任何一对点,两点之间的测地距离(曲面上两点之间的最短距离)等于欧几里德距离(直线上两点之间的最短距离)。让我们首先形象化一对点之间的测地线和欧几里德距离:

十二种必须掌握的降维知识(Python代码)

 

  • Dn1n2 = X1和X2之间的测地距离dn1n2 = X1和X2之间的欧几里德距离

ISOMAP假设这两个距离相等。现在让我们看一下这种技术更详细的解释。如前所述,所有这些技术都采用三步法。我们将详细介绍这些步骤:

  • 邻近图:第一步是计算所有数据点对点之间的距离: dij =dχ(xi,xj)= || xi-xj || χ dχ(xi, xj) = xi和xj测地线距离 || xi-xj || = xi到xj的欧氏距离在计算距离之后,我们确定流形的相邻数据点最后生成邻域图:G = G(V,ℰ),其中顶点集合V = {x1,x2,...,xn}是输入数据点和边缘集合ℰ= {eij}表示附近的点之间的距离
  • 计算图形距离:现在我们通过图形距离计算流形中各点之间的测地距离图形距离是图G中所有点对点之间的最短路径距离
  • 嵌入:一旦我们得到距离,我们就形成了一个方形图距离的对称(nXn)矩阵现在我们选择嵌入向量来最小化测地距离和图形距离之间的差距最后,图形G通过(t Xn)矩阵嵌入Y中

让我们用Python实现它,这样就更清楚的理解我在说什么了。我们将通过等距映射进行非线性降维。对于可视化,我们将只采用数据集的一个子集,因为在整个数据集上运行它将需要花费大量时间。

from sklearn import manifold

trans_data = manifold.Isomap(n_neighbors=5, n_components=3, n_jobs=-1).fit_transform(df[feat_cols][:6000].values)

使用的参数:

  • n_neighbors决定每个点的邻居数量n_components决定流形的坐标数n_jobs = -1将使用所有可用的CPU核心

可视化转换后的数据:

plt.figure(figsize=(12,8))

plt.title('Decomposition using ISOMAP')

plt.scatter(trans_data[:,0], trans_data[:,1])

plt.scatter(trans_data[:,1], trans_data[:,2])

plt.scatter(trans_data[:,2], trans_data[:,0])

十二种必须掌握的降维知识(Python代码)

 

你可以在上面看到这些成分之间的相关性非常低。实际上,与我们之前使用SVD获得的成分相比,它们的相关性更小!

3.11 t-分布式随机邻域嵌入(t-SNE)

到目前为止,我们已经了解到PCA对于具有大量变量的数据集的降维和可视化是一个很好的选择。但是,如果我们可以使用更高级的东西呢?如果我们可以轻松地以非线性方式搜索呢?t-SNE就是这样一种技术。我们可以使用两种方法来映射数据点:

  • 局部方法:它们将流形上的附近点映射到低维表示中的附近点。全局方法:他们试图在所有尺度上保持几何,即将流形上的附近点映射到低维表示中的附近点以及将远处的点映射到远点上。
  • t-SNE是能够同时保留数据的本地和全局结构的少数算法之一计算了高维空间和低维空间中点的概率相似度将数据点之间的高维欧氏距离被转换为表示相似性的条件概率:
十二种必须掌握的降维知识(Python代码)

 

xi和xj是数据点,|| xi-xj || 表示这些数据点之间的欧几里德距离,σi是高维空间中数据点的方差

  • 对于对应于高维数据点xi和xj的低维数据点yi和yj,可以使用以下公式计算相似的条件概率:
十二种必须掌握的降维知识(Python代码)

 

其中:|| yi-yj || 表示yi和yj之间的欧几里德距离

  • 在计算两个概率之后,它最小化了两个概率之间的差异

现在我们将用Python实现它,并将结果可视化:

from sklearn.manifold import TSNE

tsne = TSNE(n_components=3, n_iter=300).fit_transform(df[feat_cols][:6000].values)

n_components将决定转换数据中的成分数量。是时候查看可视化转换后的数据:

plt.figure(figsize=(12,8))

plt.title('t-SNE components')

plt.scatter(tsne[:,0], tsne[:,1])

plt.scatter(tsne[:,1], tsne[:,2])

plt.scatter(tsne[:,2], tsne[:,0])

十二种必须掌握的降维知识(Python代码)

 

在这里,你可以清楚地看到使用强大的t-SNE技术转换的不同成分。

3.12 UMAP

t-SNE在大型数据集上工作表现很好,但它也有它的局限性,例如丢失大型的信息,计算时间慢,无法有意义地表示非常大的数据集。统一流形近似和投影(UMAP)是一种降维技术,与t-SNE相比,可以保留尽可能多的本地数据结构和全局数据结构,并且运行时间更短。听起来很有趣,对吧。

UMAP的一些主要优势是:

  • 它可以毫不费力地处理大型数据集和高维数据它结合了可视化的强大功能和减少数据维度的能力除了保留本地结构外,它还保留了数据的全局结构。UMAP将流形上的附近点映射到低维表示中的附近点,并对远点进行相同的映射

该方法使用k-近邻的概念,并使用随机梯度下降来优化结果。它首先计算高维空间中的点之间的距离,将它们投影到低维空间,并计算该低维空间中的点之间的距离。然后,它使用随机梯度下降来最小化这些距离之间的差异。

我们现在将在Python中实现它:

import umap

umap_data = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(df[feat_cols][:6000].values)

  • n_neighbors确定使用的相邻点的数量min_dist控制允许嵌入的紧密程度。值越大,嵌入点的分布越均匀

让我们可视化一下这个变换:

plt.figure(figsize=(12,8))

plt.title('Decomposition using UMAP')

plt.scatter(umap_data[:,0], umap_data[:,1])

plt.scatter(umap_data[:,1], umap_data[:,2])

plt.scatter(umap_data[:,2], umap_data[:,0])

十二种必须掌握的降维知识(Python代码)

 

维度已经减少了,我们可以想象不同的变换成分。变换后的变量之间的相关性非常小。让我们比较UMAP和t-SNE的结果:

十二种必须掌握的降维知识(Python代码)

 

我们可以看到,与从t-SNE获得的成分之间的相关性相比,从UMAP获得的成分之间的相关性非常小。因此,UMAP倾向于提供更好的结果。

正如UMAP的GitHub代码库中所提到的,与t-SNE相比,它在保留数据全局结构方面的表现更好。这意味着它通常可以提供更好的“全局”数据视图以及保留本地邻居关系。

深呼吸。我们已经学习了相当多的降维技术。让我们简要总结一下在那里可以使用它们。

4. 简要总结什么时候使用什么技术

在本节中,我们将简要总结我们所涵盖的每种降维技术的使用案例。了解在什么地方可以使用什么样的技术,因为它有助于节省时间,精力和计算能力。

十二种必须掌握的降维知识(Python代码)

 

  • 缺失值比率:如果数据集的缺失值太多,我们使用此方法来减少变量的数量。我们可以删除其中包含大量缺失值的变量低方差过滤器:我们使用此方法来识别和删除数据集中的常量变量。目标变量不会受到方差较小的变量的过度影响,因此可以安全地删除这些变量高相关过滤器:具有高相关性的一对变量增加了数据集中的多重共线性。因此,我们可以使用此技术来查找高度相关的功能并相应地删除它们随机森林:这是最常用的技术之一,它告诉我们数据集中存在的每个特征的重要性。我们可以找到每个特征的重要性并保留最顶层的特征,从而减少维度这两个反向特征消除和正向特征选择技术需要大量的计算时间,因此一般在较小的数据集使用因子分析:该技术最适合我们具有高度相关的变量集的情况。它将变量基于它们的相关性划分为不同的组,并用因子表示每个组主成分分析:这是处理线性数据最广泛使用的技术之一。它将数据划分为一组成分,试图解释尽可能多的方差独立成分分析:我们可以使用ICA将数据转换为独立的成分,这些成分使用更少的成分来描述数据ISOMAP:当数据强非线性时,我们使用这种技术t-SNE:当数据强非线性时,这种技术也能很好地工作。它对于可视化也非常有效UMAP:这种技术适用于高维数据。与t-SNE相比,它运行的时间更短

结束语

这是一篇关于降维的全面文章,你可以在任何地方用到它!在编写过程中我获得了很多的乐趣,并找到了一些我之前从来没用使用过的新方法(比如UMAP)。

处理成千上万的特征是任何数据科学家必备的技能。我们每天生成的数据量是前所未有的,我们需要找到不同的方法来确定如何使用它。降维是一种非常有用的方法,对我来说,无论是在专业的应用中,还是在机器学习的比赛中,它都产生了奇妙的效果。

The Ultimate Guide to 12 Dimensionality Reduction Techniques (with Python codes)
 



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  Tags: Python  点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  Tags: Python  点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  Tags: Python  点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  Tags: Python  点击:(4)  评论:(0)  加入收藏
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Tags: Python  点击:(6)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  Tags: Python  点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  Tags: Python  点击:(9)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  Tags: Python  点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  Tags: Python  点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  Tags: Python  点击:(5)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条