当前位置: 首页 > article >正文

机器学习西瓜书笔记(十一) 第十一章特征选择与稀疏学习+代码

第十一章

  • 特征选择与稀疏学习
    • 11.1 子集搜索与评价
      • 小结
    • 11.2 过滤式选择
      • 小结
    • 11.3 包裹式选择
      • 小结
    • 11.4 嵌入式选择与L1正则化
      • 小结
    • 11.5 稀疏表示与字典学习
      • 小结
    • 11.6 压缩感知
      • 小结
    • 11.7 代码
      • 单变量特征选择
    • 11.8 章末小结

特征选择与稀疏学习

11.1 子集搜索与评价

在这里插入图片描述

小结

子集搜索与评价是一种特征选择技术,它系统地搜索所有可能的特征子集,以找到对模型性能最有益的特征组合。这个过程涉及到评估每个子集对模型预测能力的影响,通常通过交叉验证或留一验证等方法来完成。子集搜索的目标是识别出一组特征,这组特征在减少数据复杂性的同时,能够最大程度地保留模型的预测能力,从而提高模型的泛化能力和解释性。评价标准可能包括模型的准确率、召回率、精确度或其他与问题相关的性能指标。常用的子集搜索策略包括穷举搜索、启发式搜索和随机搜索等。

11.2 过滤式选择

过滤式方法先对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关这相当千先用特征选择过程对初始特征进行"过滤",再用过滤后的特征来训练模型。

Relief(Relevant Features)是一种著名的过滤式特征选择方法,该方法设计了一个"相关统计量"来度量特征的重要性。该统计量是一个向量,其每个分量分别对应于一个初始特征,而特征子集的重要性则是由子集中每个特征所对应的相关统计量分量之和来决定。于是,最终只需指定一个阙值T,然后选择比T大的相关统计量分量所对应的特征即可;也可指定欲选取的特征个数k,然后选择相关统计量分量最大的K个特征。
在这里插入图片描述

小结

过滤式特征选择是一种在模型训练前评估特征与目标变量统计关系的方法,通过衡量特征的方差、相关性、互信息等来确定其重要性,旨在提高模型泛化能力、降低过拟合风险,并减少计算成本,适用于高维数据集且具有较高的计算效率和易解释性。常见的方法包括方差选择法、卡方检验、皮尔逊相关系数、互信息和信息增益等,它们各自适用于不同的数据类型和场景,可以有效地筛选出对模型预测最有贡献的特征。

11.3 包裹式选择

与过滤式特征选择不考虑后续学习器不同,包裹式特征选抒直接把最终将要使用的学习器的性能作为特征子集的评价准则换言之,包裹式特征选择的目的就是为给定学习器选择最有利于其性能、"量身定做"的特征子集。

一般而言,由于包裹式特征选择方法直接针对给定学习器进行优化,因此从最终学习器性能来看,包裹式特征选择比过滤式特征选择更好,但另一方面,由于在特征选择过程中需多次训练学习器,因此包裹式特征选择的计算开销通常比过滤式特征选择大得多。

LVW是个典型的包裹式特征选择方法。它在拉斯维加斯方法框架下使用随机策略来进行子集搜索,并以最终分类器的误差为特征子集评价准则.算法描述如图所示:在这里插入图片描述

小结

包裹式特征选择是一种在机器学习中广泛使用的特征选择方法,它通过将特征选择过程与模型训练过程相结合,直接利用模型的性能来评估特征子集的好坏。这种方法的核心优势在于它能够针对特定的学习器进行优化,从而选择出最有利于学习器性能的特征子集。与过滤式特征选择相比,包裹式特征选择更贴近实际应用场景,能够更准确地反映特征子集在实际任务中的性能。

包裹式特征选择的过程通常包括以下几个步骤:

  1. 选择一个合适的机器学习模型作为评价器。
  2. 生成不同的特征子集,这可以通过递归特征消除(RFE)、特征子集搜索算法或随机生成特征子集等方式实现。
  3. 对每个特征子集进行模型训练,并使用交叉验证或留出法等技术来评估模型的性能。
  4. 根据模型的性能评估特征子集的优劣,并选择最佳的特征子集。
  5. 最后,使用选择的最佳特征子集对模型进行验证,确保在真实数据上获得良好的性能。

尽管包裹式特征选择能够提供更准确的性能评估并考虑特征之间的关系,但它也存在一些缺点,如计算成本高、过拟合风险以及对模型选择的敏感性。因此,在实际应用中,需要根据问题的特点和计算资源的可用性来权衡使用包裹式特征选择的利弊。

常用的包裹式特征选择方法包括递归特征消除(RFE)、递归特征添加(SFS)、基于遗传算法的特征选择、基于模型的特征选择以及多种子集搜索算法。这些方法各有优缺点,需要根据具体问题的特点和数据集的特征来选择合适的方法。同时,还可以结合交叉验证等技术来评估特征选择的效果,以确保选择到的特征子集在未知数据上具有良好的泛化能力。

11.4 嵌入式选择与L1正则化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

小结

嵌入式特征选择(Embedded Feature Selection)是机器学习中的一种特征选择方法,它将特征选择过程嵌入到模型训练过程中。这种方法的核心思想是利用模型本身的参数或属性来评估特征的重要性,从而选择对模型贡献最大的特征子集。嵌入式特征选择通常与特定的学习算法结合使用,例如L1正则化。

L1正则化,也称为Lasso正则化,是一种在损失函数中加入权重的L1范数(即权重的绝对值之和)作为惩罚项的方法。L1正则化的一个显著特点是它倾向于产生稀疏权重矩阵,即模型中的一些权重参数会被压缩到零。这种稀疏性使得L1正则化成为一种非常有效的特征选择工具,因为它可以自动地将不重要的特征的权重置为零,从而实现特征的自动选择。

嵌入式特征选择的优点在于它能够提供与特定学习器紧密相关的特征选择,通常能够获得更好的性能。然而,这种方法的缺点是计算成本较高,因为它需要多次训练模型来评估不同特征子集的效果。

在实际应用中,嵌入式特征选择可以与其他特征选择方法结合使用,以提高特征选择的准确性和效率。例如,可以先使用过滤式方法去除一些明显不重要的特征,然后使用嵌入式方法进一步精细化特征选择。此外,还可以通过交叉验证等技术来评估所选特征子集的性能,以确保选出的特征子集在未知数据上具有良好的泛化能力。

11.5 稀疏表示与字典学习

在这里插入图片描述

在这里插入图片描述

小结

稀疏表示和字典学习是信号处理和机器学习领域的重要技术。稀疏表示通过使用少量的非零元素来表示信号或数据,能够降低数据的维度并提取关键特征。这种方法在图像处理、语音识别和自然语言处理等领域有广泛应用,如图像压缩、图像分类和语音合成等。字典学习则是从数据中学习得到一个字典,这个字典能够将数据表示为稀疏向量,从而实现数据的有效压缩和特征提取。

字典学习的过程通常包括两个阶段:字典构建和利用字典进行稀疏编码。在字典构建阶段,算法会尝试找到一个最优的字典,使得输入数据可以用该字典中的原子进行稀疏表示。在稀疏编码阶段,算法会根据已学习的字典,求解输入数据的稀疏表示系数。这个过程可以通过多种算法实现,如匹配追踪(Matching Pursuit)和基追踪(Basis Pursuit)等。

在实际应用中,稀疏表示和字典学习能够帮助我们更高效地处理和存储数据,同时提取出对分析和学习任务有用的特征。例如,在图像处理领域,通过稀疏表示可以有效地进行图像压缩和去噪;在语音识别领域,可以用于特征提取和语音合成等任务。此外,这些技术也在深度学习中发挥作用,例如通过ReLU神经元隐含对特征的非负稀疏性的要求,以及池化操作隐含对特征的强稀疏性的要求。

11.6 压缩感知

在这里插入图片描述

在这里插入图片描述

小结

压缩感知是一种革命性的信号处理技术,它利用信号的稀疏特性,可以在远低于Nyquist采样率的条件下获取信号的离散样本,并通过优化算法实现信号的完美重建。这种方法不仅可以减少数据的采样率,降低存储和处理数据的成本,而且在很多情况下,如图像处理、无线通信、医学成像等领域,它还可以提高信号处理的性能。压缩感知的关键在于信号的稀疏表示、测量矩阵的设计以及有效的信号恢复算法。例如,在无线通信领域,压缩感知可以用于频谱感知和频谱管理,提高无线频谱的利用率。

在实际应用中,压缩感知面临的挑战包括如何设计高效的优化算法、如何处理噪声和干扰等。随着深度学习技术的发展,基于神经网络的方法在压缩感知中也显示出了巨大的潜力。例如,张健课题组在压缩感知领域的研究中,提出了一种记忆增强的深度展开网络(MAPUN),通过精细化设计网络的内部和stage之间的信息传输,提高了信号重建的性能。

11.7 代码

单变量特征选择

一个显示单变量特征选择的例子。

在iris数据中加入含噪(非信息)特征,并采用单变量特征选择。对于每个特征,我们绘制了单变量特征选择的p-值和支持向量机的相应权重。我们可以看到,单变量特征选择选择了信息丰富的特征,并且这些特征具有较大的支持向量机权重。

在所有的特征集合中,只有前四个特征是显著的。我们可以看到,他们在单变量特征选择中得分最高。支持向量机为这些特征之一分配了很大的权重,但也选择了许多信息不丰富的特征。在支持向量机之前应用单变量特征选择,可以增加对显著特征的支持向量机的权重,从而改进分类。

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import make_pipeline
from sklearn.feature_selection import SelectKBest, f_classif

# ####################################################
# Import some data to play with

# The iris dataset
X, y = load_iris(return_X_y=True)

# Some noisy data not correlated
E = np.random.RandomState(42).uniform(0, 0.1, size=(X.shape[0], 20))

# Add the noisy data to the informative features
X = np.hstack((X, E))

# Split dataset to select feature and evaluate the classifier
X_train, X_test, y_train, y_test = train_test_split(
        X, y, stratify=y, random_state=0
)

plt.figure(1)
plt.clf()

X_indices = np.arange(X.shape[-1])

# ####################################################
# Univariate feature selection with F-test for feature scoring
# We use the default selection function to select the four
# most significant features
selector = SelectKBest(f_classif, k=4)
selector.fit(X_train, y_train)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()
plt.bar(X_indices - .45, scores, width=.2,
        label=r'Univariate score ($-Log(p_{value})$)')

####################################################
# Compare to the weights of an SVM
clf = make_pipeline(MinMaxScaler(), LinearSVC())
clf.fit(X_train, y_train)
print('Classification accuracy without selecting features: {:.3f}'
      .format(clf.score(X_test, y_test)))

svm_weights = np.abs(clf[-1].coef_).sum(axis=0)
svm_weights /= svm_weights.sum()

plt.bar(X_indices - .25, svm_weights, width=.2, label='SVM weight')

clf_selected = make_pipeline(
        SelectKBest(f_classif, k=4), MinMaxScaler(), LinearSVC()
)
clf_selected.fit(X_train, y_train)
print('Classification accuracy after univariate feature selection: {:.3f}'
      .format(clf_selected.score(X_test, y_test)))

svm_weights_selected = np.abs(clf_selected[-1].coef_).sum(axis=0)
svm_weights_selected /= svm_weights_selected.sum()

plt.bar(X_indices[selector.get_support()] - .05, svm_weights_selected,
        width=.2, label='SVM weights after selection')


plt.title("Comparing feature selection")
plt.xlabel('Feature number')
plt.yticks(())
plt.axis('tight')
plt.legend(loc='upper right')
plt.show()

在这里插入图片描述

11.8 章末小结

本章是关于特征选择与稀疏学习的一个概述,涵盖了多种降维技术及其原理。以下是对每个部分的简要总结和澄清:

  • 子集搜索与评价:通过系统地搜索所有可能的特征子集来找到最优特征组合的方法。它通过评估每个子集对模型预测能力的影响来选择特征,常用评估方法包括交叉验证或留一验证。

  • 过滤式选择:在模型训练前评估特征与目标变量的统计关系,通过衡量特征的方差、相关性、互信息等来确定特征的重要性。适用于高维数据集,计算效率高,易于解释。

  • 包裹式选择:将特征选择过程与模型训练过程相结合,直接利用模型的性能来评估特征子集的好坏。这种方法能够针对特定的学习器进行优化,但计算成本较高。

  • 嵌入式选择:在模型训练过程中进行特征选择,利用模型本身的参数或属性来评估特征的重要性。L1正则化(Lasso)是其中一种方法,它通过产生稀疏权重矩阵来实现特征选择。

  • 稀疏表示与字典学习:通过使用少量的非零元素来表示信号或数据,降低数据的维度并提取关键特征。字典学习从数据中学习得到一个字典,将数据表示为稀疏向量。

  • 压缩感知:一种信号处理技术,利用信号的稀疏特性,在远低于Nyquist采样率的条件下获取信号的离散样本,并通过优化算法实现信号的完美重建。

  • 单变量特征选择:一个Python代码示例,展示了如何在iris数据集中加入噪声特征,并采用单变量特征选择方法。代码中使用了支持向量机(SVM)来评估特征选择的效果。


http://www.kler.cn/news/324023.html

相关文章:

  • JAVA-内部类和匿名内部类
  • Pandas空值识别,空值填充,空值过滤方法超详细解读
  • 如何手动安装libcrypto.so.10和libssl.so.10这两个库?
  • C语言 | Leetcode C语言题解之第440题字典序的第K小数字
  • pycharm2024版 搭配Anaconda创建pytorch项目
  • 算法分析,主定理
  • 【解决方案】Java 互联网项目中常见的 Redis 缓存应用场景
  • c语言和c++一样吗
  • Spring Boot实现房产租赁业务逻辑
  • 互联网安全为什么要做风险评估:构建数字世界的坚固防线
  • 排序算法C++
  • 经济不好,但是遍地都是赚钱的机会
  • 万元购车平台源码开发总结与关键技术解析
  • 如何应对“.DevicData-C-XXXXXXXX”勒索病毒:建议与防范措施
  • fiddler抓包12_篡改请求(请求前断点)
  • *C++:list
  • 【C语言零基础入门篇 - 17】:排序算法
  • ubuntu系统下,c++图形库Matplot++配置
  • 深度学习(3):Tensor和Optimizer
  • 求职Leetcode题目(11)
  • 如何使用C语言接入Doris数据库
  • 线性表二——栈stack
  • 微信小程序开发系列之-在微信小程序中使用云开发
  • How to install JetBrains ToolBox in Ubuntu 22.04 LTS?
  • ELK-03-skywalking监控linux系统
  • JAVA JDK华为云镜像下载,速度很快
  • AIGC入门:Comfyui整合包,解压即用!
  • Goweb---Gorm操作数据库(二)
  • project_object_model_3d
  • ES6中迭代器与生成器知识浅析