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)
就我个人而言,我没有在我的代码中看到任何错误(上面的这段和一般的)。
我为解释这种准确性下降而制定的假设如下。
max_features等)与此相关,当我在训练后检查随机森林的特征重要性时,我发现非 TF-IDF 特征的重要性非常低(尽管我不确定特征重要性的指标有多可靠,尤其是使用 TF - 包括 IDF 功能)。
您能否以不同的方式解释我的分类器准确度下降的原因?
在任何情况下,你会建议做什么?
结合 TF-IDF 和非 TF-IDF 功能的其他一些想法如下。
一种选择是拥有两个单独的(随机森林)模型——一个用于 TF-IDF 功能,另一个用于非 TF-IDF 功能。然后这两个模型的结果将通过(加权)投票或元分类进行组合。
您认为 130K 的特征对于随机森林来说太多了,这听起来是对的。您没有提到数据集中有多少示例,这对于选择可能的后续步骤至关重要。以下是我脑海中的一些想法。
如果数据点的数量足够大,您可能想要训练 TF-IDF 特征的一些转换 - 例如,您可能想要训练这些 TF-IDF 特征的小维嵌入,例如 64 维空间,然后例如一个小除此之外(甚至可能是线性模型)。获得嵌入后,您可以将它们用作转换,为每个示例生成 64 个附加特征,以替换随机森林训练的 TF-IDF 特征。或者用这种架构的神经网络替换整个随机森林,例如 TF-IDF 通过全连接层组合成几个神经元,然后与其他特征连接(与嵌入几乎相同,但作为神经网络的一部分) 。
如果您没有足够的数据来训练大型神经网络,也许您可以尝试训练 GBDT 集成而不是随机森林。与随机森林相比,它在挑选好的特征方面可能应该做得更好,而随机森林肯定会受到许多嘈杂无用特征的影响。另外,您可以首先训练一些原始版本,然后基于该版本进行特征选择(同样,我希望与随机森林相比,它应该做更合理的工作)。