Как получить важные слова, используя важность функций LGBM и векторизатор Tfidf? - PullRequest
0 голосов
/ 25 октября 2019

Я работаю с набором данных Kaggle, который прогнозирует цену товара, используя его описание и другие атрибуты. Здесь - ссылка на конкурс. В настоящее время я использую описание товара только для того, чтобы предсказать его цену. Описание является свободным текстом, и я использую векторизатор Tfidf от sklearn с биграммой и максимальными функциями, установленными на 60000, в качестве входных данных для модели lightGBM.

После обучения я хотел бы узнать наиболее влиятельные токены для прогнозирования цены. Я предполагал, что метод lightGBM feature_importance сможет дать мне это. Это вернет массив 60000 dim numpy, индекс которого я могу использовать для извлечения токена из словаря vocab 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)

Я не уверен, как это интерпретировать. Я думал, что более ранние индексы массива важности признаков будут иметь более высокое значение, и поэтому токены, соответствующие этому индексу в словаре векторизатора, будут более важными / влиятельными, чем другие токены. Это предположение неверно? Как я могу получить наиболее влиятельные / важные термины, которые определяют результат модели? Любая помощь приветствуется.

Спасибо.

...