Работа с признаками в текстовой классификации

введите сюда описание изображения

У меня есть дата-сет, в котором присутствуют 4 признака, дата, текст, категориальные (штаты), численный (компания). Я использую лемматизацию, далее удаляю стоп слова и создаю разреженную матрицу (для использования в обучении). Как мне объединить остальные 3 признака с полученной матрицей для внедрения уже в модель машинного обучения (И нужно ли это вообще делать)?

    import re
    
    from nltk.stem import WordNetLemmatizer 
      
    lemmatizer = WordNetLemmatizer() 

    def tokenLemmat(text):
        tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)] 
        filtered_tokens = []

        for token in tokens:
            if re.search('[a-zA-Z]', token):
                filtered_tokens.append(token)
        lem = [lemmatizer.lemmatize(t) for t in filtered_tokens]
        return lem

    import nltk
    stopwords = nltk.corpus.stopwords.words('english')
    
    nltk.download('stopwords')
    from sklearn.feature_extraction.text import TfidfVectorizer
    tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=10000, min_df=0.01, stop_words=stopwords, use_idf=True, tokenizer=tokenLemmat, ngram_range=(1, 1))

title = file['title']

tfidf_matrix = tfidf_vectorizer.fit_transform(title)
matrix_numbers = tfidf_matrix.toarray()# Разреженная матрица

Ответы (1 шт):

Автор решения: CrazyElf

Объединить то можно, например, с помощью numpy.hstack, но тогда придётся разреженную матрицу превращать в обычную, что не очень хорошо.

  • Можно предварительно понизить размерность разреженных данных до приемлемой (скажем, 50 или 100 фич, а иногда может и 20 фич хватить или даже 2) с помощью sklearn.decomposition.TruncatedSVD (этот алгоритм может принимать на вход разреженные данные, в отличие от PCA) и уже тогда объединять получившиеся фичи с остальными данными.
  • Можно применить несколько этапов машинного обучения, например, на первом этапе сделать предсказание вероятностей на основе разреженных данных с помощью predict_proba алгоритма sklearn.naive_bayes.GaussianNB, а потом уже объединить эти предсказания с остальными фичами. Но тут надо аккуратно действовать, есть некоторые тонкости в подходе, когда последовательно используются модели машинного обучения, там нужно использовать методы стекинга (предсказывать данные out of fold) и т.д.
→ Ссылка