Как объединить NLP и числовые данные для задачи линейной регрессии

Вопрос или проблема

Я совершенно новичок в области науки о данных (это мой проект “Hello World”), и у меня есть набор данных, состоящий из комбинации текста отзывов и числовых данных, таких как количество столов. Также есть колонка для отзывов, которая является числом с плавающей точкой (среднее значение всех отзывов пользователей для этого ресторана). Так что строка данных может выглядеть так:

{ 
    rating: 3.765, 
    review: `Еда была отличной, персонал был дружелюбным`, 
    tables: 30, 
    staff: 15, 
    parking: 20
    ... 
}

Следуя учебникам, я смог сделать следующее:

  1. Создал модель линейной регрессии для прогнозирования рейтинга с использованием всех числовых данных в качестве входных данных.
  2. Создал регрессионную модель для прогнозирования рейтинга на основе текста отзыва с использованием sklearn.TfidfVectorizer.

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

Похоже, что вы можете использовать FeatureUnion для этого. Вот пример:

from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest

iris = load_iris()

X, y = iris.data, iris.target

# Этот набор данных слишком высокоразмерный. Лучше сделать PCA:
pca = PCA(n_components=2)

# Может быть, некоторые оригинальные функции тоже хороши?
selection = SelectKBest(k=1)

# Построить оценщик из PCA и одновариантного выбора:

combined_features = FeatureUnion([("pca", pca), ("univ_select", selection)])

# Используйте объединенные функции для преобразования набора данных:
X_features = combined_features.fit(X, y).transform(X)
print("Объединенное пространство имеет", X_features.shape[1], "функций")

svm = SVC(kernel="linear")

# Проведите поиск по сетке по k, n_components и C:

pipeline = Pipeline([("features", combined_features), ("svm", svm)])

param_grid = dict(features__pca__n_components=[1, 2, 3],
                  features__univ_select__k=[1, 2],
                  svm__C=[0.1, 1, 10])

grid_search = GridSearchCV(pipeline, param_grid=param_grid, cv=5, verbose=10)
grid_search.fit(X, y)
print(grid_search.best_estimator_)

Надеюсь, из этого примера ясно, как вы можете использовать это для объединения ваших результатов TfidfVectorizer с вашими оригинальными функциями.

Две основные идеи для использования текстовых данных в системе рекомендаций заключаются в выборе правильного встраивания и объединении встраиваний текста с числовыми данными. Один из способов — объединить числовые и встраиваемые текстовые признаки с помощью техник на основе MMDF, что приведет к многомодальной модели. Вы также можете дополнительно объединить изображения и аудио в качестве дополнительных модальностей. Другой способ — обучить независимые модели на встраиваемых текстовых признаках и числовых (и категориальных) признаках, чтобы в конечном итоге объединить два прогноза через стеккинг по сравнению с рейтингами. Сначала я бы проверил, коррелируют ли оценки двух моделей, обученных как указано? Предполагая, что это низкое значение, примените стеккинг, но если это высокое, модель текста может быть вовсе не нужна.

Выбор встраивания векторных признаков зависит от контекста. Tf-idf (или cbow, skip-gram) хороши для начала, но не предоставляют семантической информации, предварительно обученные встраивания word2vec будут лучшим выбором. Также можно дообучить предварительно обученные встраивания для вашего корпуса, чтобы добавить лучший контекст к встраиваниям. Наконец, модель тематического моделирования может быть использована для извлечения только релевантной информации из отзывов. Она действует как техника уменьшения размерности для отзывов и извлекает общие темы, обсуждаемые в отзывах. Эти темы с низкой размерностью можно использовать для замены текстовых встраиваний как в многомодальной, так и в стекированной модели для повышения эффективности.

Ответ или решение

Объединение NLP и числовых данных для линейной регрессии: Полный гид

Ваша задача — объединить текстовые данные и числовые переменные для использования в модели линейной регрессии, чтобы предсказать рейтинг ресторана. Этот процесс включает несколько ключевых шагов, начиная от векторизации текстовых данных и заканчивая комбинированием их с числовыми данными.

Шаг 1: Векторизация текстовых данных

Первым шагом, как вы уже сделали, является векторизация текстовых данных. Обычно для этой цели используется TfidfVectorizer из sklearn, который преобразует текст в числовой формат, указывая на важность каждого слова в документе.

Пример векторизации:

from sklearn.feature_extraction.text import TfidfVectorizer

# Ваши текстовые данные
reviews = [
    "Food was great, staff was friendly",
    "Excellent ambiance and service",
    ...
]

# Векторизация
vectorizer = TfidfVectorizer()
X_text = vectorizer.fit_transform(reviews)

Шаг 2: Подготовка числовых данных

Вторым шагом является формирование матрицы числовых данных. Например, вы можете взять такие признаки, как количество столов, сотрудников и парковочных мест. Пример кода выглядит следующим образом:

import pandas as pd

# Пример числовых данных
data = {
    'tables': [30, 50, ...],
    'staff': [15, 20, ...],
    'parking': [20, 25, ...],
}

# Создание DataFrame
df_numerical = pd.DataFrame(data)

Шаг 3: Объединение текстовых и числовых признаков

Теперь, когда у вас есть оба типа данных, вы можете их объединить, используя FeatureUnion, чтобы создать единую матрицу признаков для вашей модели линейной регрессии.

Вот пример, как это сделать:

from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.linear_model import LinearRegression
from scipy.sparse import hstack

# Объединение данных
combined_features = FeatureUnion([
    ('numerical_features', FunctionTransformer(lambda x: x)),
    ('text_features', TfidfVectorizer())
])

# Создание конечного Pipeline
pipeline = Pipeline([
    ('features', combined_features),
    ('regressor', LinearRegression())
])

# Обучение модели
pipeline.fit(X, y)

Чтобы объединить числовые данные и текстовые данные, FunctionTransformer может быть использован для обработки числовых данных и преобразования их формата в нужный вид, если это необходимо.

Шаг 4: Проверка результатов

После обучения модели важно оценить её производительность. Для этого вы можете использовать такие метрики, как средняя абсолютная ошибка (MAE) или среднеквадратичная ошибка (MSE):

from sklearn.metrics import mean_squared_error

predictions = pipeline.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print("Mean Squared Error:", mse)

Дополнительные советы

  1. Выбор векторизации: Для более глубокого анализа можете рассмотреть использование предобученных векторов Word2Vec или GloVe. Эти методы могут дать более качественные результаты, так как учитывают семантику слов.

  2. Отбор признаков: Может быть полезно использовать методы отбора признаков для выбора наиболее значимых признаков в ваших числовых данных и текстовых векторизованных данных.

  3. Кросс-валидация: Обязательно используйте кросс-валидацию для оценки производительности вашей модели, чтобы избежать переобучения.

  4. Сравнение моделей: Вам также стоит протестировать различные комбинации и архитектуры модели. Например, можно разрабатывать независимые модели для текстовых и числовых данных и комбинировать их результаты (метод стекинга) если их корреляции не высокие.

Заключение

Интеграция числовых и текстовых данных для создания предсказательной модели может значительно повысить точность ваших прогнозов. Помните о важности этого подхода и необходимости вэкспериментах с различными методами и алгоритмами. Если вы будете следовать данной методологии, это приведёт вас к успешному завершению вашего проекта в области науки о данных. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...