gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:24:50 27 4
gpt4 key购买 nike

我运行具有 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)

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

我为解释这种准确性下降而制定的假设如下。
  • 非 TF-IDF 特征的数量只有 500 个(总共 13 万个特征)
  • 这给了一些机会,非 TF-IDF 特征在随机森林的树的每次 split 中没有被选择那么多(例如,因为 max_features 等)
  • 因此,如果非 TF-IDF 功能确实很重要,那么这将产生问题,因为它们没有得到足够的考虑。

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

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

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

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

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

    最佳答案

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

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

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

    关于python - TF-IDF 和非 TF-IDF 功能的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62268459/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com