介绍
(一)原理
特征提取的核心概念是将高维、复杂的原始数据转换为低维且具有代表性的特征集合。原始数据往往包含大量冗余或无关信息,直接使用这些数据进行模型训练不仅会增加计算成本,还可能导致模型性能下降。通过特征提取,我们可以去除这些冗余信息,保留最能反映数据本质特征的部分,从而提高模型的效率和准确性。
(二)方法
在方法层面,特征提取有多种技术可供选择,具体取决于数据类型和应用场景。
1.数值型数据
对于数值型数据,常用的方法包括主成分分析(PCA)。PCA基于线性代数和统计学原理,通过对数据进行正交变换,将原始数据转换为一组新的相互正交的变量,即主成分。这些主成分按照方差大小排序,方差越大表示该主成分包含的信息越多。通过选择前几个主成分,可以在保留大部分数据信息的同时降低数据维度。
另一种针对数值型数据的方法是线性判别分析(LDA)。LDA与PCA类似,但它更侧重于寻找一种投影方向,使得不同类别数据之间的距离最大化,而同一类别数据内部的距离最小化。这使得LDA在分类任务中具有良好的性能,因为它能够有效地提取出对分类有区分性的特征。
2.图像数据
对于图像数据,常用的特征提取方法有尺度不变特征变换(SIFT)。SIFT算法旨在提取图像中具有尺度不变性和旋转不变性的特征点。它首先通过高斯差分(DoG)算子在不同尺度空间上检测极值点,然后对这些极值点进行精确定位和特征描述。SIFT特征具有很强的鲁棒性,能够在图像发生尺度变化、旋转、光照变化等情况下仍保持较好的匹配性能,广泛应用于图像匹配、目标识别等领域。
3.文本数据
在文本数据处理中,词袋模型(Bag - of - Words)是一种简单而常用的特征提取方法。它将文本看作是一个无序的单词集合,忽略单词在文本中的顺序,只统计每个单词在文本中出现的频率。这种方法虽然简单,但在文本分类、情感分析等任务中取得了不错的效果。为了进一步提高性能,还可以引入TF - IDF(词频 - 逆文档频率)权重,该权重能够衡量一个单词对于一个文档集合的重要程度,从而突出那些在特定文档中频繁出现但在整个文档集合中不常见的单词,使得提取的特征更具代表性。
(三)与特征选择不同
特征选择是从原始特征集合中选择一个子集,这些特征被认为对模型性能有最大的贡献,而不改变特征的表示形式。特征提取则是通过变换生成新的特征。在实际应用中,通常会结合特征选择和特征提取来进一步优化数据表示,提高模型性能。
(四)性能评估
常用的评估指标包括信息增益、互信息等,这些指标可以衡量提取的特征与目标变量之间的相关性。一个好的特征提取方法应该能够提取出与目标变量高度相关的特征,从而为模型提供有效的信息。
二、PCA主成分分析
(一)原理
PCA 基于线性代数中的特征值和特征向量理论以及统计学中的方差概念。其核心思想是找到一组新的正交基,使得原始数据在这些新基上的投影具有最大的方差。在数学上,对于给定的一组数据矩阵X,其协方差矩阵C可以反映数据在各个维度上的方差以及维度之间的协方差。通过对协方差矩阵C进行特征值分解,得到的特征向量就是新的正交基方向,而对应的特征值则表示数据在相应特征向量方向上的方差大小。PCA 将数据投影到这些由特征向量确定的新坐标轴上,按照特征值从大到小的顺序排列,选取前K个特征向量所对应的维度作为主成分,从而实现数据的降维和特征表示。

步骤
1.数据标准化:对原始数据进行标准化处理,将每个特征的均值变为,方差变为,以消除不同特征之间量纲的影响,确保每个特征在分析中具有相同的重要性。
2.计算协方差矩阵:根据标准化后的数据,按照上述公式计算协方差矩阵。
3.特征值分解:对协方差矩阵进行特征值分解,得到特征值和特征向量。
4.选择主成分:根据特征值的大小,按照一定的标准(如累计方差贡献率)选择前个特征向量作为主成分。通常,累计方差贡献率达到或以上时,认为选取的主成分能够较好地代表原始数据的信息。
5.数据投影:将原始数据投影到选定的主成分上,得到降维后的数据表示。
三、例子
使用糖尿病数据集,结合PCA降维方法,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
# 加载糖尿病数据集
diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target
# 创建PCA对象,将数据降到二维
pca = PCA(n_components=2)
# 对数据进行PCA降维
X_pca = pca.fit_transform(X)
# 输出降维后的数据形状
print("原始数据形状:", X.shape)
print("降维后数据形状:", X_pca.shape)
# 输出每个主成分的方差贡献率
explained_variance_ratio = pca.explained_variance_ratio_
print("每个主成分的方差贡献率:", explained_variance_ratio)
print("累计方差贡献率:", np.sum(explained_variance_ratio))
# 输出主成分的方向(特征向量)
print("主成分的方向(特征向量):\n", pca.components_)
# 绘制降维后的数据散点图
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k', s=50)
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.title('Visualization of Diabetes Dataset after PCA Dimensionality Reduction')
plt.colorbar(scatter, label='Disease Progression')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
# 绘制累计方差贡献率曲线
pca_full = PCA()
pca_full.fit(X)
plt.figure(figsize=(8, 6))
plt.plot(np.cumsum(pca_full.explained_variance_ratio_), marker='o', linestyle='--')
plt.xlabel('Number of Components')
plt.ylabel('Cumulative Explained Variance')
plt.title('Cumulative Explained Variance by PCA Components')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()