You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于含PCA、XGBoost的Voting Classifier获取Top3特征重要性

获取Voting Classifier的特征重要性并找出Top3特征

你遇到的核心问题是Voting Classifier本身没有直接提供特征重要性的属性,因为它本质是多个基分类器的投票集成。想要得到特征重要性,我们需要从每个基模型入手,提取各自的特征重要性后再进行加权汇总。下面我会结合你的需求(集成PCA、XGBoost、Decision Tree、Random Forest、Logistic Regression)给出完整的实现步骤和代码。


第一步:调整分类器集合与导入依赖

首先替换你原来的模型,补充XGBoost和决策树,同时导入必要的工具库:

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from xgboost import XGBClassifier
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd

第二步:数据准备与可选PCA预处理

先分离特征和目标变量,同时保存特征名称方便后续输出:

X_train = train.drop(['target'], axis=1)
y_train = train['target']
feature_names = X_train.columns.tolist()

如果需要用PCA做特征降维(注意:PCA对特征尺度敏感,必须先标准化):

# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)

# 保留95%方差的PCA降维
pca = PCA(n_components=0.95, random_state=2)
X_pca = pca.fit_transform(X_scaled)

第三步:定义基分类器与Voting Classifier

建议使用soft投票(可以输出概率,也方便后续加权汇总重要性),同时可以根据模型的验证集表现设置权重(比如给效果好的模型更高权重):

# 初始化各个基分类器
log_clf = LogisticRegression(random_state=2, max_iter=1000)  # 增加迭代次数确保收敛
rnd_clf = RandomForestClassifier(n_estimators=150, max_depth=3, min_samples_leaf=6, max_features=0.3, n_jobs=-1, random_state=2)
dt_clf = DecisionTreeClassifier(max_depth=3, min_samples_leaf=6, random_state=2)
xgb_clf = XGBClassifier(n_estimators=150, max_depth=3, min_child_weight=3, colsample_bytree=0.3, learning_rate=0.05, subsample=0.4, random_state=2, use_label_encoder=False, eval_metric='logloss')

# 构建Voting Classifier,设置权重(可根据验证集准确率调整)
estimators = [('lr', log_clf), ('rf', rnd_clf), ('dt', dt_clf), ('xgb', xgb_clf)]
voting_clf = VotingClassifier(estimators=estimators, voting='soft', weights=[1, 2, 1, 2])

# 训练:不用PCA传X_train,用PCA传X_pca
voting_clf.fit(X_pca, y_train)

第四步:提取并汇总特征重要性

这里分两种场景:直接用原始特征训练,或者用PCA降维后的特征训练(需要映射回原始特征)。

场景1:直接用原始特征训练基分类器

树模型(RandomForest、DecisionTree、XGBoost)自带feature_importances_属性,逻辑回归可以用系数的绝对值作为重要性(代表特征对预测的影响程度)。我们将每个模型的重要性归一化后,按Voting的权重加权平均:

# 确保每个基分类器都完成训练(Voting训练后,基模型保存在estimators_属性里)
for clf in voting_clf.estimators_:
    clf.fit(X_train, y_train)

# 定义函数获取单个模型的特征重要性
def get_model_importance(clf, feature_names):
    if hasattr(clf, 'feature_importances_'):
        imp = clf.feature_importances_
    elif hasattr(clf, 'coef_'):
        # 多分类逻辑回归的coef_是(n_classes, n_features),取绝对值的均值
        imp = np.abs(clf.coef_).mean(axis=0)
    else:
        raise ValueError("该分类器不支持特征重要性提取")
    # 归一化到0-1区间,方便加权汇总
    return pd.Series(imp / imp.sum(), index=feature_names)

# 获取每个模型的特征重要性
lr_imp = get_model_importance(log_clf, feature_names)
rf_imp = get_model_importance(rnd_clf, feature_names)
dt_imp = get_model_importance(dt_clf, feature_names)
xgb_imp = get_model_importance(xgb_clf, feature_names)

# 按Voting权重加权平均得到最终重要性
weights = voting_clf.weights_
total_weight = sum(weights)
final_importance = (lr_imp * weights[0] + rf_imp * weights[1] + dt_imp * weights[2] + xgb_imp * weights[3]) / total_weight

# 输出Top3特征
top3_features = final_importance.sort_values(ascending=False).head(3)
print("Top3重要特征:")
print(top3_features)

场景2:用PCA降维后的特征训练基分类器

需要把分类器对PCA特征的重要性,通过PCA的载荷矩阵映射回原始特征:

# 确保每个基分类器都完成训练
for clf in voting_clf.estimators_:
    clf.fit(X_pca, y_train)

# 定义函数将PCA特征重要性映射回原始特征
def map_to_original_importance(clf, pca, feature_names):
    if hasattr(clf, 'feature_importances_'):
        pca_imp = clf.feature_importances_
    elif hasattr(clf, 'coef_'):
        pca_imp = np.abs(clf.coef_).mean(axis=0)
    else:
        raise ValueError("该分类器不支持特征重要性提取")
    # 原始特征重要性 = PCA载荷矩阵的转置 × PCA特征重要性
    original_imp = np.dot(pca.components_.T, pca_imp)
    # 取绝对值(载荷有正负,重要性看影响大小)并归一化
    original_imp = np.abs(original_imp)
    return pd.Series(original_imp / original_imp.sum(), index=feature_names)

# 获取每个模型的原始特征重要性
lr_imp = map_to_original_importance(log_clf, pca, feature_names)
rf_imp = map_to_original_importance(rnd_clf, pca, feature_names)
dt_imp = map_to_original_importance(dt_clf, pca, feature_names)
xgb_imp = map_to_original_importance(xgb_clf, pca, feature_names)

# 加权平均得到最终重要性
weights = voting_clf.weights_
total_weight = sum(weights)
final_importance = (lr_imp * weights[0] + rf_imp * weights[1] + dt_imp * weights[2] + xgb_imp * weights[3]) / total_weight

# 输出Top3特征
top3_features = final_importance.sort_values(ascending=False).head(3)
print("Top3重要特征:")
print(top3_features)

关键注意事项

  1. 权重设置:建议根据每个基模型在验证集上的准确率调整权重,比如给准确率高的模型更高权重,这样汇总的重要性更可靠。
  2. 逻辑回归的重要性:作为线性模型,系数的绝对值代表特征对预测的影响程度,多分类场景下取所有类别系数绝对值的均值。
  3. PCA的必要性:如果特征维度极高,PCA可以帮助降维;但如果只是为了获取原始特征的重要性,直接用原始特征训练基模型会更直接。

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:31:21