我运行具有TF-IDF和非TF-IDF功能的随机森林算法。
在对TF-IDF功能进行特征选择之后,特征总数约为130k。训练集的观测结果约为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)
就我个人而言,我在代码中没有发现任何错误(上面和一般的内容)。
我为解释这种准确性下降而提出的假设如下。
max_features
等)与此相关,在训练后检查随机森林的特征重要性时,我发现非TF-IDF特征的重要性非常低(尽管我不确定该特征的可靠性指标如何可靠)尤其是包含TF-IDF功能)。
您能以不同的方式解释我的分类器准确性下降吗?
无论如何,您会建议做什么?
以下是结合TF-IDF和非TF-IDF功能的其他一些想法。
一种选择是拥有两个单独的(随机森林)模型-一个用于TF-IDF功能,一个用于非TF-IDF功能。 然后,这两种模型的结果将通过(加权)投票或元分类进行合并。
答案 0 :(得分:1)
您认为130K的功能对于“随机森林”来说实在太多了。您没有提到您的数据集中有多少个示例,这对于选择可能的后续步骤至关重要。这是我脑海中的一些想法。
如果数据点的数量足够大,您可能希望针对TF-IDF功能进行一些转换-例如您可能希望将这些TF-IDF功能的小尺寸嵌入训练到64维空间中,然后例如在此之上的一个小NN(甚至可能是线性模型)。嵌入后,您可以将它们用作转换,以为每个示例生成64个附加功能,以替换TF-IDF功能以进行RandomForest训练。或者替代地,用这样的架构的NN替换整个随机森林,例如TF-IDF都通过完全连接的层组合成几个神经元,然后与其他特征(与嵌入几乎相同,但作为NN的一部分)串联在一起。
如果您没有足够的数据来训练大型NN,则可以尝试训练GBDT集合,而不是随机森林。与随机森林相比,它可能应该在选择良好特征方面做得更好,后者肯定会受到许多无用的嘈杂特征的影响。另外,您可以首先训练一些原始版本,然后基于该版本进行功能选择(再次,我希望它比随机森林要做得更合理)。
答案 1 :(得分:0)
我的猜测是您的假设部分正确。
使用完整的数据集(在130K要素模型中)时,树中的每个拆分仅使用500个非TF-IDF要素中的一小部分。因此,如果非TF-IDF功能很重要,那么每次拆分都会遗漏许多有用的数据。一个拆分中被忽略的数据可能会用于树中的另一个拆分,但是结果不如每个拆分中使用更多数据时的结果好。
我认为还有一些非常重要的TF-IDF功能。我们拥有如此多的功能这一事实意味着,每次拆分时都会考虑这些功能的一小部分。
换句话说:问题不在于我们正在削弱非TF-IDF功能。 问题是我们正在削弱所有有用的功能(非TF-IDF和TF-IDF)。这与亚历山大的回答是一致的。 / p>
鉴于此,您提出的解决方案不能很好地解决问题。如果您创建两个随机森林模型,一个具有500个非TF-IDF功能,另一个具有125K TF-IDF功能,则第二个模型的性能会很差,并对结果产生负面影响。如果将500模型的结果作为附加功能传递给125K模型,那么您的表现仍然不佳。
如果我们要坚持使用随机森林,那么更好的解决方案是增加max_features
和/或树的数量。这样会增加在每次拆分时都考虑有用功能的可能性,从而使模型更准确。