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

如何将XGBoost中SVD维度的特征重要性映射回原始文本特征?

问题:将XGBoost特征重要性从SVD维度映射回原始文本特征

我有一个XGBoost模型,处理文本特征时会先执行TFIDF向量化,再进行TruncatedSVD降维操作,现在希望理解该模型的特征重要性。

文本特征处理流程如下:

.......
tfidf = TfidfVectorizer(tokenizer=tokenize)
tfs = tfidf.fit_transform(token_dict)

svd = TruncatedSVD(n_components=15)
temp = pd.DataFrame(svd.fit_transform(tfs))
temp.rename(columns=lambda x: text_feature+'_'+str(x), inplace=True)

dataset=dataset.join(temp,how='inner')
.......

目前流程运行正常,我通过以下代码生成特征重要性图表:

xgb.plot_importance(model, max_num_features=15)
pyplot.show()

得到的图表显示的是summary_1、summary_2这类SVD降维后的维度的重要性,我希望将其映射回原始数据集的维度,从而了解summary这类原始文本特征中各个词的重要性,而非SVD后的维度重要性。


解决方案

要实现SVD维度到原始TFIDF词特征的重要性映射,核心思路是利用TruncatedSVD的components矩阵(记录每个SVD维度与原始TFIDF特征的线性组合权重),结合XGBoost给出的SVD维度重要性,加权计算出每个原始词的重要性。具体步骤如下:

  1. 提取XGBoost对SVD维度的重要性
    从训练好的XGBoost模型中筛选出SVD特征对应的重要性值,确保顺序与SVD的components矩阵一致:

    import pandas as pd
    
    # 获取所有特征的重要性(可选择weight/gain/cover类型)
    feature_importances = model.get_booster().get_score(importance_type='weight')
    # 筛选出当前文本特征对应的SVD维度重要性
    svd_importances = {k: v for k, v in feature_importances.items() if k.startswith(f"{text_feature}_")}
    # 按SVD维度序号排序,匹配components矩阵的行顺序
    svd_importances_sorted = sorted(svd_importances.items(), key=lambda x: int(x[0].split('_')[-1]))
    # 提取纯重要性数值数组
    svd_imp_values = [val for _, val in svd_importances_sorted]
    
  2. 计算原始词的加权重要性
    利用SVD的components矩阵,将每个SVD维度的重要性作为权重,对原始词的组合权重进行加权求和:

    import numpy as np
    
    # 获取SVD的components矩阵(形状:[n_components, 原始TFIDF词数])
    svd_components = svd.components_
    # 加权计算每个原始词的最终重要性
    word_importances = np.dot(svd_imp_values, svd_components)
    
  3. 映射到原始词并可视化
    将计算结果与TFIDF词表对应,整理后展示Top重要词:

    # 获取TFIDF的完整词表
    vocab = tfidf.get_feature_names_out()
    # 生成词-重要性的DataFrame并排序
    word_importance_df = pd.DataFrame({'word': vocab, 'importance': word_importances})
    word_importance_df = word_importance_df.sort_values(by='importance', ascending=False)
    # 可视化前20个重要词
    import matplotlib.pyplot as plt
    
    plt.figure(figsize=(10, 6))
    plt.barh(word_importance_df['word'].head(20), word_importance_df['importance'].head(20))
    plt.gca().invert_yaxis()
    plt.title(f"Top 20 Important Words from {text_feature}")
    plt.xlabel("Importance")
    plt.show()
    

关键说明

  • 重要性类型可替换:get_score中的importance_type可选weight(特征被用于分裂的次数)、gain(特征带来的总增益)或cover(特征覆盖的样本数),按需选择即可。
  • 多文本特征处理:若数据集包含多个独立做TFIDF+SVD的文本特征,需针对每个特征单独执行上述流程,避免不同特征的SVD分量混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:20:43