TfidfVectorizer.fit_transform
используется для создания словаря из набора обучающих данных, а TfidfVectorizer.transform
используется для сопоставления этого словаря с тестовым набором данных, так что число объектов в тестовых данных остается таким же, как данные поезда. Ниже приведенный пример может помочь:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
Создать фиктивные тренировочные данные:
train = pd.DataFrame({'Text' :['I am a data scientist','Cricket is my favorite sport', 'I work on Python regularly', 'Python is very fast for data mining', 'I love playing cricket'],
'Category' :['Data_Science','Cricket','Data_Science','Data_Science','Cricket']})
И небольшие тестовые данные:
test = pd.DataFrame({'Text' :['I am new to data science field', 'I play cricket on weekends', 'I like writing Python codes'],
'Category' :['Data_Science','Cricket','Data_Science']})
Создать TfidfVectorizer()
объект называется vectorizer
vectorizer = TfidfVectorizer()
Установите его на данные поезда
X_train = vectorizer.fit_transform(train['Text'])
print(vectorizer.get_feature_names())
#['am', 'cricket', 'data', 'fast', 'favorite', 'for', 'is', 'love', 'mining', 'my', 'on', 'playing', 'python', 'regularly', 'scientist', 'sport', 'very', 'work']
feature_names = vectorizer.get_feature_names()
df= pd.DataFrame(X.toarray(),columns=feature_names)
Теперь посмотрим, что произойдет, если вы сделаете то же самое с тестовым набором данных:
vectorizer_test = TfidfVectorizer()
X_test = vectorizer_test.fit_transform(test['Text'])
print(vectorizer_test.get_feature_names())
#['am', 'codes', 'cricket', 'data', 'field', 'like', 'new', 'on', 'play', 'python', 'science', 'to', 'weekends', 'writing']
feature_names_test = vectorizer_test.get_feature_names()
df_test= pd.DataFrame(X_test.toarray(),columns = feature_names_test)
Он создал еще один словарь с тестовым набором данных, который имеет 14 уникальных слов (столбцов) по сравнению с 18 словами (столбцами) из данных поезда.
Теперь, если вы тренируете алгоритм машинного обучения на данных вашего поезда для text-classification
и пытаетесь делать прогнозы для вашей матрицы на основе тестовых данных, он потерпит неудачу и выдаст ошибку о том, что функции отличаются от поезда и теста data.
Чтобы преодолеть эту ошибку, мы делаем что-то подобное в text-classification
:
X_test_from_train = vectorizer.transform(test['Text'])
feature_names_test_from_train = vectorizer.get_feature_names()
df_test_from_train = pd.DataFrame(X_test_from_train.toarray(),columns = feature_names_test_from_train)
Здесь вы заметили, что мы не использовали команду fit_transform
, а использовали transform
для тестовых данных, причина та же: при прогнозировании тестовых данных мы хотим использовать только те функции, которые похожи как в обучающих, так и в тестовых данных, чтобы у нас не было ошибки несоответствия функций.
Надеюсь, это поможет !!