【问题标题】:How can I use Ensemble learning of two models with different features as an input?如何使用具有不同特征的两个模型的集成学习作为输入?
【发布时间】:2021-11-11 20:39:42
【问题描述】:

我有一个假新闻检测问题,它通过向量化“tweet”列来预测二进制标签“1”和“0”,我使用三种不同的模型进行检测,但我想使用集成方法来提高准确性但他们使用不同的vectorezer。

我有 3 个 KNN 模型,第一个和第二个使用 TF-IDF 对“推文”列进行矢量化。

from sklearn.feature_extraction.text import TfidfVectorizer
    vector = TfidfVectorizer(max_features =5000, ngram_range=(1,3))
    X_train = vector.fit_transform(X_train['tweet']).toarray()
    X_test = vector.fit_transform(X_test['tweet']).toarray()

对于第三个模型,我使用 fastText 进行句子向量化

%%time
sent_vec = []
for index, row in X_train.iterrows():
    sent_vec.append(avg_feature_vector(row['tweet']))
%%time
sent_vec1 = []
for index, row in X_test.iterrows():
    sent_vec1.append(avg_feature_vector(row['tweet']))

缩放后...我的第三个模型适合这样的输入

scaler.fit(sent_vec)
scaled_X_train= scaler.transform(sent_vec)
scaled_X_test= scaler.transform(sent_vec1)
.
.
.
knn_model1.fit(scaled_X_train, y_train)

现在我想像这样组合三个模型,我希望 ensemble 方法给我大多数就像VotingClassifier,但我不知道如何处理不同的输入(TF-IDF & fastText) 还有其他方法吗?

【问题讨论】:

    标签: python machine-learning nlp tf-idf ensemble-learning


    【解决方案1】:

    您可以创建一个自定义 MyVotingClassifier,它采用拟合模型而不是尚未训练的模型实例。在VotingClassifier 中,sklearn 仅将不合适的分类器作为输入并对其进行训练,然后对预测结果进行投票。你可以创建这样的东西。下面的函数可能不是确切的函数,但您可以根据您的目的制作类似于下面的函数。

    from collections import Counter
    clf1 = knn_model_1.fit(X1, y)
    clf2 = knn_model_2.fit(X2, y)
    clf3 = knn_model_3.fit(X3, y)
    
    class MyVotingClassifier:
        def __init__(self, **models):
            self.models = models
        
        def predict(dict_X):
            '''
            dict_X = {'knn_model_1': X1, 'knn_model_2': X2, 'knn_model_3': X3}
            '''
            preds = []
            for model_name in dict_X:
                model = self.models[model_name]
                preds.append(model.predict(dict_X[model_name]))
            preds = list(zip(*preds))
            final_pred = list(map(lambda x: Counter(x).most_common(1)[0][0]))
            return final_pred
    ensemble_model = MyVotingClassifier(knn_model_1=clf1, knn_model_2=clf2, knn_model_3=clf3)
    ensemble_model.predict({'knn_model_1': X1, 'knn_model_2': X2, 'knn_model_3': X3}) # Input the pre-processed `X`s 
    

    【讨论】:

    • 谢谢,这是一个很好的解决方案,但我在这一行收到错误“无效语法”self.models = **models
    • 对不起。那是个错误。我现在已经编辑过了。它应该适用于小的变化。
    • X1、X2、X3 是否代表每个模型的“X_train”?现在我在最后一行得到这个错误predict() takes 1 positional argument but 2 were given d
    • dict_X代表X_test对应每个模型。您应该在X1X2X3 中传递一个数据框或一个numpy 数组。由于我没有您所拥有的确切数据,因此我无法对此进行广泛测试,但这种方法应该可以进行一些小的调整。
    猜你喜欢
    • 2021-08-09
    • 2019-11-16
    • 2018-12-18
    • 2014-06-12
    • 2013-12-05
    • 2016-07-29
    • 2020-12-23
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多