降维技术是指在保留数据核心信息的同时减少特征(列)的数量。以下是降维技术的必要性:
降维技术有多种方法,如PCA、ICA、t-SNE等。将以PCA为例进行说明。
首先,需要理解数据中的“信息”。以以下虚构数据为例,包含了人们的年龄、体重和身高。
信息存在于方差中!由于所有人的“身高”都相同,即方差为0,因此它没有增加任何信息,可以在不丢失任何信息的情况下移除“身高”列。
现在知道信息是方差,让理解PCA的工作原理。在PCA中,寻找新的维度(特征),这些维度能够捕获最大的方差(即信息)。
考虑一条通过所有点的蓝点虚线。这条蓝点虚线捕获了所有信息,因此可以不丢失任何信息地用这条蓝点虚线(1维)替换“年龄”和“体重”(2维),从而实现降维(从2维到1维)。这条蓝点虚线被称为主成分。
可能会好奇如何找到这条蓝点虚线(主成分)的,这背后有很多数学原理。可以阅读相关文章来了解详细内容,但简而言之,使用特征值和特征向量来找到能够捕获最大方差的方向。
让通过一个例子来看如何使用PCA。使用了葡萄酒质量数据,它包含了12个特征,如酸度、残糖、氯化物等,以及1600个样本的葡萄酒质量。可以从这里下载Jupyter笔记本并跟随操作。
首先,加载数据。
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
df = pd.read_csv('winequality-red.csv')
df.head()
y = df.pop('quality')
加载数据后,移除了葡萄酒的“质量”,因为它是目标特征。现在将对数据进行标准化,因为如果不这样做,PCA将无法找到最优的主成分。例如,有一个以“米”为单位的特征,另一个以“公里”为单位,以“米”为单位的特征将比以“公里”为单位的特征具有更大的方差(1公里=1000米),因此PCA将更加重视方差大的特征。所以,来进行数据标准化。
from sklearn.preprocessing import StandardScaler
scalar = StandardScaler()
df_scaled = pd.DataFrame(scalar.fit_transform(df), columns=df.columns)
df_scaled
现在可以应用PCA了。
pca = PCA()
df_pca = pd.DataFrame(pca.fit_transform(df_scaled))
df_pca
应用PCA后,得到了11个主成分。有趣的是,每个主成分捕获了多少方差。
import matplotlib.pyplot as plt
pd.DataFrame(pca.explained_variance_ratio_).plot.bar()
plt.legend('')
plt.xlabel('主成分')
plt.ylabel('解释方差');
前5个主成分捕获了大约80%的方差,因此可以替换11个原始特征(酸度、残糖、氯化物等)与新的5个特征,这些新特征包含了80%的信息。因此,将11维降低到了只有5维,同时保留了大部分信息。
PCA也可用于聚类。使用了鸢尾花数据集进行此目的。以下图像将显示使用PCA、ICA和t-SNE进行聚类的结果。