Scikit learn 如何使用LGBM特征重要性和Tfidf矢量器获取重要单词?

Scikit learn 如何使用LGBM特征重要性和Tfidf矢量器获取重要单词?,scikit-learn,lightgbm,tfidfvectorizer,Scikit Learn,Lightgbm,Tfidfvectorizer,我正在使用Kaggle数据集,该数据集使用商品的描述和其他属性预测商品的价格。是比赛的环节。作为实验的一部分,我目前只使用物品的描述来预测其价格。描述是自由文本,我使用sklearn的Tfidf矢量器,将bi gram和max功能设置为60000作为lightGBM模型的输入 培训后,我想知道预测价格最有影响力的代币。我认为lightGBM的功能的重要性方法可以给我这个。这将返回一个60000 dim numpy数组,我可以使用该数组的索引从Tfidf的矢量器的vocab字典中检索令牌 代码如下

我正在使用Kaggle数据集,该数据集使用商品的描述和其他属性预测商品的价格。是比赛的环节。作为实验的一部分,我目前只使用物品的描述来预测其价格。描述是自由文本,我使用sklearn的Tfidf矢量器,将bi gram和max功能设置为60000作为lightGBM模型的输入

培训后,我想知道预测价格最有影响力的代币。我认为lightGBM的
功能的重要性
方法可以给我这个。这将返回一个60000 dim numpy数组,我可以使用该数组的索引从Tfidf的矢量器的vocab字典中检索令牌

代码如下:

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\u 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)

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

谢谢