掘金 人工智能 06月03日 10:38
机器学习中的"食材挑选术":特征选择方法
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了机器学习中的特征选择技术,如同厨师挑选食材般,旨在从原始数据中筛选出对预测目标最有用的特征。文章详细介绍了过滤式、包裹式和嵌入式三种主要特征选择方法,分析了它们的优缺点和适用场景,并通过代码示例展示了如何在实际应用中使用这些方法,从而提高模型性能、加快训练速度、降低过拟合风险和提升可解释性。特征选择是机器学习中一个不可或缺的环节。

🔍 **特征选择的本质:** 特征选择是从原始数据中挑选出对模型预测最有用的特征,类似于挑选优质食材。其主要目的是提高模型性能、加快训练速度、降低过拟合风险以及提升模型的可解释性。

⚙️ **过滤式方法:** 这种方法独立于模型,通过特征本身的统计特性进行评估和筛选,例如方差阈值、卡方检验和相关系数。它的优点是计算效率高,但可能忽略特征与模型之间的关系。

🎁 **包裹式方法:** 这种方法将特征子集作为“衣服”让模型“试穿”,根据模型表现来决定特征组合。递归特征消除(RFE)是常见方法。它直接考虑模型性能,但计算开销较大,容易过拟合。

💡 **嵌入式方法:** 这种方法在模型训练过程中内置“挑食”机制,例如L1正则化和树模型中的特征重要性。它计算效率较高,但需要模型本身支持特征选择。

想象你要做一道美食,面对琳琅满目的食材,优秀的厨师不会把所有原料都扔进锅里,而是会选择最适合的几种。

在机器学习中,特征选择就是这个挑选过程,从原始数据中选择对预测目标最有用的特征(列),就像挑选优质食材一样重要。

1. 什么是特征选择?

特征选择是机器学习中一个至关重要的步骤,它从原始数据的众多特征中挑选出对模型最有价值的子集。

简单来说,就是从一堆可能影响结果的因素中,找出那些真正重要的因素,把不重要的、重复的或者有干扰的特征去掉。

为什么要做特征选择呢?主要有以下几个原因:

2. 三大特征选择方法

根据特征选择模型训练过程的关系,主要可以分为以下三类方法:

2.1. 过滤式:先"筛"后"用"

过滤式方法就像用筛子筛沙子一样,先根据特征本身的统计特性对特征进行评估和筛选,然后再把选出来的特征交给模型使用。

这个过程完全独立于机器学习模型。

常见的过滤式方法包括:

下面的代码演示如何使用过滤式方法来进行特征选择,使用卡方检验SelectBest):

from sklearn.datasets import load_irisfrom sklearn.feature_selection import SelectKBest, f_classiffrom sklearn.model_selection import train_test_split# 加载数据集iris = load_iris()X, y = iris.data, iris.target# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建过滤式选择器,选择2个最佳特征selector = SelectKBest(score_func=f_classif, k=2)X_train_selected = selector.fit_transform(X_train, y_train)X_test_selected = selector.transform(X_test)# 查看选中的特征selected_features = selector.get_support(indices=True)print(f"选中的特征索引: {selected_features}")print(f"特征得分: {selector.scores_}")# 输出特征选择后的数据维度print(f"原始训练集特征数: {X_train.shape[1]}")print(f"选择后训练集特征数: {X_train_selected.shape[1]}")## 输出结果:'''选中的特征索引: [2 3]特征得分: [ 74.7572012   33.41979913 713.45534904 526.54162416]原始训练集特征数: 4选择后训练集特征数: 2'''

最后选择的特征是23,也就是后2个特征(特征索引是从0开始的)。

从特征得分来看看,后2个特征也是得分最高的。

2.2. 包裹式:带着模型一起选

包裹式方法就像带着模型去"试衣"一样,把特征子集当作不同的"衣服",让模型试穿(训练)后看看效果如何。

根据模型的表现(比如准确性)来决定哪些特征组合最好。

常见的包裹式方法包括:

下面的代码示例使用递归特征消除RFE):

from sklearn.feature_selection import RFEfrom sklearn.ensemble import RandomForestClassifier# 创建随机森林分类器model = RandomForestClassifier(random_state=42)# 创建递归特征消除选择器selector = RFE(model, n_features_to_select=2, step=1)selector = selector.fit(X_train, y_train)# 查看选中的特征selected_features = selector.get_support(indices=True)print(f"选中的特征: {selected_features}")print(f"特征排名: {selector.ranking_}")# 特征选择后的数据X_train_selected = selector.transform(X_train)X_test_selected = selector.transform(X_test)# 输出特征选择后的数据维度print(f"原始训练集特征数: {X_train.shape[1]}")print(f"选择后训练集特征数: {X_train_selected.shape[1]}")## 输出结果:'''选中的特征: [2 3]特征排名: [2 3 1 1]原始训练集特征数: 4选择后训练集特征数: 2'''

选择的特征也是23,从特征排名来看,前两个特征排名23后两个特征并列排名第一

2.3. 嵌入式:在模型里自然选择

嵌入式方法就像在模型里内置了一个"挑食"机制,让模型在训练过程中自然地倾向于使用某些特征,而忽略其他特征。

这种方法通常通过正则化来实现。

常见的嵌入式方法包括:

代码示例:

from sklearn.feature_selection import SelectFromModelfrom sklearn.linear_model import LassoCV# 创建带L1正则化的逻辑回归模型model = LassoCV(random_state=42)# 创建嵌入式选择器selector = SelectFromModel(model, threshold='median')selector = selector.fit(X_train, y_train)# 查看选中的特征selected_features = selector.get_support(indices=True)print(f"选中的特征: {selected_features}")# 特征选择后的数据X_train_selected = selector.transform(X_train)X_test_selected = selector.transform(X_test)# 输出特征选择后的数据维度print(f"原始训练集特征数: {X_train.shape[1]}")print(f"选择后训练集特征数: {X_train_selected.shape[1]}")## 输出结果:'''选中的特征: [2 3]原始训练集特征数: 4选择后训练集特征数: 2'''

同样,最终选择的特征也是23

3. 三种方法的对比

选择哪种特征选择方法,取决于你的具体需求和场景,下面是三种方法的比较:

方法类型优点缺点适用场景
过滤式计算效率高,不依赖模型可能忽略特征与模型的关系特征数量较少,对模型不敏感的情况
包裹式直接考虑模型性能,效果通常较好计算开销大,容易过拟合特征数量适中,对性能要求高的情况
嵌入式计算效率较高,考虑了特征与模型的关系通常需要模型本身支持特征选择需要模型具有稀疏性的情况

4. 总结

特征选择是机器学习流程中不可忽略的重要环节。

在实际应用中,我们可以尝试多种方法,观察它们对模型性能的影响,有时候,结合多种方法甚至能取得更好的效果。

记住,特征选择不是一成不变的规则,而是一门需要根据数据和模型不断调整的艺术。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

特征选择 机器学习 过滤式 包裹式 嵌入式
相关文章