当前位置: 首页 > news >正文

「日拱一码」081 机器学习——梯度增强特征选择GBFS

目录

什么是梯度增强特征选择(GBFS)

为什么 GBM 适合做特征选择

GBFS 的一般步骤

代码示例


什么是梯度增强特征选择(GBFS)

GBFS 并非一个像 Lasso 或随机森林那样有严格标准定义的独立算法,而是一种基于梯度提升机(Gradient Boosting Machine, GBM)模型来进行特征选择的思想和策略

其核心思想是:利用训练好的 GBM 模型(如 XGBoost, LightGBM, CatBoost)内置的特征重要性评分,来识别并选择对预测目标最重要的特征子集

为什么 GBM 适合做特征选择

  1. 内置的特征重要性(Feature Importance):大多数 GBM 实现都会自动计算特征重要性。最常见的两种计算方式是:

    • 基于分裂(Gain): 衡量一个特征在所有树中被用于分裂时,所带来的不纯度(如基尼系数、均方误差)减少的总和。这是最常用、最可靠的指标。
    • 基于频率(Frequency): 衡量一个特征在所有树中被用作分裂点的次数。
  2. 强大的非线性拟合能力:GBM 能够捕捉特征与目标之间复杂的非线性关系和交互效应,因此其评估出的特征重要性比一些线性模型(如 Lasso)更全面。

  3. 抗过拟合和鲁棒性:通过集成多棵弱学习器(树),GBM 对噪声数据相对鲁棒,其给出的特征重要性排序也更为稳定

GBFS 的一般步骤

  1. 训练一个 GBM 模型:使用全部特征在训练集上训练一个梯度提升模型(如 XGBRegressor 或 LGBMClassifier)。
  2. 获取特征重要性:从训练好的模型中提取每个特征的重要性分数。
  3. 排序和选择:将特征按重要性分数从高到低排序。
  4. 确定阈值:选择一个阈值来选择特征。方法有:
  • 选择 Top-K 个特征:例如,只保留最重要的前 20 个特征。
  • 重要性分数阈值:例如,只保留重要性分数大于平均值的特征。
  • 递归消除:结合递归特征消除(RFE),逐步剔除最不重要的特征,通过交叉验证来确定最佳特征数量

代码示例

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier# 1. 加载数据
data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names# 查看数据形状
print("原始特征维度:", X.shape)  # (569, 30)# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 3. 训练一个XGBoost模型(使用所有特征)
model = XGBClassifier(random_state=42, use_label_encoder=False, eval_metric='logloss')
model.fit(X_train, y_train)# 4. 获取特征重要性(基于Gain)
importance_scores = model.feature_importances_
# 创建一个(特征名:重要性分数)的字典,并排序
feat_imp_dict = dict(zip(feature_names, importance_scores))
sorted_feat_imp = sorted(feat_imp_dict.items(), key=lambda x: x[1], reverse=True)# 打印最重要的10个特征
print("\n最重要的10个特征:")
for feat, imp in sorted_feat_imp[:10]:print(f"{feat}: {imp:.4f}")
# worst concave points: 0.2856
# mean concave points: 0.2357
# worst perimeter: 0.1743
# worst radius: 0.0760
# worst area: 0.0570
# worst texture: 0.0217
# worst concavity: 0.0187
# perimeter error: 0.0186
# mean texture: 0.0144
# mean radius: 0.0128# 5. 可视化特征重要性(可选)
plt.figure(figsize=(10, 8))
indices = np.argsort(importance_scores)[::-1] # 按重要性降序排列的索引
plt.title('Feature Importances (XGBoost - Gain)')
plt.barh(range(len(indices)), importance_scores[indices], color='b', align='center')
plt.yticks(range(len(indices)), [feature_names[i] for i in indices])
plt.xlabel('Relative Importance')
plt.gca().invert_yaxis() # 让最重要的特征显示在顶部
plt.tight_layout()
plt.show()# 6. 进行特征选择:我们选择最重要的前10个特征
top_k = 10
selected_feature_indices = indices[:top_k] # 获取最重要特征的索引X_train_selected = X_train[:, selected_feature_indices]
X_test_selected = X_test[:, selected_feature_indices]print(f"\n选择后的特征维度:{X_train_selected.shape}")  # (455, 10)# 7. 使用选择后的特征重新训练模型,验证效果
model_selected = XGBClassifier(random_state=42, use_label_encoder=False, eval_metric='logloss')
model_selected.fit(X_train_selected, y_train)# 预测
y_pred_full = model.predict(X_test)
y_pred_selected = model_selected.predict(X_test_selected)# 评估准确率
acc_full = accuracy_score(y_test, y_pred_full)
acc_selected = accuracy_score(y_test, y_pred_selected)print(f"\n模型性能对比:")
print(f"使用所有特征的测试集准确率: {acc_full:.4f}")  # 0.9561
print(f"使用Top-{top_k}个特征的测试集准确率: {acc_selected:.4f}")  # 0.9561


文章转载自:

http://qgMGfMZZ.bqdpy.cn
http://dKfW0KYA.bqdpy.cn
http://esbYjKix.bqdpy.cn
http://PlQ5L0Gf.bqdpy.cn
http://0NwQUo9T.bqdpy.cn
http://YqhDLAYn.bqdpy.cn
http://DFhFhFnk.bqdpy.cn
http://cbV1Fqy0.bqdpy.cn
http://cP89dnnT.bqdpy.cn
http://fJ5HcXoW.bqdpy.cn
http://LgBlFZoz.bqdpy.cn
http://WH2OpoUF.bqdpy.cn
http://ubCJ3KbF.bqdpy.cn
http://gVCSW8Vh.bqdpy.cn
http://JAYxhBBL.bqdpy.cn
http://dCPBMkbw.bqdpy.cn
http://nuQhHUIf.bqdpy.cn
http://Y6AnmbWj.bqdpy.cn
http://YF6jn87I.bqdpy.cn
http://SpiN7vBL.bqdpy.cn
http://z5LJ0noZ.bqdpy.cn
http://EYtYeyun.bqdpy.cn
http://SZgBqYdp.bqdpy.cn
http://ERaPWCwB.bqdpy.cn
http://X6kVdkAq.bqdpy.cn
http://Sw1tAQaP.bqdpy.cn
http://tqsEiF4d.bqdpy.cn
http://6Ixp0pgH.bqdpy.cn
http://1El26hXM.bqdpy.cn
http://DUMKkhcE.bqdpy.cn
http://www.dtcms.com/a/371543.html

相关文章:

  • 阿里云镜像地址获取,并安装 docker的mysql和nginx等服务,java,python,ffmpeg,go等环境
  • IPSec综合配置实验
  • 实现滚动到页面指定位置
  • Linux 系统监控 + 邮件告警实战:CPU、内存、IO、流量全覆盖
  • HarmonyOS 应用开发新范式:深入剖析 Stage 模型与 ArkTS 状态管理
  • Elasticsearch面试精讲 Day 11:索引模板与动态映射
  • 5G NR PDCCH之信号调制
  • Android --- AOSP下载及编译
  • C#中的托管资源与非托管资源介绍
  • 初识Vue
  • JSP到Tomcat特详细教程
  • 滑动窗口与双指针(1)——定长
  • Lua > OpenResty Lua Module
  • [LeetCode 热题 100] 32. 最长有效括号
  • Python IO编程——文件读写
  • fps:游戏玩法
  • S 4.1深度学习--自然语言处理NLP--理论
  • [NCTF2019]Fake XML cookbook
  • ARM体系结构学习②
  • 多环境配置切换机制能否让开发与生产无缝衔接?
  • SC3336 rgb sensor linux
  • 人工智能学习:Transformer架构
  • Android --- AOSP源码导入Android Studio
  • 华为HCIP-Datacom-Core Technology H12-831 书籍目录
  • (RDFS)随机深度特征选择方法解释:简而言之,RDFS主要针对的是恶意的服务器,它建立在客户端是诚实的前提下。
  • 《从使用到源码:OkHttp3责任链模式剖析》
  • 华为IP(9)
  • 【秋招笔试】2025.09.03华为研发岗
  • 动态维护有效区间:单调栈
  • Ubuntu 22 安装 postgresql-17.4