Я работаю с набором данных 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)
Я не уверен, как это интерпретировать. Я думал, что более ранние индексы массива важности признаков будут иметь более высокое значение, и поэтому токены, соответствующие этому индексу в словаре векторизатора, будут более важными / влиятельными, чем другие токены. Это предположение неверно? Как я могу получить наиболее влиятельные / важные термины, которые определяют результат модели? Любая помощь приветствуется.
Спасибо.