信息发布→ 登录 注册 退出

使用BorutaPy进行特征选择并输出带标题的Pandas DataFrame

发布时间:2025-11-05

点击量:

使用BorutaPy进行特征选择并输出带标题的Pandas DataFrame

本教程详细介绍了如何利用borutapy库进行稳健的特征选择,并将筛选后的特征及其原始列标题准确地重构为pandas dataframe。文章将提供两种主要方法:通过布尔掩码手动构建dataframe,以及利用borutapy新版本中`transform`方法的`return_df`参数直接获取带标题的dataframe,确保数据处理的便捷性和可读性。

引言:BorutaPy与特征选择

特征选择是机器学习流程中至关重要的一步,它有助于减少模型复杂度、提高泛化能力并加快训练速度。BorutaPy是一个基于随机森林的特征选择算法,它通过迭代地将原始特征与随机创建的“影子特征”进行比较,从而识别出所有相关特征。其独特的优势在于能够找到所有与目标变量具有统计学意义的特征,而不仅仅是那些“最佳”特征。

在BorutaPy完成特征选择后,通常需要将筛选出的特征重新组织成一个带有原始列标题的Pandas DataFrame,以便于后续的数据分析和模型构建。本文将详细介绍如何实现这一目标。

BorutaPy基础用法

首先,我们回顾一下BorutaPy进行特征选择的基本流程。这通常涉及初始化一个基线模型(如RandomForestRegressor),然后将其传递给BorutaPy实例进行训练。

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from boruta import BorutaPy

# 假设 X 是特征DataFrame,y 是目标变量Series
# 为了演示,我们先创建一些示例数据
np.random.seed(42)
data_size = 100
X = pd.DataFrame(np.random.rand(data_size, 10), columns=[f'Feature_{i}' for i in range(10)])
# 假设 'Feature_0', 'Feature_2', 'Feature_5' 是相关特征
y = X['Feature_0'] * 2 + X['Feature_2'] * 3 - X['Feature_5'] * 0.5 + np.random.randn(data_size) * 0.1

# 初始化基线模型
model = RandomForestRegressor(n_estimators=100, max_depth=5, random_state=42)

# 初始化Boruta特征选择器
feat_selector = BorutaPy(
    verbose=2, # 详细输出模式
    estimator=model,
    n_estimators='auto',
    max_iter=50, # 迭代次数
    random_state=42,
)

# 训练Boruta。注意:BorutaPy的fit方法通常期望numpy数组作为输入
feat_selector.fit(X.values, y.values)

# 打印每个特征的支持度和排名
print("\n------Support and Ranking for each feature------\n")
for i in range(len(feat_selector.support_)):
    if feat_selector.support_[i]:
        print(f"Passes the test: {X.columns[i]} - Ranking: {feat_selector.ranking_[i]} ✔️")
    else:
        print(f"Doesn't pass the test: {X.columns[i]} - Ranking: {feat_selector.ranking_[i]} ❌")

# 获取筛选后的特征数组
X_filtered_array = feat_selector.transform(X.values)

feat_selector.support_是一个布尔数组,指示每个原始特征是否被BorutaPy选中。feat_selector.transform()方法返回一个包含所有被选特征的NumPy数组,但它不包含列标题信息。

将筛选结果重构为带标题的DataFrame

BorutaPy的transform方法默认返回一个NumPy数组,这在许多情况下是足够的。然而,为了保持数据的可读性和易用性,将其转换回带有原始列标题的Pandas DataFrame是更佳实践。下面介绍两种实现方法。

方法一:利用布尔掩码手动构建DataFrame

这是最通用且兼容所有BorutaPy版本的方法。feat_selector.support_属性是一个布尔数组,其长度与原始特征数量相同,True表示该特征被选中,False表示未被选中。我们可以利用这个布尔掩码来选择原始DataFrame的列标题,并结合transform方法的输出数据来构建新的DataFrame。

VALL-E VALL-E

VALL-E是一种用于文本到语音生成 (TTS) 的语言建模方法

VALL-E 134 查看详情 VALL-E
# 步骤1:获取被选中的特征列名
selected_feature_names = X.columns[feat_selector.support_]

# 步骤2:使用transform方法获取筛选后的特征数据(NumPy数组)
# 注意:transform方法也期望NumPy数组作为输入
X_filtered_data = feat_selector.transform(X.values)

# 步骤3:将数据和列名组合成一个新的Pandas DataFrame
X_filtered_df_method1 = pd.DataFrame(X_filtered_data, columns=selected_feature_names)

print("\n--- Method 1: Manually Constructed DataFrame ---")
print(X_filtered_df_method1.head())
print(f"Shape of X_filtered_df_method1: {X_filtered_df_method1.shape}")

解释:

  • X.columns[feat_selector.support_]:这行代码利用布尔索引从原始DataFrame X 的列名中筛选出所有被BorutaPy选中的特征名称。
  • pd.DataFrame(X_filtered_data, columns=selected_feature_names):pd.DataFrame构造函数接受数据(X_filtered_data)和列名列表(selected_feature_names),从而创建出一个结构完整、带有正确标题的DataFrame。

方法二:使用 return_df=True 参数 (推荐)

BorutaPy的最新版本(通常是boruta-py的master分支或较新发布的版本)在transform方法中引入了一个方便的return_df参数。当设置为True时,transform方法将直接返回一个带有正确列标题的Pandas DataFrame,极大地简化了操作。

# 注意:此方法要求BorutaPy库版本支持 `return_df=True` 参数。
# 建议通过 `pip install boruta-py --upgrade` 更新到最新版本。

try:
    # 尝试使用 return_df=True 参数
    X_filtered_df_method2 = feat_selector.transform(X, return_df=True)
    print("\n--- Method 2: Using return_df=True ---")
    print(X_filtered_df_method2.head())
    print(f"Shape of X_filtered_df_method2: {X_filtered_df_method2.shape}")
except TypeError as e:
    print(f"\n--- Method 2: Not *ailable ---")
    print(f"Error: {e}. Your BorutaPy version might not support `return_df=True`.")
    print("Please consider updating BorutaPy (`pip install boruta-py --upgrade`) or use Method 1.")

注意事项:

  • 版本依赖: return_df=True 参数并非在所有BorutaPy版本中都可用。如果您的代码运行报错(通常是TypeError,提示transform方法没有return_df参数),则说明您的BorutaPy版本较旧。您可以通过pip install boruta-py --upgrade命令尝试更新库。
  • 输入类型: 当使用return_df=True时,transform方法可以直接接受Pandas DataFrame作为输入(X),而无需手动转换为NumPy数组(X.values)。这进一步简化了代码。

总结与最佳实践

将BorutaPy筛选后的特征重构为带标题的Pandas DataFrame是数据处理中常见的需求。

  • 对于所有BorutaPy版本,通过feat_selector.support_布尔掩码手动选择原始列名并结合feat_selector.transform(X.values)的输出来构建DataFrame是一种可靠的方法。
  • 对于最新版本的BorutaPy,推荐使用feat_selector.transform(X, return_df=True)。这种方法更加简洁高效,直接返回所需的DataFrame,减少了手动操作的复杂性。

在实际应用中,始终建议检查您所使用的库版本,以充分利用其提供的最新功能。如果return_df=True可用,它无疑是更优的选择。如果不可用,手动构建DataFrame的方法同样能够实现您的目标,并且兼容性更广。

以上就是使用BorutaPy进行特征选择并输出带标题的Pandas DataFrame的详细内容,更多请关注其它相关文章!


相关文章: 在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  大麦的“候补”是什么意思 大麦候补购票规则【详解】  内存检查:在VS Code中调试C++时的内存视图  PHP:根据嵌套关联数组项值动态添加新键值对  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  深入理解与实现最大堆的Heapify过程:常见错误与修正  PHP 枚举:根据字符串获取枚举案例的策略与实现  PHP面向对象编程中避免重复创建PDO数据库连接的最佳实践  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  在VS Code中配置和运行Dart程序的完整步骤  火锅吃太多会怎样 火锅吃太多会上火吗  PHP教程:将数据库查询结果动态展示到HTML Textarea的最佳实践  离线运行Go语言之旅:本地部署与GOPATH配置指南  J*a应用集成GitHub CLI与API认证指南  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  Kafka Streams中基于消息头条件过滤消息的实现指南  C++如何生成随机数_C++ random库使用方法与范围设置  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  如何仅使用CSS更改登录界面背景图像图标的颜色  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  Go语言中的*string:深入理解字符串指针  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  C++如何跨平台操作文件和目录_C++17标准库std::filesystem的使用教程  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  J*aScript实现单选按钮与关联输入框的联动禁用教程  J*a递归快速排序中静态变量的状态管理与陷阱  邮政快递包裹最新位置 邮政快递实时追踪入口  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  Mac怎么使用表情符号_Mac Emoji快捷键面板  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  poki网页游戏推荐_poki免费游戏平台入口  知音漫客官网漫画下载_知音漫客网页版阅读记录  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落  Golang如何使用context实现超时取消_Golang context超时取消模式实践  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!