在数据分析和机器学习领域,特征提取是一项关键技术。它涉及到从数据集中识别和选择最重要的信息或特征,类似于提取数据的精华,简化并突出关键方面,同时过滤掉不那么重要的细节。特征提取的重要性在于它能够简化复杂信息,在计算机学习等领域帮助发现最关键的模式或细节,使计算机通过关注数据中的重要内容来更好地预测或决策。
在现实世界的机器学习问题中,常常面临基于大量因素(特征)进行最终预测的挑战。特征数量越多,可视化训练集并在此基础上工作就越困难。有时,这些特征中许多是相关联或冗余的。这时,降维算法就显得尤为重要。
降维是减少考虑的随机特征数量的过程,通过获得一组主要或重要的特征。降维可以通过两种方式实现:特征选择和特征提取。特征选择只保留原始数据集中最相关的变量,而特征提取则通过找到一组新的变量,这些新变量是输入变量的组合,基本上包含与输入变量相同的信息。
简而言之,PCA是一种从数据集中的大量变量中获取重要变量(以成分的形式)的方法。它倾向于找到数据中变化(分散)最大的方向。PCA在处理三维或更高维数据时特别有用。PCA可以用于异常检测和异常值检测,因为它们不会被PCA视为数据的一部分,而会被认为是噪声。
以下是从头开始构建PCA的步骤:标准化数据(X_std),计算协方差矩阵,计算协方差矩阵的特征向量和特征值,将所有特征值按降序排列,归一化排序后的特征值,水平堆叠归一化的特征值形成W矩阵,X_PCA=X_std.dot(W_matrix)。
从上述图表中可以推断,仅使用前6个主成分,就能捕捉到80%的数据。这显示了PCA的强大之处,即使只使用6个特征,也能捕捉到大部分数据。
主成分是数据集中原始特征的归一化线性组合。第一主成分(PC1)总是在数据变化最大的方向上,然后其他主成分紧随其后。需要注意的是,所有的主成分都将彼此垂直。这背后的主要意图是,当它们彼此垂直时,PC1中存在的信息不会出现在PC2中。
在这里,使用了葡萄酒数据集。在这部分,实现了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执行线性操作来创建新特征。当数据是非线性的,PCA无法创建超平面时,PCA就会失败。这时,核PCA就派上用场了。它类似于SVM,通过实施核技巧将非线性数据转换到更高维度,使其可分离。
PCA不能保证类别可分性,这就是为什么它应该尽可能避免作为监督算法使用,因为它会完全破坏数据。换句话说,PCA不知道正在解决的问题是回归还是分类任务。因此,在使用PCA时必须非常小心。
尽管PCA是一个非常有用的技术来提取重要特征,但应该避免用于监督算法,因为它会完全破坏数据。如果仍然希望采用特征提取技术,那么应该选择LDA。LDA和PCA之间的主要区别在于:LDA是有监督的,而PCA是无监督的;LDA描述数据中最大可分性的方向,而PCA描述数据中最大方差的方向;LDA需要类别标签信息,而PCA不需要。
首先,标准化了数据并应用了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%准确率。因此,可以看到将线性输入传递给非线性模型更有益。