TF-IDF 和非 TF-IDF 功能的准确性

Poe*_*dit 8 python machine-learning tf-idf random-forest

我运行具有 TF-IDF 和非 TF-IDF 特征的随机森林算法。

总共特征数量约为 130k(在对 TF-IDF 特征进行特征选择之后),训练集的观察数量约为 120k。

其中大约 500 个是非 TF-IDF 功能。

问题是随机森林在同一测试集上的准确性等

- 只有非 TF-IDF 的特征是 87%

- TF-IDF 和非 TF-IDF 特征为 76%

准确性的显着恶化在我的脑海中引发了一些问题。

我与模型训练的相关代码如下:

drop_columns = ['labels', 'complete_text_1', 'complete_text_2']

# Split to predictors and targets
X_train = df.drop(columns=drop_columns).values
y_train = df['labels'].values


# Instantiate, train and transform with tf-idf models
vectorizer_1 = TfidfVectorizer(analyzer="word", ngram_range=(1,2), vocabulary=tf_idf_feature_names_selected)
X_train_tf_idf_1 = vectorizer_1.fit_transform(df['complete_text_1'])

vectorizer_2 = TfidfVectorizer(analyzer="word", ngram_range=(1,2), vocabulary=tf_idf_feature_names_selected)
X_train_tf_idf_2 = vectorizer_2.fit_transform(df['complete_text_2'])


# Covert the general features to sparse array
X_train = np.array(X_train, dtype=float)
X_train = csr_matrix(X_train)


# Concatenate the general features and tf-idf features array
X_train_all = hstack([X_train, X_train_tf_idf_1, X_train_tf_idf_2])


# Instantiate and train the model
rf_classifier = RandomForestClassifier(n_estimators=150, random_state=0, class_weight='balanced', n_jobs=os.cpu_count()-1)
rf_classifier.fit(X_train_all, y_train)
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我没有在我的代码中看到任何错误(上面的这段和一般的)。

我为解释这种准确性下降而制定的假设如下。

  1. 非 TF-IDF 特征的数量只有 500 个(总共 13 万个特征)
  2. 这给了一些机会,非 TF-IDF 特征在随机森林的树的每次分裂中都没有被选择那么多(例如,因为max_features等)
  3. 因此,如果非 TF-IDF 功能确实很重要,那么这将产生问题,因为它们没有得到足够的考虑。

与此相关,当我在训练后检查随机森林的特征重要性时,我发现非 TF-IDF 特征的重要性非常低(尽管我不确定特征重要性的指标有多可靠,尤其是使用 TF - 包括 IDF 功能)。

您能否以不同的方式解释我的分类器准确度下降的原因?

在任何情况下,你会建议做什么?

结合 TF-IDF 和非 TF-IDF 功能的其他一些想法如下。

一种选择是拥有两个单独的(随机森林)模型——一个用于 TF-IDF 功能,另一个用于非 TF-IDF 功能。然后这两个模型的结果将通过(加权)投票或元分类进行组合。

Ale*_*rov 2

您认为 130K 的特征对于随机森林来说太多了,这听起来是对的。您没有提到数据集中有多少示例,这对于选择可能的后续步骤至关重要。以下是我脑海中的一些想法。

如果数据点的数量足够大,您可能想要训练 TF-IDF 特征的一些转换 - 例如,您可能想要训练这些 TF-IDF 特征的小维嵌入,例如 64 维空间,然后例如一个小除此之外(甚至可能是线性模型)。获得嵌入后,您可以将它们用作转换,为每个示例生成 64 个附加特征,以替换随机森林训练的 TF-IDF 特征。或者用这种架构的神经网络替换整个随机森林,例如 TF-IDF 通过全连接层组合成几个神经元,然后与其他特征连接(与嵌入几乎相同,但作为神经网络的一部分) 。

如果您没有足够的数据来训练大型神经网络,也许您可​​以尝试训练 GBDT 集成而不是随机森林。与随机森林相比,它在挑选好的特征方面可能应该做得更好,而随机森林肯定会受到许多嘈杂无用特征的影响。另外,您可以首先训练一些原始版本,然后基于该版本进行特征选择(同样,我希望与随机森林相比,它应该做更合理的工作)。