特征提取与降维技术

数据分析机器学习领域,特征提取是一项关键技术。它涉及到从数据集中识别和选择最重要的信息或特征,类似于提取数据的精华,简化并突出关键方面,同时过滤掉不那么重要的细节。特征提取的重要性在于它能够简化复杂信息,在计算机学习等领域帮助发现最关键的模式或细节,使计算机通过关注数据中的重要内容来更好地预测或决策。

降维的必要性

在现实世界的机器学习问题中,常常面临基于大量因素(特征)进行最终预测的挑战。特征数量越多,可视化训练集并在此基础上工作就越困难。有时,这些特征中许多是相关联或冗余的。这时,降维算法就显得尤为重要。

什么是降维

降维是减少考虑的随机特征数量的过程,通过获得一组主要或重要的特征。降维可以通过两种方式实现:特征选择和特征提取。特征选择只保留原始数据集中最相关的变量,而特征提取则通过找到一组新的变量,这些新变量是输入变量的组合,基本上包含与输入变量相同的信息。

主成分分析(PCA)

简而言之,PCA是一种从数据集中的大量变量中获取重要变量(以成分的形式)的方法。它倾向于找到数据中变化(分散)最大的方向。PCA在处理三维或更高维数据时特别有用。PCA可以用于异常检测和异常值检测,因为它们不会被PCA视为数据的一部分,而会被认为是噪声。

以下是从头开始构建PCA的步骤:标准化数据(X_std),计算协方差矩阵,计算协方差矩阵的特征向量和特征值,将所有特征值按降序排列,归一化排序后的特征值,水平堆叠归一化的特征值形成W矩阵,X_PCA=X_std.dot(W_matrix)。

从上述图表中可以推断,仅使用前6个主成分,就能捕捉到80%的数据。这显示了PCA的强大之处,即使只使用6个特征,也能捕捉到大部分数据。

主成分是数据集中原始特征的归一化线性组合。第一主成分(PC1)总是在数据变化最大的方向上,然后其他主成分紧随其后。需要注意的是,所有的主成分都将彼此垂直。这背后的主要意图是,当它们彼此垂直时,PC1中存在的信息不会出现在PC2中。

PCA的Python实现

在这里,使用了葡萄酒数据集。在这部分,实现了PCA以及逻辑回归,并进行了超参数调优。首先,标准化数据并应用PCA。然后,绘制了结果图以检查可分性。接着,应用了逻辑回归,并借助决策边界为训练和测试数据绘制了图表。最后,应用了带有Pipeline的超参数调优,以找到具有最佳测试分数的主成分。

# 假设X为特征数据,y为标签 from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import GridSearchCV # 标准化数据 scaler = StandardScaler() X_std = scaler.fit_transform(X) # 应用PCA pca = PCA(n_components=0.95) # 保留95%的方差 X_pca = pca.fit_transform(X_std) # 逻辑回归 logreg = LogisticRegression() logreg.fit(X_pca, y) # 超参数调优 param_grid = {'C': [0.1, 1, 10]} clf = GridSearchCV(logreg, param_grid, cv=5) clf.fit(X_pca, y)

核PCA(Kernel PCA)

知道PCA执行线性操作来创建新特征。当数据是非线性的,PCA无法创建超平面时,PCA就会失败。这时,核PCA就派上用场了。它类似于SVM,通过实施核技巧将非线性数据转换到更高维度,使其可分离。

PCA的缺点

PCA不能保证类别可分性,这就是为什么它应该尽可能避免作为监督算法使用,因为它会完全破坏数据。换句话说,PCA不知道正在解决的问题是回归还是分类任务。因此,在使用PCA时必须非常小心。

LDA与PCA的区别

尽管PCA是一个非常有用的技术来提取重要特征,但应该避免用于监督算法,因为它会完全破坏数据。如果仍然希望采用特征提取技术,那么应该选择LDA。LDA和PCA之间的主要区别在于:LDA是有监督的,而PCA是无监督的;LDA描述数据中最大可分性的方向,而PCA描述数据中最大方差的方向;LDA需要类别标签信息,而PCA不需要。

LDA的Python实现

首先,标准化了数据并应用了LDA。然后,使用了一个线性模型,如逻辑回归,来拟合数据。然后,绘制了决策边界,以便更好地理解类别可分性。

# 假设X为特征数据,y为标签 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA from sklearn.linear_model import LogisticRegression # 标准化数据 scaler = StandardScaler() X_std = scaler.fit_transform(X) # 应用LDA lda = LDA() X_lda = lda.fit_transform(X_std, y) # 逻辑回归 logreg = LogisticRegression() logreg.fit(X_lda, y)

可以看到,LDA是一个线性模型,将一个线性模型的输出传递给另一个线性模型并没有好处。最好将线性模型的输出传递给非线性模型。从上面的图表中,能够实现训练数据的100%准确率和测试数据的98%准确率。

因此,这次使用了一个非线性模型(SVM)来证明上述观点。从上面的图表中,能够实现测试和训练数据的100%准确率。因此,可以看到将线性输入传递给非线性模型更有益。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485