2017-02-20 4 views
0

Я задал эти вопросы в списке рассылки R, но я думаю, что здесь лучше найти ответы и советы.Работа с различиями в пространственных объектах относительно классификации текста с использованием SVM

В настоящее время я работаю над текстовой классификацией эссе студента, стараясь идентифицировать тексты, соответствующие определенному классу. Я использую тексты от одного семестра (A) для обучения и текстов из другого семестра (B) для тестирования . Мой рабочий выглядит так:

  • прочитать все тексты из A, построить DTM (A) с около 1387 терминов (пакет тм)
  • читать все тексты из B, построить DTM (B) с примерно 626 термины
  • поезд классификатор с DTM (A), с помощью SVM (пакет e1071)

Теперь я хочу, чтобы классифицировать все тексты в DTM (B) с помощью classifyer. Но , когда я пытаюсь использовать pred(), я всегда получаю сообщение об ошибке: Ошибка в eval (expr, envir, enc): объект «XY» не найден. Как я выяснил, причиной этого является то, что DTM (A) и DTM (B) имеют другое число , и поэтому не каждый термин, используемый для обучения модели, - , доступный в DTM (B).

Уверен, что это сложно сделать с помощью двух разных пространств объектов, но я хочу найти решение для этой «реальной проблемы». Идея состоит в том, чтобы идентифицировать текст или текст, который был добавлен студентом, соответствует другим текстам или нет. Поэтому моя наивная идея состоит в том, чтобы разработать модель прогнозирования с текстами из одного семестра [DTM (A)], а затем использовать эту модель для оценки нового текста из другого семестра [DTM (B)]. Поскольку новый текст отсутствует в исходном DTM, отличительные черты отличаются. До сих пор я только нашел код, который использует DTM, созданный из всех текстов, но для этого потребуется создать новый DTM (A) `и переустанавливать SVM каждый раз.

Мой вопрос: как я должен это иметь? Должен ли я соответствовать условиям , используемым в DTM (A) и DTM (B), чтобы получить идентичное пространство для объектов? Это может быть достигнуто либо сокращением числа терминов в DTM (A), либо , добавив несколько пустых/NA столбцов в DTM (B). Или есть другое решение к моей проблеме?

Сердечные приветы

Бьорн

+0

Я думаю, http://stackoverflow.com/questions/39721737/how-to-handle-errors-in-predict-function-of-r может вам помочь. – abhiieor

+0

Спасибо, но связанная с публикацией публикация не касается разных пространств объектов, что означает разные столбцы в DTM, но о разных уровнях категориальных переменных. – PsyR

+0

Вы можете обобщить. Никакой метод машинного обучения не может справиться с новыми предикторами; которые вы получаете, когда создаете фиктивные переменные для категориальной переменной с новыми уровнями. По существу, как сказано в моем ответе, вам нужно сохранить список переменных, которые являются частью обучения и, следовательно, модели. Отфильтруйте данные теста/предсказания на основе этого списка, а затем продолжите с оценкой на обученном объекте. – abhiieor

ответ

0

После еще нескольких экспериментов и некоторых исследований, я наткнулся на пакет RTextTools и его функции «create_matrix()». Эта функция создает новый DTM, и вы также можете настроить матрицу на оригинальную матрицу, которая была использована для обучения модели. Это именно то, что я искал. Так что я смотрел на исходном коде (https://github.com/timjurka/RTextTools/blob/master/RTextTools/R/create_matrix.R) и придумал это:

# get all the terms which are in the training df, but not in the test df 
terms <- colnames(train.df[,which(!colnames(train.df) %in% colnames(test.df))]) 
# weight is set, this is just in case that weightTfIdf was used, otherwise it should be 0 
weight <- 0.000000001 
# now create a new matrix with the missing terms 
amat <- matrix(weight, nrow = nrow(test.df), ncol = length(terms)) 
colnames(amat) <- terms 
rownames(amat) <- rownames(test.df) 

# create a new test df with the original values plus the new matrix with the missing terms 
test.df.fixed <- cbind(test.df[,which(colnames(test.df) %in% colnames(train.df))],amat) 
test.df.fixed <- test.df.fixed[, sort(colnames(test.df.fixed))] 

Результата является кадром данных теста, который имеет все функции (столбцы) кадр данных, который был использован для обучения. Так что это в основном «up-filtering», а не down-filtering. Быстрый тест показал, что он работает достаточно хорошо (Точность: .91, Каппа: .88).

0

В реальном мире данные по обучению и тестированию полностью независимы. Это означает, что вы ничего не знаете о своих тестовых документах. Наилучший способ решить вашу проблему, имея в виду это, состоит в том, чтобы основать TDM для набора данных B в словаре, используемом в наборе данных A (например, только считать слова, которые произошли в A).

Смежные вопросы