【机器学习】包裹式特征选择之基于模型的特征选择法

简介: 【机器学习】包裹式特征选择之基于模型的特征选择法



引言:

在机器学习的世界里,特征选择是一项至关重要的任务。它关乎如何从海量的数据中筛选出最具代表性的特征,从而提高模型的性能和效率。其中,基于模型的特征选择法,又称为包裹式特征选择,是一种利用机器学习模型自身性能来评估特征重要性的方法。

本文将深入探讨基于模型的特征选择法的原理、步骤、优缺点及适用场景,并通过具体的代码示例来分析其实际应用效果。

一 初步了解

1.1 概念

基于模型的特征选择法是一种在机器学习中广泛应用的特征选择方法,它紧密结合了特征选择过程和模型的训练过程。

这种方法的核心思想在于,通过利用机器学习模型的训练结果来评估特征的重要性,进而选择出对模型性能提升最大的特征子集。

在基于模型的特征选择法中,特征的选择不再是独立于模型的过程,而是与模型的构建和训练紧密相关。

首先,我们需要选择一个合适的机器学习模型作为特征选择的基础。然后,通过多次迭代训练模型,观察不同特征组合下模型的性能表现,从而判断每个特征对模型的重要性。

具体来说,在每次迭代中,我们可以尝试添加或移除某些特征,然后重新训练模型,并评估模型在新的特征组合下的性能。

通过比较不同特征组合下模型的性能差异,我们可以判断哪些特征对模型的性能提升有显著贡献,哪些特征可能是冗余或无关的。

基于模型的特征选择法的优点在于它能够考虑到特征之间的相互作用和依赖关系,而不仅仅是基于统计相关性进行特征选择。

因此,它能够选择出更适应特定模型的特征子集,从而提高模型的性能。

1.2 类比

假设你是一位音乐制作人,正在筹备一张新的音乐专辑。在这张专辑中,你需要从大量的音乐素材中选择出最适合你音乐风格的元素,如旋律、节奏、乐器等。

这个过程可以类比为机器学习中的特征选择。

在这个例子中,你的音乐专辑就是你的模型,而音乐素材就是特征。

你需要根据你的音乐风格和目标听众的喜好,选择出最适合的特征(音乐素材)来构建你的专辑。

类比到基于模型的特征选择法,你并不会仅仅依赖于音乐素材本身的属性(如音符的复杂性、乐器的种类等)来做出选择,而是会考虑这些素材在你的音乐中的整体效果。

你会尝试不同的素材组合,观察它们对整首歌曲的氛围、情感表达以及听众反应的影响。通过多次尝试和调整,你会找到那些最能凸显你音乐风格的素材组合。

在机器学习中,基于模型的特征选择法也是类似的过程。它并不是简单地对单个特征进行评估,而是将特征选择过程与模型的训练过程相结合。通过多次迭代训练模型,观察不同特征组合下模型的性能表现,从而找到那些最能提升模型性能的特征子集。

通过这个音乐制作的例子,我们可以更加形象地理解基于模型的特征选择法的概念。

它强调了在特征选择过程中要考虑特征之间的相互作用和整体效果,以选择出最适合模型的特征组合。

1.3 与递归特征消除法的区别

包裹式特征选择中基于模型的特征选择法与递归特征消除法虽然都是特征选择的重要方法,但它们之间存在一些显著的不同。

首先,基于模型的特征选择法主要依赖于机器学习模型的训练结果来评估特征的重要性。

它紧密结合了特征选择过程和模型的训练过程,通过多次迭代训练模型,观察不同特征组合下模型的性能表现,从而选择出对模型性能提升最大的特征子集。

这种方法能够考虑到特征之间的相互作用和依赖关系,选择出更适应特定模型的特征组合。

而递归特征消除法则是一种更具体的特征选择方法。

它使用一个基模型(如随机森林、逻辑回归等)进行多轮训练。在每轮训练结束后,消除若干权值系数较低的特征,再基于新的特征集进行新的一轮训练。通过多轮迭代,逐步优化特征子集,最终保留对模型性能贡献最大的特征。

递归特征消除法通过逐步消除特征的方式,能够在保证模型性能的同时,降低模型的复杂度,提高计算效率。

两者的主要区别在于它们的操作方式和目标。

基于模型的特征选择法更注重于通过模型的训练结果来评估特征的重要性,并选择出最优的特征子集;

而递归特征消除法则更侧重于通过多轮训练逐步消除不重要的特征,以优化特征子集。

此外,递归特征消除法通常需要指定要保留的特征数量或设置停止条件,而基于模型的特征选择法则可以根据模型的性能来自动选择特征。

在实际应用中,选择哪种方法取决于具体的问题和数据集。

基于模型的特征选择法可能更适合于需要充分考虑特征之间相互作用和依赖关系的场景,而递归特征消除法则可能更适合于需要降低模型复杂度或提高计算效率的场景。

同时,我们也可以尝试结合使用这两种方法,以获得更好的特征选择效果。

二 具体步骤

流程图

各个步骤介绍如下:

2.1 数据准备:

首先,准备好数据集,并对其进行必要的预处理,如数据清洗、缺失值处理、归一化等。

2.2 选择初始特征集:

根据问题的性质和数据的特性,可以选择一个初始的特征子集作为起点。

这个子集可以是全部特征,也可以是基于某种初步判断选择的一部分特征。

2.3 选择模型:

根据问题的类型(如分类、回归等)和数据的特点,选择一个合适的机器学习模型作为特征选择的基础。

这个模型可以是决策树、随机森林、支持向量机等。

2.4 模型训练与评估:

使用初始特征集训练模型,并对模型进行评估。

评估通常基于模型的性能指标,如准确率、召回率、F1值等。

2.5 特征重要性评估:

基于模型的训练结果,评估每个特征的重要性。

这可以通过查看模型学习到的特征权重、特征对模型性能的影响程度等方式来实现。

2.6 选择新的特征子集:

根据特征重要性的评估结果,选择一个新的特征子集。

这可以通过删除一些重要性较低的特征,或者添加一些之前未考虑但可能重要的特征来实现。

2.7 迭代与优化:

重复步骤4到6,使用新的特征子集重新训练模型,并评估模型的性能。

通过多次迭代,不断优化特征子集,直到达到满意的性能或满足停止条件(如达到预设的最大迭代次数)。

2.8 确定最终特征集:

经过多次迭代和优化后,选择出最终的特征子集。

这个子集应该是对模型性能贡献最大、最能代表数据特性的特征集合。

需要注意的是,基于模型的特征选择法是一个迭代优化的过程,需要多次尝试和调整才能找到最优的特征子集。

同时,该方法的结果也受到所选模型的影响,不同的模型可能对特征的选择有不同的偏好。

因此,在实际应用中,需要结合具体的问题和数据集,选择合适的模型和特征选择方法。

三 优缺点以及适用场景

3.1 优点:

1 针对性强:

基于模型的特征选择法不是简单基于统计相关性或单个特征的表现来选择特征,而是直接针对给定的学习器进行优化,使得选出的特征子集更适应特定的模型。

2 性能提升:

由于考虑了特征之间的相互作用和整体效果,基于模型的特征选择法通常能够选择出更能提升模型性能的特征组合。

3.2 缺点:

1 计算开销大:

由于每次特征选择都需要重新训练模型来评估特征的重要性,因此基于模型的特征选择法的计算开销通常较大,尤其是在处理大规模数据集或复杂模型时。

2 可能过拟合:

由于是基于特定模型的训练结果来选择特征,如果模型本身存在过拟合问题,那么选出的特征子集也可能受到过拟合的影响。

3.3 适用场景:

1 对模型性能要求高:

当需要构建高性能的机器学习模型时,基于模型的特征选择法可以通过优化特征子集来提高模型的性能。

2 特征间存在复杂关系:

当特征之间存在复杂的相互作用和依赖关系时,基于模型的特征选择法能够更好地捕捉到这些关系,从而选择出更有意义的特征。

3 有足够的计算资源:

由于基于模型的特征选择法计算开销较大,因此适用于有足够计算资源的场景,如云计算环境或高性能计算集群。

需要注意的是,基于模型的特征选择法虽然具有诸多优点,但并非所有情况下都是最优选择。

在实际应用中,应根据问题的性质、数据的特性以及计算资源的限制,选择合适的特征选择方法。此外,还可以考虑结合其他特征选择方法(如过滤式特征选择、嵌入式特征选择等),以获得更好的特征选择效果。

四 代码示例及分析

1 导入必要的库

import numpy as np    
from sklearn.datasets import load_iris    
from sklearn.model_selection import train_test_split    
from sklearn.ensemble import RandomForestClassifier    
from sklearn.feature_selection import SelectFromModel    
from sklearn.metrics import accuracy_score

分析:

numpy 是一个用于数值计算的库。

load_iris 是从 sklearn.datasets 中导入的,用于加载鸢尾花数据集。

train_test_split 用于划分数据集为训练集和测试集。

RandomForestClassifier 是随机森林分类器。

SelectFromModel 用于根据模型的特征重要性选择特征。

accuracy_score 用于计算模型的准确率。

2 加载数据集

iris = load_iris()    
X = iris.data    
y = iris.target

分析:

使用 load_iris() 加载鸢尾花数据集。

X 是数据集中的特征。

y 是数据集中的目标变量(即花的种类)。

3 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X,
 y, test_size=0.2, random_state=42)

分析:

使用 train_test_split 函数将数据集划分为训练集和测试集。

test_size=0.2 表示测试集占总数据的 20%。

random_state=42 确保每次划分结果一致。

4 初始化随机森林分类器

clf = RandomForestClassifier(n_estimators=100, 
random_state=0, n_jobs=-1)

分析:

创建一个随机森林分类器对象。

n_estimators=100 指定了树的数量。

random_state=0 设置随机种子。

n_jobs=-1 表示使用所有可用的CPU核心。

5 训练模型

clf.fit(X_train, y_train)

分析:

使用训练集的特征 X_train 和目标变量 y_train 来训练随机森林模型。

6 获取特征重要性

importances = clf.feature_importances_

分析:

获取每个特征的重要性分数。

7 打印特征重要性

print("Feature importances:", importances)

分析:

打印出每个特征的重要性分数。

8 使用SelectFromModel选择特征

sfm = SelectFromModel(clf, threshold='median')    
X_important_train = sfm.fit_transform(X_train, y_train)

分析:

创建一个 SelectFromModel 对象,使用中位数作为阈值来选择特征。

使用训练集对 SelectFromModel 对象进行拟合,并转换特征,得到筛选后的训练集特征。

9 使用选定的特征子集训练模型

clf_important = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)    
clf_important.fit(X_important_train, y_train)

分析:

创建一个新的随机森林分类器对象,用于在筛选后的特征子集上进行训练。

使用筛选后的训练集特征 X_important_train 和目标变量 y_train 来训练新的随机森林模型。

10 使用测试集进行预测

y_pred_important = clf_important.predict(sfm.transform(X_test))

分析:

使用筛选后的测试集特征对新的随机森林模型进行预测,得到预测结果。

11 计算准确率

accuracy = accuracy_score(y_test, y_pred_important)    
 print(f"Accuracy with important features: {accuracy}")

分析:

计算预测结果 y_pred_important 与真实目标变量 y_test 之间的准确率。 打印出使用重要特征进行预测后的模型准确率。

完整代码:

import numpy as np  
from sklearn.datasets import load_iris  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.feature_selection import SelectFromModel  
from sklearn.metrics import accuracy_score  
  
# 加载数据集  
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)  
  
# 初始化随机森林分类器  
clf = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
  
# 训练模型  
clf.fit(X_train, y_train)  
  
# 获取特征重要性  
importances = clf.feature_importances_  
  
# 打印特征重要性  
print("Feature importances:", importances)  
  
# 使用SelectFromModel选择特征  
sfm = SelectFromModel(clf, threshold='median')  # 使用中位数作为阈值选择特征  
X_important_train = sfm.fit_transform(X_train, y_train)  
  
# 使用选定的特征子集训练模型  
clf_important = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
clf_important.fit(X_important_train, y_train)  
  
# 使用测试集进行预测  
y_pred_important = clf_important.predict(sfm.transform(X_test))  
  
# 计算准确率  
accuracy = accuracy_score(y_test, y_pred_important)  
print(f"Accuracy with important features: {accuracy}")

上面的代码只进行了一次特征选择。它使用随机森林的特征重要性得分,并通过SelectFromModel类基于阈值选择特征。如果你想进行多次特征选择,你可以通过调整阈值来多次运行这个过程。

示例

import numpy as np  
from sklearn.datasets import load_iris  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.feature_selection import SelectFromModel  
from sklearn.metrics import accuracy_score  
  
# 加载数据集  
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)  
  
# 初始化随机森林分类器  
clf = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
  
# 训练随机森林模型  
clf.fit(X_train, y_train)  
  
# 获取特征重要性  
importances = clf.feature_importances_  
  
# 设定多次特征选择的阈值列表,这里使用特征重要性得分的不同百分比作为阈值  
thresholds = [np.mean(importances), np.median(importances), np.max(importances) * 0.5]  
  
# 存储每次特征选择后的特征数量和对应的模型精度  
selected_feature_counts = []  
accuracies = []  
  
# 进行多次特征选择  
for threshold in thresholds:  
    # 使用SelectFromModel进行特征选择  
    sfm = SelectFromModel(clf, threshold=threshold)  
    X_train_reduced = sfm.fit_transform(X_train, y_train)  
    X_test_reduced = sfm.transform(X_test)  
      
    # 记录选择的特征数量  
    selected_feature_counts.append(X_train_reduced.shape[1])  
      
    # 使用选定的特征子集训练新的模型  
    clf_reduced = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
    clf_reduced.fit(X_train_reduced, y_train)  
      
    # 使用测试集进行预测  
    y_pred_reduced = clf_reduced.predict(X_test_reduced)  
      
    # 计算准确率并存储  
    accuracy = accuracy_score(y_test, y_pred_reduced)  
    accuracies.append(accuracy)  
      
    print(f"Threshold: {threshold}, Selected features: {X_train_reduced.shape[1]}, Accuracy: {accuracy}")  
  
# 打印最终的特征选择结果和对应的模型精度  
print("Final selected feature counts:", selected_feature_counts)  
print("Final accuracies:", accuracies)

在这个例子中,我们定义了一个阈值列表thresholds,其中包含不同的特征重要性得分百分比。然后,我们遍历这个列表,每次使用一个阈值来执行特征选择,并训练一个新的模型来评估性能。最后,我们打印出每次特征选择后选择的特征数量和对应的模型准确率。

这样,你就可以观察到随着阈值的变化,选择的特征数量和模型性能是如何变化的。

请注意,这种方法仍然只执行了一次特征选择过程针对每个阈值,但你可以通过增加更多的阈值或采用其他策略(如递归特征消除)来进一步细化特征选择过程。

总结

通过本文的介绍,我们深入了解了基于模型的特征选择法的原理、步骤、优缺点及适用场景。

这种方法通过利用机器学习模型自身的性能来评估特征的重要性,不仅可以帮助我们筛选出最具代表性的特征,还可以提高模型的性能和效率。

同时,我们也看到了这种方法的局限性,例如计算量大、对模型的选择敏感等。

因此,在实际应用中,我们需要根据具体情况选择是否采用这种方法,以及如何结合其他特征选择方法进行优化。

此外,本文还通过具体的代码示例分析了基于模型的特征选择法的实际应用效果,让读者更加直观地理解了这种方法的具体操作步骤和可能遇到的问题。

总的来说,基于模型的特征选择法是一种强大而灵活的特征选择方法,值得我们进一步学习和探索。

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

相关文章
|
2月前
|
机器学习/深度学习 人工智能 JSON
【解决方案】DistilQwen2.5-R1蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式的机器学习和深度学习平台,对DistilQwen2.5-R1模型系列提供了全面的技术支持。无论是开发者还是企业客户,都可以通过 PAI-ModelGallery 轻松实现 Qwen2.5 系列模型的训练、评测、压缩和快速部署。本文详细介绍在 PAI 平台使用 DistilQwen2.5-R1 蒸馏模型的全链路最佳实践。
|
1月前
|
人工智能 JSON 算法
【解决方案】DistilQwen2.5-DS3-0324蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践
DistilQwen 系列是阿里云人工智能平台 PAI 推出的蒸馏语言模型系列,包括 DistilQwen2、DistilQwen2.5、DistilQwen2.5-R1 等。本文详细介绍DistilQwen2.5-DS3-0324蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践。
|
2月前
|
人工智能 运维 API
PAI-Model Gallery云上一键部署阶跃星辰新模型Step1X-Edit
4月27日,阶跃星辰正式发布并开源图像编辑大模型 Step1X-Edit,性能达到开源 SOTA。Step1X-Edit模型总参数量为19B,实现 MLLM 与 DiT 的深度融合,在编辑精度与图像保真度上实现大幅提升,具备语义精准解析、身份一致性保持、高精度区域级控制三项关键能力;支持文字替换、风格迁移等11 类高频图像编辑任务类型。在最新发布的图像编辑基准 GEdit-Bench 中,Step1X-Edit 在语义一致性、图像质量与综合得分三项指标上全面领先现有开源模型,比肩 GPT-4o 与 Gemin。PAI-ModelGallery 支持Step1X-Edit一键部署方案。
|
2月前
|
人工智能 算法 网络安全
基于PAI+专属网关+私网连接:构建全链路Deepseek云上私有化部署与模型调用架构
本文介绍了阿里云通过PAI+专属网关+私网连接方案,帮助企业实现DeepSeek-R1模型的私有化部署。方案解决了算力成本高、资源紧张、部署复杂和数据安全等问题,支持全链路零公网暴露及全球低延迟算力网络,最终实现技术可控、成本优化与安全可靠的AI部署路径,满足企业全球化业务需求。
|
5月前
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
253 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
1月前
|
缓存 并行计算 测试技术
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
259 11
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
3月前
|
人工智能 自然语言处理 运维
【新模型速递】PAI一键云上零门槛部署DeepSeek-V3-0324、Qwen2.5-VL-32B
PAI-Model Gallery 集成国内外 AI 开源社区中优质的预训练模型,涵盖了 LLM、AIGC、CV、NLP 等各个领域,用户可以通过 PAI 以零代码方式实现从训练到部署再到推理的全过程,获得更快、更高效、更便捷的 AI 开发和应用体验。 现阿里云PAI-Model Gallery已同步接入DeepSeek-V3-0324、Qwen2.5-VL-32B-Instruct两大新模型,提供企业级部署方案。
|
2月前
|
人工智能 自然语言处理 运维
Qwen3 全尺寸模型支持通过阿里云PAI-ModelGallery 一键部署
Qwen3 是 Qwen 系列最新一代的大语言模型,提供了一系列密集(Dense)和混合专家(MOE)模型。目前,PAI 已经支持 Qwen3 全系列模型一键部署,用户可以通过 PAI-Model Gallery 快速开箱!
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
128 6

热门文章

最新文章