Вопрос или проблема
Я создал модель наивного байеса для классификации текста. Она предсказывает правильно. Но она возвращает ‘NA’ в результатах предсказания, если я задаю ‘type = raw’. Я видел некоторые результаты на Stackoverflow о добавлении шума. Когда я это делаю, я получаю все категории A как 0 и все категории B как 1. Как я могу получить правильные вероятности в наивном байесе?
library('tm');
library('e1071');
library('SparseM');
Sample_data <- read.csv("products.csv");
traindata <- as.data.frame(Sample_data[1:60,c(1,2)]);
testdata <- as.data.frame(Sample_data[61:80,c(1,2)]);
trainvector <- as.vector(traindata$Description);
testvector <- as.vector(testdata$Description);
trainsource <- VectorSource(trainvector);
testsource <- VectorSource(testvector);
traincorpus <- Corpus(trainsource);
testcorpus <- Corpus(testsource);
traincorpus <- tm_map(traincorpus,stripWhitespace);
traincorpus <- tm_map(traincorpus,tolower);
traincorpus <- tm_map(traincorpus, removeWords,stopwords("english"));
traincorpus<- tm_map(traincorpus,removePunctuation);
testcorpus <- tm_map(testcorpus,stripWhitespace);
testcorpus <- tm_map(testcorpus,tolower);
testcorpus <- tm_map(testcorpus, removeWords,stopwords("english"));
testcorpus<- tm_map(testcorpus,removePunctuation);
trainmatrix <- t(TermDocumentMatrix(traincorpus));
testmatrix <- t(TermDocumentMatrix(testcorpus));
model <- naiveBayes(as.matrix(trainmatrix),as.factor(traindata$Group));
results <- predict(model,as.matrix(testmatrix))
Я предполагаю, что вы имеете в виду этот пост на Stackoverflow, который упоминает о добавлении шума в данные, поскольку ошибка, похоже, возникает, когда в наборе данных есть один (или небольшой) экземпляр класса. Так ли это с обучающими данными? Если то, что вы пытаетесь предсказать, является редким событием, то одной из рекомендаций может быть балансировка обучающих данных путем увеличения редкого класса (таким образом добавляя шум).
Если вышеуказанное не работает, еще одна рекомендация – удалить редкие термины в вашей матрице терм-документ с помощью функции removeSparseTerms
.
Если говорить шире, учитывая объем обучающих данных, было бы хорошо оценить, достаточна ли матрица терм-документ с содержащимися словами или частотой определенных слов для различения классов. Если нет, вам следует рассмотреть возможность добавления новых признаков для описания набора данных.
Несколько предложений:
- количество положительных/отрицательных слов или индекс настроения, который варьируется от -1 до 1, если это важно для ваших данных
- типы слов в наборе данных (индекс или количество прилагательных, существительных или глаголов), опять же в зависимости от вашей задачи и данных
- вместо использования матрицы терм-документ, попробуйте фразы из существительных
Наконец, я предполагаю, что ваши тестовые данные содержат записи для обоих классов. Если нет, то оценить модель будет трудно.
Надеюсь, это поможет. Если вы сможете сформулировать свой вопрос более четко с описанием проблемы и предоставить несколько примеров данных, это поможет.
Ответ или решение
Ваш вопрос касается предсказаний модели наивного байеса, которая возвращает ‘NA’ при использовании типа ‘raw’. Мы рассмотрим несколько возможных причин, почему это происходит, и предложим решения для улучшения ваших предсказаний.
Причины возникновения NA
-
Редкие классы в обучающих данных: Если в ваших обучающих данных есть классы, которые представлены очень небольшим количеством образцов, модель может не уметь корректно предсказывать вероятности для этих классов. Это может произойти, когда в тестовых данных представлено слишком мало экземпляров одного из классов.
-
Отсутствие признаков: Если в вашем терминном документе отсутствуют термины, необходимые для классификации, модель не сможет сделать корректное предсказание, что может также привести к NA результатам.
-
Слишком много редких или незаслуженно высоких частот: Если некоторые термины появляются слишком редко в обучающих данных, их влияние на модель может стать незначительным, что приведет к проблемам при предсказаниях.
Решения
-
Балансировка данных: Если один из классов представлен в обучающем наборе данных недостаточно, попробуйте увеличить количество экземпляров этого класса. Это можно сделать с помощью методов увеличения выборки, таких как дублирование данных или генерация синтетических примеров.
library(ROSE) traindata_balanced <- ovun.sample(Group ~ ., data = traindata, method = "both", N = 100, seed = 1)$data
-
Удаление редко встречающихся термов: Используйте функцию
removeSparseTerms
, чтобы избавиться от редких слов в вашем термино-документном матрице. Это может помочь модели сосредоточиться на более значимых терминах и устранить шум.trainmatrix <- removeSparseTerms(TermDocumentMatrix(traincorpus), sparse = 0.95)
-
Добавление новых признаков: Убедитесь, что ваши обучающие данные содержат достаточно информации. Рассмотрите возможность добавления дополнительных признаков, таких как:
- Индикаторы настроения (количество положительных и отрицательных слов).
- Частота использования различных частей речи (например, существительных или прилагательных).
-
Проверка тестовых данных: Подтвердите, что ваши тестовые данные содержат примеры для всех классов. Если это не так, модель не сможет производить корректные предсказания.
table(testdata$Group) # Убедитесь, что все классы представлены
-
Использование нормализации: Возможно, стоит исследовать возможность нормализации или добавления маленького значения (например, лапласовского сглаживания) к вероятностям, чтобы избежать нулевых вероятностей.
Заключение
Работа с наивным байесом может потребовать некоторой подгонки ваших данных и моделей. Постарайтесь также визуализировать данные и предсказания модели, чтобы лучше понять, где может быть проблема. Если у вас есть возможность, предоставьте примеры ваших данных и предсказаний, чтобы сообщество могло помочь вам более детально. Удачи в ваших анализах!