
本文详细介绍了如何使用boruta算法进行特征选择,并重点阐述了如何将boruta筛选出的特征结果有效地整合到pandas dataframe中,同时保留原始的列名。文章提供了两种实现方法,包括手动利用布尔掩码进行索引以及使用boruta最新版本提供的`return_df=true`参数,旨在帮助用户清晰、便捷地管理特征选择后的数据。
Boruta是一种基于随机森林的包装器(Wrapper)特征选择算法,其设计目标是识别数据集中所有与目标变量具有统计显著性关联的特征。它通过引入“影子特征”(原始特征的随机置乱副本)并迭代地比较原始特征与影子特征的重要性,从而提供一个稳健的特征子集。
在使用Boruta进行特征选择时,通常会遵循以下步骤:
以下是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。
将Boruta筛选出的特征(通常是一个NumPy数组)重新封装成一个Pandas DataFrame,并保留原始的列名,是数据预处理中非常重要的一步。这有助于保持数据的可读性和可解释性。这里提供两种实现方法。
feat_selector.support_ 是一个布尔数组,其长度与原始特征数量相同,其中 True 表示对应的特征被Boruta选中,False 则表示未被选中。我们可以利用这个布尔掩码从原始DataFrame X 的列名中选择出精选特征的列名,然后与 feat_selector.transform() 返回的NumPy数组结合,构建新的DataFrame。
# 方法一:利用布尔掩码手动构建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]}")说明:
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分支)。")注意事项:
在数据科学工作流中,特征选择是至关重要的一步,而Boruta算法提供了一种强大的方法来识别相关特征。将Boruta的输出结果有效地整合回带有原始列名的Pandas DataFrame,对于后续的数据探索、模型训练和结果解释都具有重要意义。
无论选择哪种方法,最终目标都是获得一个结构清晰、易于理解的精选特征DataFrame。这不仅能提高数据处理效率,还能确保模型构建和结果分析的准确性和可追溯性。在进行特征选择之前,请务必确保你的数据已经进行了适当的预处理,例如缺失值处理和特征编码,以确保Boruta算法能够准确地评估特征的重要性。
以上就是Boruta特征选择结果在Pandas DataFrame中的处理与列名保留的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号