目录
4.1.2 代码示例(Python + scikit - learn)
4.2 基于 Las Vegas Wrapper(LVW)的实现
1. 引言

在机器学习的广阔领域中,特征选择与稀疏学习是至关重要的技术,它们如同精密仪器的调试过程,对模型的性能起着决定性作用。随着数据维度的不断增加,高维数据带来的 “维度灾难” 问题愈发凸显,这不仅增加了计算成本,还容易导致模型过拟合,使得模型在未知数据上的表现大打折扣。
特征选择,旨在从原始特征集合中挑选出对模型最有价值的特征子集,去除冗余或无关的特征。这一过程就像是从众多食材中挑选出制作美味佳肴的关键食材,保留精华,剔除糟粕。它能够降低模型复杂度,提升训练速度,增强模型的泛化性能,使模型在面对新数据时能够更加准确地进行预测。
稀疏学习则是通过引入稀疏约束,让模型自动选择少量关键特征,实现降维与提升泛化能力的目标。它如同给模型装上了一双 “慧眼”,能够在复杂的数据中聚焦关键信息,使模型更加简洁高效。
而包裹式选择作为特征选择的一种重要方法,以其独特的原理和实现方式,在机器学习中占据着重要地位。它直接利用模型的性能来评估特征子集的好坏,如同根据菜肴的最终口感来挑选食材组合,更加贴近实际应用场景。在本文中,我们将深入探讨包裹式选择原理及实现,剖析其核心思想、步骤流程以及在实际应用中的表现,为读者揭开这一技术的神秘面纱。
2. 特征选择与稀疏学习基础
2.1 特征选择概述
特征选择,作为机器学习领域中至关重要的一环,是从原始特征集合中挑选出对模型训练和预测最具价值的特征子集的过程。在实际的机器学习项目中,我们常常面临高维数据的挑战,这些数据集中包含大量的特征,然而并非所有特征都对模型的性能提升有积极作用。其中一些特征可能是冗余的,它们所包含的信息可以从其他特征中推导得出;还有一些特征可能是噪声特征,与目标变量毫无关联,甚至会干扰模型的学习过程 。
特征选择的主要目标之一是降低维度灾难的影响。随着数据维度的增加,数据的稀疏性问题愈发严重,这会导致模型训练的计算量呈指数级增长,同时也容易引发过拟合现象,使得模型在训练集上表现良好,但在测试集或新数据上的泛化能力大幅下降。通过合理的特征选择,去除那些冗余和无关的特征,能够有效地降低数据维度,减少计算资源的消耗,提高模型的训练效率。例如,在一个图像识别项目中,原始图像可能包含成千上万的像素点作为特征,但实际上,只有部分关键特征,如物体的轮廓、颜色特征等,对于识别物体类别起着决定性作用。通过特征选择,我们可以筛选出这些关键特征,从而在不损失太多信息的前提下,大大降低模型的复杂度和训练时间。
另一个重要目标是提升模型的性能。去除无用特征后,模型能够更加专注于学习与目标变量真正相关的信息,从而提高模型的准确性和泛化能力。在医疗诊断领域,医生需要从患者的众多生理指标中选择最能预测疾病状态的特征,以避免误诊和提高治疗效果。在图像识别任务中,通过选择最能区分不同类别的图像特征,可以显著提高模型的识别准确率。此外,经过特征选择后的模型往往具有更好的可解释性,我们可以更容易地理解模型是如何做出决策的,这在一些对解释性要求较高的领域,如金融风险评估、法律判决预测等,具有重要的意义。
在机器学习的整体流程中,特征选择处于数据预处理阶段,是构建高效模型的关键步骤。它为后续的模型训练提供了更加优质、精简的特征数据,使得模型能够在更有利的条件下进行学习和优化,从而为实现准确的预测和分析奠定坚实的基础。
2.2 稀疏学习概念
稀疏学习,作为机器学习领域中一种强大的技术手段,旨在通过让模型的系数或参数呈现稀疏性,即大部分系数为零或接近零,从而实现对模型的优化和简化。这种稀疏性的引入,为模型带来了诸多优势。
从模型简化的角度来看,当模型的系数变得稀疏时,意味着模型只依赖于少数关键的特征,而忽略了那些对结果影响较小的特征。这就好比在构建一个复杂的拼图时,我们只关注那些关键的拼图块,而舍弃了一些无关紧要的部分,使得模型的结构更加简洁明了。例如,在一个线性回归模型中,如果某些特征的系数被稀疏化为零,那么这些特征在模型中就不再参与计算,模型只需要关注那些系数不为零的关键特征,从而大大降低了模型的复杂度。
稀疏学习在降低计算成本方面也发挥着重要作用。在处理高维数据时,模型的计算量往往会随着特征维度的增加而急剧增长。然而,通过稀疏学习,我们可以将大部分不重要的特征的系数置为零,使得模型在计算过程中只需要处理少数关键特征,从而显著减少了计算量和存储空间的需求。以一个包含大量特征的文本分类任务为例,原始数据可能包含成千上万的词汇特征,但通过稀疏学习,我们可以发现只有少数关键词对于文本的分类起着决定性作用,将其他词汇特征的系数稀疏化后,模型的计算效率将得到大幅提升。
此外,稀疏学习还能够提升模型的泛化能力。在实际应用中,模型不仅要在训练数据上表现良好,更重要的是要能够准确地预测未知数据。通过稀疏学习,模型能够自动筛选出对目标变量真正有影响的特征,避免了过拟合问题,使得模型在面对新数据时能够更加稳健地进行预测。在图像识别领域,稀疏学习可以帮助模型从大量的图像特征中挑选出最具代表性的特征,从而提高模型在不同图像数据集上的泛化能力。
稀疏学习是一种通过引入稀疏约束,让模型自动选择少量关键特征的技术,它在简化模型、降低计算成本和提升泛化能力等方面具有显著的优势,为机器学习模型的优化和应用提供了有力的支持。
3. 包裹式选择原理深度剖析
3.1 基本思想
包裹式选择,作为特征选择领域中一种独特且高效的方法,其核心思想紧密围绕着学习器的性能展开。与其他特征选择方法不同,包裹式选择将最终使用的学习器性能作为评价特征子集优劣的关键准则,旨在为特定的学习器挑选出最能提升其性能的特征子集,就像是为一把独特的锁定制一把精准匹配的钥匙。
在实际操作中,包裹式选择从初始的特征集合出发,通过一系列精心设计的搜索策略,不断生成不同的特征子集。每生成一个特征子集,就使用该学习器在这个子集上进行训练和评估。例如,在一个图像分类任务中,我们使用支持向量机(SVM)作为学习器,包裹式选择会尝试从原始的图像特征(如像素值、颜色直方图、纹理特征等)中生成各种不同的特征子集。对于每个生成的子集,我们会用 SVM 在这个子集上进行训练,并使用准确率、召回率等指标来评估其性能。如果某个特征子集使得 SVM 在训练和验证过程中表现出较高的准确率和较低的误差,那么这个子集就被认为是一个较好的选择。
这种方法的优势在于它直接针对特定学习器进行优化,充分考虑了特征之间的相互作用以及它们对学习器性能的综合影响。因为不同的学习器对特征的敏感度和需求各不相同,包裹式选择能够根据学习器的特点来筛选特征,从而使学习器在所选特征子集上发挥出最佳性能。然而,其计算开销相对较大,因为在特征选择过程中需要多次训练学习器,这在特征数量较多时可能会导致计算时间大幅增加 。
3.2 子集搜索策略
3.2.1 前向搜索
前向搜索是包裹式选择中一种常用的子集搜索策略,它的操作过程犹如逐步搭建一座坚实的大厦,从无到有,逐步添加关键元素。该策略从空集开始,把每一个特征都看作是一个潜在的候选子集,逐一评估每个特征加入空集后对学习器性能的影响。例如,在一个预测用户购买行为的机器学习任务中,我们最初拥有用户的年龄、性别、收入、购买历史等多个特征。前向搜索首先会单独评估年龄这个特征对预测用户购买行为的作用,使用逻辑回归作为学习器,计算仅使用年龄特征时模型的准确率。然后,对性别、收入等其他特征进行同样的操作。
在完成第一轮评估后,选择使学习器性能提升最大的那个特征,将其加入到当前的特征子集中,形成一个包含一个特征的最优子集。接着,进入下一轮搜索,尝试在这个已有的最优子集上再加入一个新的特征,构成包含两个特征的候选子集。比如,在上一轮选择了年龄特征后,这一轮会尝试将年龄与性别组合、年龄与收入组合等,分别计算这些组合作为特征子集时学习器的性能提升情况。再次选择使性能提升最大的那个包含两个特征的候选子集,作为新的最优子集。
这个过程会不断重复,每一轮都尝试在之前的最优子集上增加一个新的特征,直到某一轮加入新特征后,学习器的性能不再有明显提升,或者达到了预设的停止条件(如最大特征数量限制、性能提升阈值等),此时的特征子集就被认为是通过前向搜索得到的最优特征子集。前向搜索的优点是计算相对简单,且在每一步都能保证选择的特征对学习器性能有积极的提升作用,但它也容易陷入局部最优,因为一旦前期选择了某些特征,后续可能会受到这些特征的限制,无法找到全局最优的特征组合 。
3.2.2 后向搜索
后向搜索策略则与前向搜索相反,它如同对一座已经建成的大厦进行精简和优化,从全集出发,逐步去除那些对整体结构影响较小的部分。在后向搜索中,我们首先以所有的原始特征构成的全集作为初始特征子集,使用学习器在这个全集上进行训练和评估,得到一个初始的性能指标。
以一个疾病诊断的机器学习模型为例,假设我们最初有患者的各种生理指标、症状描述、病史等多个特征。后向搜索首先使用决策树作为学习器,在所有这些特征上进行训练,得到一个初始的诊断准确率。然后,开始尝试从这个全集中删除一个特征,形成包含少一个特征的候选子集。例如,尝试删除某个不太重要的生理指标,重新用决策树在这个新的候选子集上进行训练和评估,计算诊断准确率的变化。对每一个可能被删除的特征都进行这样的操作,然后选择删除后对学习器性能影响最小的那个特征,将其从当前特征子集中移除,得到一个新的特征子集。
接着,进入下一轮搜索,再次尝试从新的特征子集中删除一个特征,重复上述评估和删除的过程。这个过程会持续进行,直到删除任何一个特征都会导致学习器性能明显下降,或者达到预设的停止条件(如最小特征数量限制等),此时剩下的特征子集就是通过后向搜索得到的最优特征子集。后向搜索的优点是能够考虑到特征之间的相互作用,因为是从全集开始逐步删除特征,所以在一定程度上可以避免遗漏重要的特征组合。然而,它的计算量相对较大,因为每一轮都需要对多个候选子集进行评估,而且同样存在陷入局部最优的风险 。
3.2.3 双向搜索
双向搜索策略巧妙地融合了前向搜索和后向搜索的优点,试图在更广阔的解空间中寻找全局最优解,就像从河流的上下游同时出发,寻找交汇的最佳点。在双向搜索中,每一轮搜索既包含添加特征的操作,也包含删除特征的操作。
我们还是以图像分类任务为例,假设最初有一系列图像特征,如颜色特征、纹理特征、形状特征等。双向搜索开始时,首先使用全连接神经网络作为学习器,在所有这些特征上进行训练和评估,得到初始性能。然后,在第一轮搜索中,一方面尝试在前向搜索的方向上,从空集开始添加一个使性能提升最大的特征;另一方面,尝试在后向搜索的方向上,从全集中删除一个对性能影响最小的特征。分别得到两个新的特征子集,再用学习器在这两个子集中进行训练和评估,选择性能更好的那个特征子集作为下一轮搜索的基础。
在后续的每一轮中,都重复这个过程,同时进行添加和删除操作,不断更新特征子集。例如,在第二轮中,在前一轮选择的特征子集上,再次尝试添加一个新特征和删除一个已有特征,分别得到两个新的候选子集,然后评估它们的性能,选择最优的继续下一轮。双向搜索通过同时在两个方向上探索解空间,增加了找到全局最优解的可能性,能够在一定程度上避免陷入局部最优。但是,由于它每一轮都需要进行更多的计算和评估,所以计算开销也相对较大,对计算资源和时间的要求更高 。
3.3 子集评价指标
3.3.1 准确率
准确率是分类任务中最常用的子集评价指标之一,它直观地反映了模型预测正确的样本数在总样本数中所占的比例。其计算公式为:准确率 = (预测正确的样本数 / 总样本数)× 100%。在一个手写数字识别的项目中,我们使用卷积神经网络(CNN)作为学习器,对 1000 张手写数字图片进行分类。如果模型正确分类了 900 张图片,那么准确率 = (900 / 1000)× 100% = 90%。
在包裹式选择中,我们使用不同的特征子集训练学习器,然后通过计算模型在测试集上的准确率来评估每个特征子集的优劣。准确率越高,说明该特征子集所包含的特征对于学习器准确分类样本越有帮助,也就意味着这个特征子集更有可能是我们所需要的最优子集。然而,准确率在某些情况下可能会存在局限性。当数据集存在类别不平衡问题时,即不同类别的样本数量差异较大,准确率可能会掩盖模型在少数类样本上的表现。例如,在一个疾病诊断任务中,99% 的样本为健康样本,1% 的样本为患病样本,如果模型将所有样本都预测为健康样本,虽然准确率高达 99%,但对于疾病的诊断却毫无价值。因此,在使用准确率作为评价指标时,需要结合其他指标一起考虑,以更全面地评估特征子集的性能 。
3.3.2 均方误差(MSE)
均方误差(MSE)主要用于回归任务,它通过计算预测值与真实值之差的平方的均值,来衡量模型预测值与真实值之间的平均误差程度。其计算公式为:MSE = (1 /n)× Σ(预测值 - 真实值)²,其中 n 为样本数量,Σ 表示对所有样本求和。在一个房价预测的机器学习模型中,我们使用线性回归作为学习器,有 100 个房屋样本,每个样本都有真实的房价和模型预测的房价。假设第一个房屋的真实房价为 100 万元,预测房价为 105 万元,第二个房屋真实房价为 120 万元,预测房价为 115 万元等,通过计算每个样本预测值与真实值之差的平方,再求这些平方值的平均值,就得到了 MSE。
在包裹式选择的回归任务中,我们使用不同的特征子集训练回归模型,然后计算模型在测试集上的 MSE。MSE 值越小,说明模型的预测值与真实值越接近,也就表明该特征子集对于回归模型的性能提升更有帮助,是更优的特征子集选择。MSE 能够很好地反映模型预测的准确性和稳定性,因为它对误差进行了平方处理,使得较大的误差对结果的影响更加显著,从而更严格地衡量了模型的性能。但是,MSE 的单位是原始数据单位的平方,这可能会导致在解释结果时不太直观,有时需要结合其他指标,如均方根误差(RMSE),将 MSE 开方后得到与原始数据单位相同的指标,以便更好地理解模型的误差情况 。
3.3.3 交叉验证得分
交叉验证得分是一种更为稳健的子集评价方法,它通过多次划分数据集进行训练和验证,综合评估特征子集的性能,从而减少了因数据集划分方式不同而导致的评估偏差。常见的交叉验证方法有 K 折交叉验证、留一法交叉验证等。以 K 折交叉验证为例,我们将数据集 D 随机划分为 K 个大小相等的子集 D1, D2, ..., DK。在每次迭代中,选择其中一个子集作为验证集,其余 K - 1 个子集作为训练集。使用学习器在训练集上进行训练,然后在验证集上进行评估,得到一个性能指标(如准确率、MSE 等)。经过 K 次迭代后,将这 K 次得到的性能指标取平均值,得到的平均值就是该特征子集在 K 折交叉验证下的得分。
在包裹式选择中,我们使用不同的特征子集进行 K 折交叉验证,通过比较它们的交叉验证得分来选择最优的特征子集。例如,在一个客户满意度预测的项目中,我们有 1000 个客户样本数据,采用 5 折交叉验证。对于每个特征子集,我们将数据集分成 5 份,每次用 4 份数据训练逻辑回归模型,用剩下的 1 份数据进行验证,得到一个准确率。经过 5 次迭代后,计算这 5 次准确率的平均值作为该特征子集的交叉验证得分。交叉验证得分越高,说明该特征子集在不同的数据划分下都能使学习器表现出较好的性能,具有更好的泛化能力。交叉验证得分能够更全面、可靠地评估特征子集的性能,因为它充分利用了数据集的信息,避免了因单次数据集划分而带来的偶然性和偏差 。
4. 包裹式选择的实现
4.1 基于递归特征消除(RFE)的实现
4.1.1 原理
递归特征消除(RFE)是包裹式选择中的一种经典实现方法,它以递归的方式逐步消除对模型贡献较小的特征,从而筛选出最优的特征子集。其核心原理基于对模型特征重要性的评估,通过不断迭代,每次移除当前模型中最不重要的特征,直到达到预设的特征数量或满足特定的停止条件。
具体而言,RFE 首先使用全部特征训练一个模型,不同的模型有不同的评估特征重要性的方式。对于线性回归模型,通常通过系数的绝对值大小来衡量特征的重要性,系数绝对值越大,说明该特征对目标变量的影响越大,也就越重要;对于决策树和基于决策树的集成模型(如随机森林、梯度提升树等),则通过特征的分裂次数、信息增益或基尼系数等指标来评估特征重要性。例如,在一个随机森林模型中,某个特征在决策树的分裂过程中被频繁使用,导致节点的纯度大幅提升,那么这个特征就会被赋予较高的重要性分数。
在计算出每个特征的重要性后,RFE 会移除重要性最低的那个特征,得到一个新的特征子集。然后,使用这个新的特征子集重新训练模型,再次评估每个特征的重要性,并继续移除重要性最低的特征。这个过程不断重复,就像从一个装满物品的箱子里,每次挑出最不重要的物品并拿走,直到箱子里剩下的物品数量达到我们期望的数量,或者继续移除特征不再能显著提升模型性能为止。最终剩下的特征子集就是 RFE 认为对模型最有价值的特征集合。
4.1.2 代码示例(Python + scikit - learn)
下面是使用 Python 和 scikit - learn 库实现 RFE 进行特征选择的完整代码示例。我们将使用经典的鸢尾花数据集,该数据集包含 4 个特征和 3 个类别,通过 RFE 选择出对分类最有帮助的 2 个特征。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFE
# 加载Iris数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化随机森林分类器
model = RandomForestClassifier()
# 初始化RFE,指定选择2个特征
rfe = RFE(estimator=model, n_features_to_select=2)
# 拟合RFE到训练数据
rfe.fit(X_train, y_train)
# 打印特征排名,排名为1的是被选中的特征,其他大于1的表示被逐步移除的特征
print("特征排名:", rfe.ranking_)
# 打印被选择的特征索引
print("被选择的特征索引:", np.where(rfe.support_)[0])
# 打印被选择的特征名称
feature_names = iris.feature_names
selected_features = [feature_names[i] for i in np.where(rfe.support_)[0]]
print("被选择的特征名称:", selected_features)
上述代码首先导入必要的库,然后加载鸢尾花数据集并将其划分为训练集和测试集。接着,创建一个随机森林分类器作为 RFE 的估计器,并初始化 RFE,指定要选择的特征数量为 2。通过rfe.fit(X_train, y_train)将 RFE 拟合到训练数据上,模型会自动计算每个特征的重要性并进行特征选择。最后,通过rfe.ranking_打印每个特征的排名,rfe.support_获取被选择的特征的布尔掩码,进而通过np.where找到被选择特征的索引,并根据索引从特征名称列表中获取被选择的特征名称 。运行这段代码,我们可以直观地看到哪些特征被 RFE 选中,以及每个特征在选择过程中的排名情况,从而了解不同特征对模型的贡献程度 。
4.2 基于 Las Vegas Wrapper(LVW)的实现
4.2.1 原理
Las Vegas Wrapper(LVW)是一种基于拉斯维加斯算法框架的包裹式特征选择方法,它采用随机策略进行特征子集的搜索,以学习器的误差作为评价特征子集优劣的准则。拉斯维加斯算法的特点是在执行过程中允许随机选择下一步操作,这使得 LVW 能够在广阔的特征空间中进行高效的搜索。
LVW 的工作流程从初始化开始,设置最大迭代次数、误差阈值等关键参数。在每次迭代中,LVW 从原始特征集合中随机生成一个特征子集。这个随机生成的过程就像是从一个装满各种特征的袋子里随机抓取一些特征,组成一个新的 “特征组合”。然后,使用这个随机生成的特征子集来训练学习器,并通过交叉验证等方法评估学习器在验证集上的误差。交叉验证是一种常用的评估方法,它将数据集划分为多个部分,轮流将其中一部分作为验证集,其余部分作为训练集,通过多次训练和验证,得到一个相对稳定的误差估计,这样可以更准确地评估模型在不同数据划分下的性能。
如果当前生成的特征子集使得学习器的误差小于之前记录的最小误差,或者误差相同但特征子集的数量更少(即特征更精简),那么就更新当前的最优特征子集为这个新生成的特征子集。这就好比在寻找宝藏的过程中,每次发现一个更好的 “路径”(特征子集),就记录下来并继续探索,希望找到更优的解。LVW 会不断重复这个随机生成特征子集、训练学习器、评估误差并比较更新的过程,直到达到预设的最大迭代次数或者误差已经无法再显著降低,此时得到的最优特征子集就是 LVW 为学习器选择的最有利于其性能的特征集合。由于 LVW 的随机性,每次运行可能会得到不同的结果,但通过多次迭代和比较,它有较大的概率找到一个性能较好的特征子集 。
4.2.2 代码实现思路(伪代码展示)
以下是 LVW 实现流程的伪代码展示,它清晰地呈现了 LVW 从初始化到最终选择最优特征子集的整个过程。
输入: 数据集D, 学习器L, 最大迭代次数T, 误差阈值epsilon
输出: 最优特征子集A*
初始化:
最小误差E = 无穷大
当前最优特征子集大小d* = 无穷大
当前最优特征子集A* = 空集
当前迭代次数t = 0
while t < T:
t = t + 1
# 从原始特征集合中随机生成一个特征子集A'
A' = 从D的特征集中随机选择部分特征构成的子集
d' = A'的特征数量
# 使用特征子集A'训练学习器L,并在验证集上评估误差E'
将D划分为训练集D_train和验证集D_val
使用A'中的特征和D_train训练学习器L
使用训练好的L在D_val上预测并计算误差E'
if E' < E or (E' == E and d' < d*):
E = E'
d* = d'
A* = A'
if E < epsilon:
break
返回 A*
在上述伪代码中,首先进行初始化操作,设置初始的最小误差、最优特征子集大小和子集为空。然后进入循环,每次循环中随机生成一个特征子集,使用该子集训练学习器并评估误差。如果新的误差小于当前最小误差,或者误差相同但特征子集更精简,就更新最优特征子集和最小误差。如果误差已经小于预设的阈值,就提前结束循环,最后返回找到的最优特征子集 。
5. 案例实战:以鸢尾花数据集为例
5.1 数据准备
在进行特征选择和模型训练之前,我们需要对鸢尾花数据集进行加载和预处理。鸢尾花数据集是一个经典的分类数据集,包含 150 个样本,每个样本有 4 个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),对应 3 种不同的鸢尾花类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾 )。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据归一化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集,测试集占比20%
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
上述代码中,首先使用load_iris函数从sklearn.datasets中加载鸢尾花数据集,将特征数据赋值给X,标签数据赋值给y。接着,为了消除不同特征之间量纲的影响,提高模型的收敛速度和性能,使用StandardScaler进行数据归一化,使每个特征的均值为 0,方差为 1 。最后,使用train_test_split函数将归一化后的数据划分为训练集和测试集,其中测试集占总数据的 20%,random_state设置为 42,以确保每次运行代码时划分结果的一致性。
5.2 包裹式选择应用
接下来,我们在鸢尾花数据集上应用递归特征消除(RFE)和拉斯维加斯包装器(LVW)这两种包裹式选择方法进行特征选择。
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier
import random
# 定义LVW函数
def lvw(X, y, estimator, max_iter=100, error_threshold=1e-4):
n_features = X.shape[1]
best_features = None
best_error = float('inf')
best_size = n_features
for _ in range(max_iter):
# 随机生成特征子集
feature_subset = random.sample(range(n_features), random.randint(1, n_features))
X_subset = X[:, feature_subset]
# 使用特征子集训练学习器并评估误差
estimator.fit(X_subset, y)
y_pred = estimator.predict(X_subset)
error = np.mean(y_pred != y)
if error < best_error or (error == best_error and len(feature_subset) < best_size):
best_error = error
best_features = feature_subset
best_size = len(feature_subset)
if best_error < error_threshold:
break
return best_features
# RFE特征选择
rfe_model = RandomForestClassifier()
rfe = RFE(estimator=rfe_model, n_features_to_select=2)
rfe.fit(X_train, y_train)
rfe_selected_features = np.where(rfe.support_)[0]
print("RFE选择的特征索引:", rfe_selected_features)
# LVW特征选择
lvw_model = RandomForestClassifier()
lvw_selected_features = lvw(X_train, y_train, lvw_model)
print("LVW选择的特征索引:", lvw_selected_features)
在这段代码中,首先定义了lvw函数来实现 LVW 算法。在lvw函数中,通过循环随机生成特征子集,使用随机森林分类器在这些子集上进行训练,并计算误差。如果当前子集的误差小于之前记录的最小误差,或者误差相同但子集大小更小,就更新最优特征子集。循环会持续进行,直到达到最大迭代次数或误差小于预设的阈值。
然后,进行 RFE 特征选择。使用随机森林分类器作为估计器,初始化 RFE 并设置选择 2 个特征。通过rfe.fit在训练数据上拟合 RFE,最后通过np.where(rfe.support_)[0]获取被选择的特征索引。
接着,进行 LVW 特征选择。使用随机森林分类器作为学习器,调用lvw函数在训练数据上进行特征选择,得到 LVW 选择的特征索引。运行上述代码,我们可以得到 RFE 和 LVW 分别选择的特征索引,从而了解这两种包裹式选择方法在鸢尾花数据集上的筛选结果 。
5.3 模型训练与评估
为了对比使用原始特征和包裹式选择后特征训练分类模型的性能差异,我们使用逻辑回归模型进行训练和评估。
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 使用原始特征训练逻辑回归模型
lr_original = LogisticRegression()
lr_original.fit(X_train, y_train)
y_pred_original = lr_original.predict(X_test)
accuracy_original = accuracy_score(y_test, y_pred_original)
print("使用原始特征的逻辑回归模型准确率:", accuracy_original)
# 使用RFE选择的特征训练逻辑回归模型
X_train_rfe = X_train[:, rfe_selected_features]
X_test_rfe = X_test[:, rfe_selected_features]
lr_rfe = LogisticRegression()
lr_rfe.fit(X_train_rfe, y_train)
y_pred_rfe = lr_rfe.predict(X_test_rfe)
accuracy_rfe = accuracy_score(y_test, y_pred_rfe)
print("使用RFE选择特征的逻辑回归模型准确率:", accuracy_rfe)
# 使用LVW选择的特征训练逻辑回归模型
X_train_lvw = X_train[:, lvw_selected_features]
X_test_lvw = X_test[:, lvw_selected_features]
lr_lvw = LogisticRegression()
lr_lvw.fit(X_train_lvw, y_train)
y_pred_lvw = lr_lvw.predict(X_test_lvw)
accuracy_lvw = accuracy_score(y_test, y_pred_lvw)
print("使用LVW选择特征的逻辑回归模型准确率:", accuracy_lvw)
上述代码中,首先使用原始特征训练逻辑回归模型。创建逻辑回归模型lr_original,使用训练集X_train和y_train进行训练,然后在测试集X_test上进行预测,通过accuracy_score计算预测结果y_pred_original与真实标签y_test的准确率,并打印出来。
接着,使用 RFE 选择的特征训练逻辑回归模型。从训练集和测试集中提取 RFE 选择的特征,分别得到X_train_rfe和X_test_rfe。创建新的逻辑回归模型lr_rfe,在X_train_rfe和y_train上进行训练,在X_test_rfe上进行预测,计算并打印准确率。
最后,使用 LVW 选择的特征训练逻辑回归模型。同样地,从训练集和测试集中提取 LVW 选择的特征,得到X_train_lvw和X_test_lvw。创建逻辑回归模型lr_lvw,进行训练和预测,计算并打印准确率。通过对比这三个准确率,我们可以直观地看到使用包裹式选择方法后,特征对逻辑回归模型性能的影响 。
6. 总结与展望
6.1 总结
在本次关于特征选择与稀疏学习中包裹式选择的探索之旅中,我们深入剖析了包裹式选择的原理、实现方法,并通过实际案例验证了其有效性。包裹式选择以学习器性能为导向,通过精心设计的子集搜索策略和科学合理的评价指标,能够精准地为特定学习器筛选出最具价值的特征子集。
在原理层面,包裹式选择的基本思想是将学习器性能作为评价特征子集优劣的核心标准,这使得它能够充分考虑特征之间的相互作用以及它们对学习器性能的综合影响。在子集搜索策略上,前向搜索从空集开始逐步添加特征,后向搜索从全集开始逐步删除特征,双向搜索则融合两者优点,在不同的场景下各有优劣。而在子集评价指标方面,准确率、均方误差和交叉验证得分等指标从不同角度为我们衡量特征子集的性能提供了依据 。
在实现部分,基于递归特征消除(RFE)的方法通过递归地移除对模型贡献较小的特征来实现特征选择,其原理清晰,实现过程相对简洁,在实际应用中具有较高的可操作性;基于 Las Vegas Wrapper(LVW)的方法则采用随机策略进行特征子集搜索,虽然计算开销较大,但能够在更广阔的解空间中寻找可能的最优解 。
通过鸢尾花数据集的案例实战,我们直观地看到了包裹式选择在实际应用中的效果。无论是 RFE 还是 LVW,都能够从原始特征中筛选出对分类任务有重要作用的特征子集,并且使用这些筛选后的特征训练逻辑回归模型,在一定程度上提高了模型的准确率。然而,我们也不能忽视包裹式选择存在的不足。由于在特征选择过程中需要多次训练学习器,其计算成本相对较高,这在特征数量较多或数据集较大时可能会成为限制其应用的因素;此外,包裹式选择对模型的选择较为敏感,不同的模型可能会导致选择出不同的特征子集,从而影响最终的模型性能 。
6.2 展望
随着机器学习技术的不断发展和应用场景的日益复杂,包裹式选择方法在未来有着广阔的发展空间和应用前景。在面对更加复杂的数据,如高维、非线性、多模态数据时,现有的包裹式选择方法需要进一步优化和改进。例如,可以探索更高效的搜索策略,结合深度学习中的一些优化算法,如自适应学习率算法、随机梯度下降的变种等,来加速特征子集的搜索过程,降低计算成本。同时,如何更好地融合多种评价指标,以更全面、准确地评估特征子集的性能,也是未来研究的一个重要方向 。
在实际应用中,包裹式选择有望在更多领域发挥重要作用。在生物医学领域,面对海量的基因数据和复杂的疾病特征,包裹式选择可以帮助筛选出与疾病诊断、治疗效果密切相关的关键基因特征,为精准医疗提供有力支持;在金融领域,对于风险评估和投资决策等任务,通过包裹式选择可以从众多的金融指标和市场数据中挑选出最具预测性的特征,提高模型的准确性和可靠性 。
我们鼓励读者深入研究包裹式选择方法,不断探索其在不同场景下的应用潜力。在实际项目中,可以尝试结合其他特征选择方法,如过滤式选择、嵌入式选择等,发挥各自的优势,进一步提升模型的性能。相信在未来,随着研究的不断深入和技术的持续创新,包裹式选择方法将在机器学习领域绽放更加耀眼的光芒,为解决各种实际问题提供更强大的技术支持 。

被折叠的 条评论
为什么被折叠?



