首页 > 解决方案 > 如何使用 LGBM 特征重要性和 Tfidf 矢量化器获取重要词?

问题描述

我正在研究一个 Kaggle 数据集,该数据集使用商品的描述和其他属性来预测商品的价格。是比赛的链接。作为实验的一部分,我目前仅使用商品的描述来预测其价格。描述是自由文本,我使用 sklearn 的 Tfidf 向量化器,将二元组和最大特征设置为 60000 作为 lightGBM 模型的输入。

训练后,我想知道预测价格最有影响力的代币。我认为 lightGBM 的feature_importance方法可以给我这个。这将返回一个 60000 暗淡的 numpy 数组,我可以使用它的索引从 Tfidf 的矢量化器的词汇字典中检索令牌。

这是代码:

vectorizer = TfidfVectorizer(ngram_range=(1,2), max_features=60000)
x_train = vectorizer.fit_transform(train_df['text'].values.astype('U'))
x_valid = vectorizer.transform(valid_df['text'].values.astype('U'))

idx2tok = {v: k for k, v in vectorizer.vocabulary_.items()}
features = [f'token_{i}' for i in range(len(vectorizer.vocabulary_))]
get_tok = lambda x, idxmap: idxmap[int(x[6:])]

lgb_train = lgb.Dataset(x_train, y_train)
lgb_valid = lgb.Dataset(x_valid, y_valid, reference=lgb_train)

gbm = lgb.train(lgb_params, lgb_train, num_boost_round=10, valid_sets=[lgb_train, lgb_valid], early_stopping_rounds=10, verbose_eval=True)

然而,模型训练后,当我调用 训练后gbm.feature_importance(),我得到一个稀疏的整数数组,这对我来说真的没有意义:

fi = gbm.feature_importance()
fi[:100]
array([ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
      dtype=int32)

np.unique(fi)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 33, 34, 38, 45],
      dtype=int32)

我不确定如何解释这一点。我认为特征重要性数组的早期索引将具有更高的值,因此与向量化器词汇中该索引对应的标记将比其他标记更重要/更有影响力。这个假设是错误的吗?如何获得决定模型结果的最有影响力/最重要的术语?任何帮助表示赞赏。

谢谢。

标签: scikit-learnlightgbmtfidfvectorizer

解决方案


推荐阅读