Вопрос или проблема
Я пытаюсь подогнать набор данных к модели. После масштабирования и удаления ненужных данных набор данных выглядит примерно так:
seconds_log | minutes_log | country_enc | changing | description | Другие переменные признаков |
---|---|---|---|---|---|
14.0058 | 0.693147 | 1 | Ложь | Красное мигание … | Числовые данные |
3.401197 | 3.401197 | 0 | Правда | Белое вращение .. | Числовые данные |
Таким образом, все признаки имеют численные значения, а последний признак “описание” – это длинные тексты. Обратите внимание, что моя целевая переменная – “country_enc”, а остальные столбцы – это переменные признаков. Значения описания нельзя игнорировать. Поэтому я векторизую данные, используя “TfidfVectorizer”.
Мой вопрос: после векторизации столбца описания, что бы я ни получил, как мне объединить это с остальной частью набора данных и затем разделить на тестовую и обучающую модель?
Я вижу несколько примеров в Google, где они говорят;
combined_data = np.hstack((desc_tfidf.toarray(), original_dataframe_without_description))
print (combined_data)
Если я посмотрю на эти комбинированные данные, это numpy.ndarray. Это не очень помогает для подачи в модель классификации.
На основе Комбинировать Sklearn TFIDF с дополнительными данными, если я конвертирую разреженную матрицу в массив и конкатенирую с остальной частью фрейма данных (с содержащимися в нем всеми числовыми значениями), я вижу, что генерируется несколько NaN данных, что и ожидается. Я уже завершил предварительную обработку данных, так что делать это снова – это неправильно.
Я уверен, что это не правильный способ. Может кто-то подсказать, как продвигаться дальше?
Ответ или решение
Чтобы корректно обучить модель, используя набор данных, в котором присутствуют как текстовые строки, так и числовые данные, потребуется следовать нескольким шагам. Давайте разберем этот процесс на примере вашего набора данных, где целевая переменная — "country_enc", а остальные столбцы являются признаками, среди которых есть долгие текстовые описания.
1. Векторизация текстовых данных
Ваша идея использовать TfidfVectorizer
для векторизации столбца "description" вполне разумна. После этого векторизованный текст будет представлен в виде разреженной матрицы, что отлично подходит для большинства алгоритмов машинного обучения. Перед тем как комбинировать эту векторизованную матрицу с остальными данными, убедитесь в том, что векторизация выполнена корректно.
Пример кода для векторизации:
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import numpy as np
# Предполагаем, что у вас есть DataFrame original_dataframe с вашими данными
vectorizer = TfidfVectorizer()
desc_tfidf = vectorizer.fit_transform(original_dataframe['description'])
2. Преобразование разреженной матрицы в плотный формат
Разреженная матрица, возвращаемая TfidfVectorizer
, может быть преобразована в плотный формат (если позволяет размер) для дальнейшего объединения с остальными числовыми данными.
# Преобразование разреженной матрицы в плотный формат, если размер не слишком велик
desc_tfidf_dense = desc_tfidf.todense() # Или desc_tfidf.toarray() для получения массива
3. Объединение данных
Теперь вам нужно объединить полученную матрицу с другими признаками вашего датафрейма, исключая столбец "description":
# Убираем столбец "description" из оригинального DataFrame
original_dataframe_without_description = original_dataframe.drop(columns=['description'])
# Объединяем данные
combined_data = np.hstack((desc_tfidf_dense, original_dataframe_without_description.values))
4. Создание датафрейма из комбинированных данных
Чтобы упростить дальнейшие операции, вы можете создать новый DataFrame из объединенных данных, связав его с целевой переменной.
# Создаем новый DataFrame
combined_df = pd.DataFrame(combined_data)
# Добавляем целевую переменную
combined_df['country_enc'] = original_dataframe['country_enc'].values
5. Разделение данных на обучающий и тестовый наборы
С помощью train_test_split
из библиотеки sklearn
вы можете разделить данные на обучающую и тестовую выборки:
from sklearn.model_selection import train_test_split
# Определяем X (все признаки) и y (целевую переменную)
X = combined_df.drop(columns=['country_enc'])
y = combined_df['country_enc']
# Разделяем данные на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
6. Обучение модели
Теперь вы готовы обучить вашу модель, используя X_train и y_train. Например, если вы используете классификатор, это может выглядеть следующим образом:
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
Заключение
Этот подход позволяет вам эффективно комбинировать текстовую информацию с числовыми данными для любой модели машинного обучения. Убедитесь, что ваши данные должным образом обработаны и нормализованы перед финальным обучением модели.
Следуя данным шагам, вы сможете избежать проблем, связанных с NaN значениями и разными форматами данных, а также создать стабильную модель, которую можно использовать для предсказаний.