如何将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维度重要性,加权计算出每个原始词的重要性。具体步骤如下:
提取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]计算原始词的加权重要性
利用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)映射到原始词并可视化
将计算结果与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
相关产品推荐
相关产品推荐

