Я делаю классификацию текста на основе TF-IDF
модели векторного пространства. У меня всего не более 3000 образцов. Для честной оценки я оцениваю классификатор с использованием 5-кратной перекрестной проверки. Но меня смущает то, что это необходимо для перестроения TF-IDF
векторной пространственной модели при перекрестной проверке каждой складки. А именно, нужно ли мне перестраивать словарь и пересчитывать значение IDF
в словаре при каждой перекрестной проверке сгиба?
В настоящее время я занимаюсь преобразованием TF-IDF на основе набора инструментов scikit-learn и обучаю свой классификатор с помощью SVM. Мой метод заключается в следующем: во-первых, я делю образец в соотношении 3:1, 75 процентов из них применяются для соответствия параметру модели векторного пространства TF-IDF. Здесь параметром является размер словаря и содержащихся в нем терминов, а также IDF
значение каждого термина в словаре. Затем я преобразовываю остаток в этом TF-IDF
SVM
и использую эти векторы для 5-кратной перекрестной проверки (примечательно, что я не использовать предыдущие 75-процентные образцы для преобразования).
Мой код выглядит следующим образом:
# train, test split, the train data is just for TfidfVectorizer() fit
x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, train_size=0.75, random_state=0)
tfidf = TfidfVectorizer()
tfidf.fit(x_train)
# vectorizer test data for 5-fold cross-validation
x_test = tfidf.transform(x_test)
scoring = ['accuracy']
clf = SVC(kernel='linear')
scores = cross_validate(clf, x_test, y_test, scoring=scoring, cv=5, return_train_score=False)
print(scores)
Меня смущает то, что правильный ли мой метод, выполняющий TF-IDF
преобразование и выполняющий 5-кратную перекрестную проверку, или необходимо перестроить TF-IDF
векторное пространство модели с использованием данных поезда, а затем преобразовать в TF-IDF
векторов как с данными обучения, так и с тестом? Просто следующим образом:
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for train_index, test_index in skf.split(data_x, data_y):
x_train, x_test = data_x[train_index], data_x[test_index]
y_train, y_test = data_y[train_index], data_y[test_index]
tfidf = TfidfVectorizer()
x_train = tfidf.fit_transform(x_train)
x_test = tfidf.transform(x_test)
clf = SVC(kernel='linear')
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
score = accuracy_score(y_test, y_pred)
print(score)