Boruta特征选择结果在Pandas DataFrame中的处理与列名保留

DDD
发布: 2025-11-03 11:14:25
原创
206人浏览过

Boruta特征选择结果在Pandas DataFrame中的处理与列名保留

本文详细介绍了如何使用boruta算法进行特征选择,并重点阐述了如何将boruta筛选出的特征结果有效地整合到pandas dataframe中,同时保留原始的列名。文章提供了两种实现方法,包括手动利用布尔掩码进行索引以及使用boruta最新版本提供的`return_df=true`参数,旨在帮助用户清晰、便捷地管理特征选择后的数据。

Boruta特征选择算法概述

Boruta是一种基于随机森林的包装器(Wrapper)特征选择算法,其设计目标是识别数据集中所有与目标变量具有统计显著性关联的特征。它通过引入“影子特征”(原始特征的随机置乱副本)并迭代地比较原始特征与影子特征的重要性,从而提供一个稳健的特征子集。

在使用Boruta进行特征选择时,通常会遵循以下步骤:

  1. 初始化一个基准评估器(如 RandomForestRegressor 或 RandomForestClassifier)。
  2. 使用该评估器初始化 BorutaPy 实例。
  3. 调用 fit 方法训练Boruta,传入特征矩阵 X 和目标变量 y。需要注意的是,fit 方法通常期望 X 和 y 为NumPy数组。
  4. 训练完成后,feat_selector.support_ 会返回一个布尔数组,指示哪些特征被选中;feat_selector.ranking_ 则提供特征的重要性排名。

以下是Boruta算法的基本初始化和训练代码示例:

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

# 假设 X 是你的原始特征DataFrame,y 是目标变量
# 为了示例,我们创建一个虚拟的X和y
# X = pd.DataFrame(np.random.rand(100, 25), columns=[f'J{i}' for i in range(25)])
# y = pd.Series(np.random.rand(100))

# 确保 X 和 y 已经定义并准备好
# 例如:
# X = pd.read_csv('your_features.csv')
# y = pd.read_csv('your_target.csv').squeeze()

# 初始化随机森林回归模型作为Boruta的评估器
model = RandomForestRegressor(n_estimators=100, max_depth=5, random_state=42)

# 初始化Boruta特征选择器
feat_selector = BorutaPy(
    verbose=0, # 设置为0可减少输出,2可查看详细过程
    estimator=model,
    n_estimators='auto',
    max_iter=10,  # 迭代次数
    random_state=42,
)

# 训练Boruta
# 注意:fit方法通常期望NumPy数组作为输入
feat_selector.fit(np.array(X), np.array(y))

# 打印被Boruta选中的特征
print("Boruta特征选择结果:")
for i in range(len(feat_selector.support_)):
    status = "✔️ Pass" if feat_selector.support_[i] else "❌ Fail"
    print(f"特征: {X.columns[i]} - 排名: {feat_selector.ranking_[i]} - 状态: {status}")

# 使用 transform 方法获取筛选后的特征数据
# 此时,X_filtered 通常是一个NumPy数组,失去了原始的列名信息
X_filtered_numpy = feat_selector.transform(np.array(X))
print("\n筛选后的NumPy数组 (X_filtered_numpy) 的前5行:")
print(X_filtered_numpy[:5])
print(f"筛选后的特征数量: {X_filtered_numpy.shape[1]}")
登录后复制

上述代码中,feat_selector.transform(np.array(X)) 返回的是一个NumPy数组,虽然包含了精选的特征数据,但丢失了原始的列名信息。这在后续的数据分析和模型解释中会带来不便。接下来,我们将介绍如何将这些精选特征重新封装成带有原始列名的Pandas DataFrame。

在Pandas DataFrame中获取带列名的精选特征

将Boruta筛选出的特征(通常是一个NumPy数组)重新封装成一个Pandas DataFrame,并保留原始的列名,是数据预处理中非常重要的一步。这有助于保持数据的可读性和可解释性。这里提供两种实现方法。

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

feat_selector.support_ 是一个布尔数组,其长度与原始特征数量相同,其中 True 表示对应的特征被Boruta选中,False 则表示未被选中。我们可以利用这个布尔掩码从原始DataFrame X 的列名中选择出精选特征的列名,然后与 feat_selector.transform() 返回的NumPy数组结合,构建新的DataFrame。

NameGPT名称生成器
NameGPT名称生成器

免费AI公司名称生成器,AI在线生成企业名称,注册公司名称起名大全。

NameGPT名称生成器 0
查看详情 NameGPT名称生成器
# 方法一:利用布尔掩码手动构建DataFrame
# feat_selector.transform(X.values) 将原始DataFrame X 转换为NumPy数组进行转换
# X.columns[feat_selector.support_] 利用布尔掩码选择出被选中的列名
X_filtered_method1 = pd.DataFrame(
    feat_selector.transform(X.values), # 注意这里使用 X.values 将 DataFrame 转换为 NumPy 数组
    columns=X.columns[feat_selector.support_]
)

print("\n--- 方法一:手动构建DataFrame ---")
print("精选特征DataFrame (X_filtered_method1) 的前5行:")
print(X_filtered_method1.head())
print("\n精选特征DataFrame的列名:")
print(X_filtered_method1.columns)
print(f"精选特征数量: {X_filtered_method1.shape[1]}")
登录后复制

说明:

  • feat_selector.transform(X.values):虽然 fit 阶段要求NumPy数组,但 transform 方法也可以直接接受DataFrame。然而,为了确保兼容性和与 fit 方法的一致性,将其转换为NumPy数组 (X.values) 是一个稳妥的做法。
  • X.columns[feat_selector.support_]:这行代码是关键。它利用Boruta的 support_ 属性作为布尔索引,从原始DataFrame X 的所有列名中筛选出被选中的特征列名。

方法二:利用Boruta最新版本return_df=True参数

Boruta库的较新版本(通常指其 master 分支或较新发布的稳定版本)为 transform 方法提供了一个便捷的参数 return_df=True。当设置此参数时,transform 方法将直接返回一个带有原始列名的Pandas DataFrame,无需手动处理。

# 方法二:利用Boruta最新版本`return_df=True`参数
# 确保你的 BorutaPy 版本支持 return_df=True 参数
print("\n--- 方法二:使用 return_df=True 参数 ---")
try:
    X_filtered_method2 = feat_selector.transform(X, return_df=True)
    print("精选特征DataFrame (X_filtered_method2) 的前5行:")
    print(X_filtered_method2.head())
    print("\n精选特征DataFrame的列名:")
    print(X_filtered_method2.columns)
    print(f"精选特征数量: {X_filtered_method2.shape[1]}")
except TypeError as e:
    print(f"警告: 您的BorutaPy版本可能不支持 return_df=True 参数。错误信息: {e}")
    print("请尝试升级 BorutaPy 到最新版本 (例如: pip install boruta==0.3 -U 或从GitHub安装最新master分支)。")
登录后复制

注意事项:

  • 版本兼容性: return_df=True 参数并非所有Boruta版本都支持。如果你遇到 TypeError,这通常意味着你的BorutaPy版本较旧。建议通过 pip install boruta --upgrade 或直接从其GitHub仓库安装最新版本。
  • 简洁性: 如果你的Boruta版本支持此参数,方法二无疑是最简洁、最推荐的做法。它自动化了列名映射的过程,减少了出错的可能性。

总结与最佳实践

在数据科学工作流中,特征选择是至关重要的一步,而Boruta算法提供了一种强大的方法来识别相关特征。将Boruta的输出结果有效地整合回带有原始列名的Pandas DataFrame,对于后续的数据探索、模型训练和结果解释都具有重要意义。

  • 手动构建 (方法一):适用于所有Boruta版本,通过 feat_selector.support_ 布尔掩码手动映射列名,具有通用性。
  • return_df=True (方法二):如果你的Boruta版本支持,这是更简洁、更高效的方法,强烈推荐使用。它直接返回带有正确列名的DataFrame,简化了代码。

无论选择哪种方法,最终目标都是获得一个结构清晰、易于理解的精选特征DataFrame。这不仅能提高数据处理效率,还能确保模型构建和结果分析的准确性和可追溯性。在进行特征选择之前,请务必确保你的数据已经进行了适当的预处理,例如缺失值处理和特征编码,以确保Boruta算法能够准确地评估特征的重要性。

以上就是Boruta特征选择结果在Pandas DataFrame中的处理与列名保留的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号