高效特征选择:优化机器学习的嵌入式方法指南

news2024/12/1 14:29:00

高效特征选择:优化机器学习的嵌入式方法指南

文章目录

  • 一、说明
  • 二、特征选择方法
  • 三、嵌入式方法
  • 四、Lasso正则化
  • 五、Python 中的 Lasso 实现
  • 六、决策树的特征重要性
  • 七、Python 实现
  • 八、嵌入式方法和递归特征消除
  • 九、结论

一、说明

假设您正在处理一个大型数据集,并且想要训练一个机器学习算法。挑战在于决定从众多变量中应该考虑哪些特征来构建有效的模型。这就是特征选择发挥作用的地方,它使我们能够筛选数据混乱并创建更易于解释和更强大的模型。

特征选择包括从数据集中选择一组特征来训练机器学习算法。特征选择过程的目的是减少特征数量,从而提高可解释性和模型的弹性。

特征选择方法可以分为三类:过滤方法、包装方法和嵌入方法。

二、特征选择方法

过滤方法是一种与模型无关的特征选择技术,它根据数据的特征选择特征,与机器学习模型无关。它们的计算成本最低,包括卡方检验和皮尔逊相关系数等。

包装器方法是一种围绕预测模型进行搜索的特征选择算法。它们生成多个特征子集,在每个子集上训练分类或回归模型(迭代),并确定其性能。

包装方法的计算成本最高。包装方法的示例包括前向选择、后向消除和穷举搜索。

嵌入式方法将选择过程“嵌入”到预测模型的训练中。对最佳特征子集的搜索内置于分类器或回归算法的训练中。因此,嵌入式方法仅训练一个机器学习模型来选择特征。它们的计算成本等于模型训练时间。

在这篇博文中,我们将重点介绍嵌入式方法。

在这里插入图片描述

三、嵌入式方法

嵌入式方法将选择“嵌入”到模型构建阶段。典型的嵌入式特征选择工作流程包括:

训练机器学习模型。
得出特征重要性。
选择排名靠前的预测变量。
最常见的嵌入策略是线性模型中的 Lasso 正则化和从决策树中的信息增益获得的特征重要性。

但请注意,并非所有机器学习模型都能自然地嵌入特征选择过程。例如,支持向量机 (svm) 就不能。

四、Lasso正则化

线性回归模型根据特征空间的线性组合来预测结果。系数是通过最小化目标的实际值和预测值之间的平方差来确定的。

主要有三种正则化程序:Ridge正则化、Lasso正则化,以及结合前两者的弹性网络。

在 Lasso 回归中,系数会以给定的常数缩小。在 Ridge 回归中,系数的平方会受到一个常数的惩罚。缩小系数的目的是为了减少偏差并防止过拟合。最佳常数需要通过超参数优化来估计。

事实证明,Lasso 正则化能够将某些系数设置为零。然后,我们可以安全地从数据中删除这些特征。

在下图中,我们可以看到随着正则化惩罚的增加,系数的变化。随着惩罚的增加,越来越多的系数被设置为零。
在这里插入图片描述
相比之下,Ridge 正则化不具备该属性,或者至少在惩罚非常大之前不具备该属性,如下图所示:
在这里插入图片描述

更强的正则化可以带来更大的维数降低。

五、Python 中的 Lasso 实现

让我们看看如何使用 Python 中的 Lasso 选择相关特征。让我们导入库、函数和类:

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

让我们从 Scikit-learn 导入乳腺癌数据集并将其分成训练集和测试集:

breast_cancer = load_breast_cancer()
X = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
y = breast_cancer.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

让我们设置一个缩放器来标准化特征:

scaler = StandardScaler()
scaler.fit(X_train)

接下来,我们将利用带有 Lasso 正则化的逻辑回归来选择特征:

sel_ = SelectFromModel(
    LogisticRegression(
        C=0.5, penalty='l1', solver='liblinear', random_state=10),
    )
sel_.fit(scaler.transform(X_train), y_train)

通过执行,sel_.get_support()我们获得一个布尔向量,其中具有非零系数的特征为 True:

array([False, True, False, False, False, False, False, True, True,
False, True, False, False, False, False, True, False, False,
False, True, True, True, True, True, True, False, True,
True, True, False])

我们可以像这样识别已删除功能的名称:

removed_feats = X_train.columns[(sel_.estimator_.coef_ == 0).ravel().tolist()]

如果我们执行,removed_feats我们将获得以下包含将被删除的特征的数组:

Index(['mean radius', 'mean perimeter', 'mean area', 'mean smoothness',
'mean compactness', 'mean concavity', 'mean fractal dimension',
'texture error', 'perimeter error', 'area error', 'smoothness error',
'concavity error', 'concave points error', 'symmetry error',
'worst compactness', 'worst fractal dimension'],
dtype='object')

我们可以像这样从训练和测试集中删除这些特征:

X_train_selected = sel_.transform(scaler.transform(X_train))
X_test_selected = sel_.transform(scaler.transform(X_test))

如果我们现在执行:

X_train_selected.shape, X_test_selected.shape

我们获得了缩减后的数据集的形状:

((426, 14), (143, 14))

六、决策树的特征重要性

决策树算法通过对数据进行连续分区来预测结果。在每个节点上,选择一个特征和一个值来进行分区。最好的分区是最大限度地减少杂质的分区。

有多种指标可用于确定“杂质”。在分类中,算法会最小化基尼系数或熵。在回归中,算法会最小化均方误差(如最小二乘法)、平均绝对误差或泊松偏差。

每个特征的重要性由整个树中杂质的总减少量决定。例如,如果某个特征用于划分节点 1 中的数据,然后又用于划分节点 3 中的数据,则该特征的重要性由两个节点的杂质减少量之和决定。

随机森林会同时生长出许多分类树,预测结果为各个分类树的平均值。因此,特征重要性由各个分类树的平均重要性决定。

相反,梯度提升机(如 xgboost)会构建顺序树,以最小化树的预测与前一棵树的残差之间的差异。这里,特征重要性是树间重要性的总和。

然后我们可以选择最重要的特征。

七、Python 实现

让我们从基于决策树的模型中选择最重要的特征。我们将使用随机森林和乳腺癌数据集。

让我们首先导入库、函数和类:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.model_selection import train_test_split

让我们加载数据集并将其分成训练集和测试集:

breast_cancer = load_breast_cancer()
X = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
y = breast_cancer.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

让我们根据随机森林分类器得出的重要性来选择特征:

sel_ = SelectFromModel(RandomForestClassifier(n_estimators=10, random_state=10))
sel_.fit(X_train, y_train)

SelectFromModel将选择重要性大于所有特征平均重要性的特征。这可以通过参数 进行修改threshold。

我们sel_.get_support()获得一个True表示所选特征的布尔向量:

array([ True, False, False, True, False, False, True, True, False,
False, True, False, False, False, False, False, False, False,
False, False, False, False, True, True, False, False, False,
True, False, False])

我们可以将选定的特征列出如下列表:

selected_feat = X_train.columns[(sel_.get_support())]

通过执行len(selected_feat)我们获得所选特征的数量:8。通过执行selected_feat我们获得所选变量的名称:

Index(['mean radius', 'mean area', 'mean concavity', 'mean concave points',
'radius error', 'worst perimeter', 'worst area',
'worst concave points'],
dtype='object')

让我们绘制特征重要性:

pd.Series(
    sel_.estimator_.feature_importances_.ravel(),
    index=X_train.columns).plot.bar(figsize=(10,5),
)
plt.ylabel('Feature importance')
plt.show()

下面我们看到随机森林赋予每个特征的重要性:

最后,我们可以将数据集缩减为选定的变量:

X_train_selected = sel_.transform(X_train) 
X_test_selected = sel_.transform(X_test)

就是这样,我们现在已经根据从决策树获得的重要性选择了特征。
在这里插入图片描述

八、嵌入式方法和递归特征消除

线性回归或决策树得出的重要性受相关性影响。共线性通常会降低重要性值。因此,为了避免删除相关特征(这些特征可能比与其他任何特征无关的其他特征更重要),我们倾向于将嵌入式方法与递归特征消除相结合。

在递归特征消除中,我们在删除一个或多个不相关的特征后重新训练模型,因此,如果删除了相关特征,剩下的相关特征将显示出更大的重要性。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFE
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

# Load iris dataset
url = "https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/0e7a9b0a5d22642a06d3d5b9bcbad9890c8ee534/iris.csv"
df = pd.read_csv(url)

# Separate features and target variable
X = df.drop("species", axis=1)
y = df["species"]

# Initialize RandomForestClassifier
model = RandomForestClassifier()

# Initialize RFE
rfe = RFE(estimator=model, n_features_to_select=1)

# Fit RFE
rfe.fit(X, y)

# Print the ranking
ranking = rfe.ranking_
print("Feature ranking:")

for i, feature in enumerate(X.columns):
    print(f"{feature}: {ranking[i]}")

输出:

特征排名:
sepal_length: 3
sepal_width: 4
petal_length: 2
petal_width: 1

九、结论

总之,嵌入式方法提供了一种强大而有效的特征选择方法,将选择过程无缝集成到模型训练本身中。与包装器方法相比,这不仅降低了计算复杂性,而且还确保了特征选择本质上与模型的预测能力保持一致。诸如线性模型的 Lasso 正则化和基于树的方法中的特征重要性等技术使我们能够识别并仅保留最相关的特征,从而提高模型性能和可解释性。

然而,必须考虑共线性等潜在缺陷,因为共线性可能会掩盖某些特征的重要性。将嵌入式方法与递归特征消除相结合可以缓解此问题,从而提供更全面的特征选择过程。通过采用这些方法,您可以构建更高效、可扩展且准确的机器学习模型,同时保持特征空间的简单性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构:MVVM

引言 MVVM 全称 Model-View-ViewModel,是在 MVP(Model-View-Presenter)架构模式基础上的进一步演进与优化。MVVM 与 MVP 的基本架构相似,但 MVVM 独特地引入了数据双向绑定机制。这一创新机制有效解决了 MVP 模式中 Model 与 Vie…

家校通小程序实战教程04教师管理

目录 1 创建数据源2 搭建管理后台3 搭建查询条件4 功能测试总结 我们上一篇介绍了如何将学生加入班级,学生加入之后就需要教师加入了。教师分为任课老师和班主任,班主任相当于一个班级的管理员,日常可以发布各种任务,发布接龙&…

cesium 3Dtiles变量

原本有一个变亮的属性luminanceAtZenith,但是新版本的cesium没有这个属性了。于是 let lightColor 3.0result._customShader new this.ffCesium.Cesium.CustomShader({fragmentShaderText:void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial mate…

SpringBoot小知识(3):热部署知识

一、热部署 热部署是一个非常消耗内存的机制,在实际大型项目开发中几乎用不到,只有小型项目或者分模块或者不停机更新的时候才会用到,仁者见仁智者见智。 1.1 什么是热部署? 热部署是指在不停止应用程序或服务器的情况下&#xf…

vscode切换anaconda虚拟环境解释器不成功

问题: 切换解释器之后运行代码还是使用的原来的解释器 可以看到,我已经切换了“nlp”解释器,我的nltk包只在“nlp”环境下安装了,但是运行代码依然是"torch"解释器,所以找不到“nltk”包。 在网上找了各种…

widows下永久修改python的pip 配置文件

通过cmd永久修改pip 镜像源: 在cmd中输入: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple会在"C:\Users\Administrator\AppData\Roaming"目录下创建一个pip\pip.ini文件: 使用记事本打开pip.ini文件…

openssl使用哈希算法生成随机密钥

文章目录 一、openssl中随机数函数**OpenSSL 随机数函数概览**1. **核心随机数函数** **常用函数详解**1. RAND_bytes2. RAND_priv_bytes3. RAND_seed 和 RAND_add4. RAND_status **随机数生成器的熵池****常见用例****注意事项** 二、使用哈希算法生成随机的密钥 一、openssl中…

【Python网络爬虫笔记】6- 网络爬虫中的Requests库

一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求,如 GET、POST、PUT、DELETE 等,并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用,无论是简单的网页数…

pytest+allure生成报告显示loading和404

pytestallure执行测试脚本后,通常会在电脑的磁盘上建立一个临时文件夹,里面存放allure测试报告,但是这个测试报告index.html文件单独去打开,却显示loading和404, 这个时候就要用一些办法来解决这个报告显示的问题了。 用命令产生…

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…

【S500无人机】--地面端下载

之前国庆的时候导师批了无人机,我们几个也一起研究了几次,基本把无人机组装方面弄的差不多了,还差个相机搭载,今天我们讲无人机的调试 硬件配置如下 首先是地面端下载,大家可以选择下载: Mission Planne地…

CSAPP Cache Lab(缓存模拟器)

前言 理解高速缓存对 C 程序性能的影响,通过两部分实验达成:编写高速缓存模拟器;优化矩阵转置函数以减少高速缓存未命中次数。Part A一开始根本不知道要做什么,慢慢看官方文档,以及一些博客,和B站视频&…

Linux内核4.14版本——ccf时钟子系统(3)——ccf一些核心结构体

目录 1. struct clk_hw 2. struct clk_ops 3. struct clk_core 4. struct clk_notifier 5. struct clk 6. struct clk_gate 7. struct clk_divider 8. struct clk_mux 9. struct clk_fixed_factor 10. struct clk_fractional_divider 11. struct clk_multiplier 12…

点云处理中obb算法原理和法向量求解方法

主要数学原理PCA PCA(Principal Component Analysis,主成分分析)是数据分析中的一种重要技术,通过它可以将高维数据投影到低维空间,找到数据的主要结构。在点云分析中,PCA 可以帮助我们提取点云数据中的主…

shell编程7,bash解释器的 for循环+while循环

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

【人工智能】Python常用库-TensorFlow常用方法教程

TensorFlow 是一个广泛应用的开源深度学习框架,支持多种机器学习任务,如深度学习、神经网络、强化学习等。以下是 TensorFlow 的详细教程,涵盖基础使用方法和示例代码。 1. 安装与导入 安装 TensorFlow: pip install tensorflow…

wxFormBuilder:可视化设计、学习wxWidgets自带UI控件的好工具

wxFormBuilder很快就能拼出一个界面,而且可以直接出对应的代码,拷贝到项目里小改一下就能用。

Vim操作

1. Vim的模式 2.正常模式->编辑模式 在上⽅插⼊⼀⾏: O在下⽅插⼊⼀⾏: o (open)在当前光标前插⼊: i在⾏⾸插⼊: I在当前光标后插⼊: a在⾏尾插⼊: A 3.常见命令行 1、拷贝当前行 yy ,拷贝当前行向下…

阿里云服务器(centos7.6)部署前后端分离项目(MAC环境)

Jdk17安装部署 下载地址:https://www.oracle.com/java/technologies/downloads/ 选择自己需要的jdk版本进行下载。 通过mac终端scp命令上传下载好的jdk17到服务器的/usr/local目录下 scp -r Downloads/jdk-17.0.13_linux-x64_bin.tar.gz 用户名服务器ip地址:/us…

「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏

本篇将带你实现一个简单的数字猜谜游戏。用户输入一个数字,应用会判断是否接近目标数字,并提供提示“高一点”或“低一点”,直到用户猜中目标数字。这个小游戏结合状态管理和用户交互,是一个入门级的互动应用示例。 关键词 UI互…