Python中的尺寸减少技术

Tavish Aggarwal.

到目前为止,我们已经讨论了来自数据集的生成群集。如果您跳过了帖子,我建议您通过它:

  1. Python中的无监督学习k-means族聚类算法
  2. Python中无监督的学习分层聚类算法

为了在没有标签的数据中创建模式,我们将数据分类为群集。考虑我们拥有1000个功能的示例,我们必须将数据分成集群。

所有1000个功能的概率是什么促使数据分成群集?非常不错!

好的,很少有你不同意我的看法。让我以不同的方式提出同样的问题:如果我想知道数据中的每个功能的贡献,以创建群集?

理解后,我们可以回答这个问题 主要成分分析 也缩写为PCA。

主成分分析(PCA)

让我们向后一步,看看我们在高中学到了什么。我们只能在两个维度(X轴和Y轴)中绘制可视化,并且很少有三维(X轴,Y轴和Z轴)。它接近绘制纸张上有多个以上三维的图像。

同样,如果我们考虑具有1000个特征或尺寸的数据集,则无法在纸上可视化数据。所以我们绝对必须将数据减少到一个,两个或三个维度。

主成分分析(PCA)占用大量尺寸的数据,并将其压平到2或3尺寸空间而不会丢失信息。例如,要以更好的方式理解它,请考虑将3-D图像耗​​尽到2D图像的电影摄像头,而不会损失信息。

PCA去相关测量,然后绘制去相关的点并测量它们的Pearson相关性。要在Python中查找PCA,请参阅下面显示的代码:

from sklearn.decomposition import PCA
from scipy.stats import pearsonr
from sklearn.datasets import load_wine

data = load_wine()
X = data.data
y = data.target

# No of features in the datset
print(len(data.feature_names))

model = PCA()

pca_features = model.fit_transform(X)

# 1st Feature/Dimension
xs = pca_features[:,0]

# 2nd Feature/Dimension
ys = pca_features[:,1]

correlation, pvalue = pearsonr(xs, ys)
print(correlation, pvalue)

使用PCA我们具有生成的功能,其中包含数据集的信息。使用两个功能,我们可以描绘我们拥有所有功能的数据集的相同信息。

内在的尺寸

使用Sklearn提供的PCA功能我们已生成PCA功能。但我们也有兴趣了解每个PCA功能的方差。

这是内在尺寸进入的地方。内在维度是近似数据集所需的功能数量。内在维度是具有重要方差的PCA功能的数量。这是一个关键的一步,因为低方差功能将噪声添加到数据集。

我们可以生成一个绘图,以找出每个主成分的方差。

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine

data = load_wine()
X = data.data
y = data.target

scaler = StandardScaler()
pca = PCA()

pipeline = make_pipeline(scaler, pca)

pipeline.fit(X)

print(pca.explained_variance_ratio_)

features = range(pca.n_components_)
plt.bar(features, pca.explained_variance_)
plt.xlabel('PCA feature')
plt.ylabel('Variance')
plt.xticks(features)
plt.show()

输出:

PCA特征方差

观察结果:

  1. In the example shown above, we are using StandardScaler to scale the data.
  2. PCA provides n_components_ which is of the same length as no of features dataset has.
  3. PCA also provides explained_variance_ which depicts the variance of each feature.
  4. 我们可以看到,在第二个PCA功能后,方差开始逐渐减少。
  5. Additional PCA provides explained_variance_ratio_ using which we can observe that first three feature covers 66% of variance.

我们的最终目标是减少数据集中的功能数量。我们应该将数据集尺寸缩短到逐渐逐渐减小的数量。 

使用PCA减少尺寸

它是使用较少特征来表示相同数据的技术。在下面显示的示例中,我们正在将功能缩短为2.(指定为PCA函数的N_Components参数。)良好的选择是在此处使用内在的维度。

from sklearn.decomposition import PCA

pca = PCA(n_components=3)
pca.fit(X)
pca_features = pca.transform(X)

print(pca_features.shape)

plt.scatter(pca_features[:,0], pca_features[:,1], c=y)
plt.xlabel('First principal Component')
plt.ylabel('Second principal Component')
plt.show()

输出:

PCA尺寸减少

以上逻辑将采用具有高方差的3个功能。有了这个,我们已经成功将高维数据减少到3个维度,而不会失去许多信息。

T分布式随机邻居嵌入(T-SNE)

T-SNE也是尺寸减少技术。 T-SNE占用高维数据集(我们有很多功能)并将其减少到保留大量原始信息的2-D图。

T-SNE和PCA之间的主要区别是:

  1. PCA是线性特征提取技术,而T-SNE是适用于高尺寸数据的非线性特征提取技术。
  2. T-SNE是计算昂贵的,可以在大型数据集上占有大量时间,其中PCA将在几秒钟或分钟内完成。
  3. T-SNE是概率技术,而PCA是数学技术。

让我们来看看一个示例,展示了如何在具有巨大功能的数据集上执行T-SNE算法。

from sklearn.manifold import TSNE

tsne_features = TSNE().fit_transform(X)

plt.scatter(tsne_features[:,0], tsne_features[:,1], c=y)
plt.xlabel('First t-SNE Feature')
plt.ylabel('Second t-SNE Feature')
plt.show()

笔记: 

  1. T-SNE仅具有FIT_TRANSFORM方法。它没有单独的拟合和变换方法。
  2. 如果数据集有很多功能,它的良好做法是以使用PCA(可能为50个功能)降低噪声,然后涂抹T-SNE。 (作为T-SNE是昂贵的操作)。

CSR矩阵的尺寸减少

字频率阵列表示每个文档中的单词的频率。数组的行表示阵列的文档和列表示文档中的单词的频率。

它是使用TF-IDF测量的。单词频率阵列中的大部分频率为零。 (这是不言自明的)。

数组,其中大多数条目为零,称为a 稀疏阵列。我们可以使用CSR矩阵代表稀疏阵列而不是numpy矩阵(CSR矩阵通常在驱动器中保存空间)。

We cannot apply PCA on CSR Matrix. In such a case, we need to use TruncatedSVD function for dimension reduction.

考虑下面显示的示例:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.cluster import KMeans
from sklearn.pipeline import make_pipeline
import pandas as pd
import requests
from bs4 import BeautifulSoup

# Preparing document
html = requests.get('//en.wikipedia.org/wiki/Sundar_Pichai')
soup = BeautifulSoup(html.text, 'lxml')
document = []

text = [''.join(t.findAll(text = True)) for t in soup.findAll('h2')]

# Generating CSR Matrix
tfidf = TfidfVectorizer()
csr_mat = tfidf.fit_transform(documents)

words = tfidf.get_feature_names()
print(words)

# Performing Dimension Reduction
svd = TruncatedSVD(n_components=50)
kmeans = KMeans(n_clusters=6)
pipeline = make_pipeline(svd, kmeans)

pipeline.fit(csr_mat)
labels = pipeline.predict(csr_mat)

df = pd.DataFrame({'label': labels, 'article': text})
print(df.sort_values('label'))

在上面的例子中:

  1. 我们正在使用维基百科页面生成文档。
  2. 我们正在使用TFIDFvectorizer,该TFIDFvectorizer将文档列表转换为单词频率阵列,它将其作为CSR_MATRIX输出。
  3. Once CSR Matrix is generated we are using TruncatedSVD function for dimension reduction.

非负矩阵分解(NMF)

NMF也是尺寸减压技术。通常需要使用NMF时使用NMF。为了使用NMF,所有样本数据都应该是非负的。它也适用于numpy数组和CSR矩阵。

请参阅下面显示的示例代码以使用NMF技术:

from sklearn.decomposition import NMF
import pandas as pd
import requests
from bs4 import BeautifulSoup
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

# Preparing Document
html = requests.get('//en.wikipedia.org/wiki/Sundar_Pichai')
soup = BeautifulSoup(html.text, 'lxml')
text = [''.join(t.findAll(text = True)) for t in soup.findAll('h2')]

# Generating CSR Matrix
tfidf = TfidfVectorizer()
csr_mat = tfidf.fit_transform(text)

# Applying NMF
model = NMF(n_components=6)
model.fit(csr_mat)

nmf_features = model.transform(csr_mat)

df = pd.DataFrame(nmf_features, index=text)
print(df.head())

components_df = pd.DataFrame(model.components_, columns=words)
component = components_df.iloc[3,:]
print(component.nlargest())

与NMF不同,PCA不会学习物件的部分。它的组件与在图像培训时的内容(在文件的情况下)或部分图像。

概括

在这篇文章中,我们已经了解了维度减少技术。我们了解:

  1. 主成分分析和内在尺寸
  2. 使用PCA减少尺寸
  3. T-SNE用于减少高维数据集的尺寸 
  4. CSR矩阵上的尺寸减小。我们看到如何生成字频CSR矩阵并应用尺寸减压技术。
  5. NMF尺寸减少技术主要用于主要文本

希望你享受帖子。我知道在帖子中有很多东西可以消化。因此,我建议并排阅读和练习。快乐学习!

 

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。