Как я могу использовать ансамблевое обучение двух моделей с разными функциями в качестве входных данных?

#python #machine-learning #nlp #tf-idf #ensemble-learning

Вопрос:

У меня проблема с обнаружением фальшивых новостей, и она предсказывает двоичные метки «1»и»0″ путем векторизации столбца «твит», я использую три разные модели для обнаружения, но я хочу использовать метод ансамбля для повышения точности, но они используют другой вектор.

У меня есть 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)
 

теперь я хочу объединить три модели таким образом, и я хочу, чтобы метод ансамбля давал мне большинство VotingClassifier , но я понятия не имею, как я могу работать с различными входными данными (TF-IDF и FastText). Есть ли другой способ сделать это?

Ответ №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 
 

Комментарии:

1. спасибо, это отличное решение, но я получаю ошибку «недопустимый синтаксис» в этой строке self.models = **models

2. Извините. Это было ошибкой. Сейчас я его отредактировал. Он должен работать с небольшими изменениями.

3. представляет ли X1, X2, X3 «X_train» для каждой модели? теперь я получаю эту ошибку для последней строки predict() takes 1 positional argument but 2 were given d

4. dict_X представляют X_test соответствующие каждой модели. Вы должны передать фрейм данных или массив numpy X1 , X2 и X3 . Поскольку у меня не было точных данных, которые были у вас, я не мог тщательно протестировать это, но этот метод должен работать с небольшими изменениями.