Как использовать функцию прогнозирования с текстовыми категориями? - PullRequest
0 голосов
/ 13 мая 2018

У меня возникли проблемы с функцией предикторов, которая недооценивает (или переоценивает) прогнозы для новой текстовой категории (или ее класса, если они имеют вид спорта ... здоровье .... политик)

Сначала я импортирую матрицу tdm своего корпуса, а затем разделю данные обучения / теста для использования в моей модели с алгоритмом knn.

И это прекрасно работает.

Теперь мне нужно импортировать новый текст неизвестной категории, чтобы предсказать это, но я не знал, как это сделать.

Я не знаю, как использовать функцию прогнозирования

Ошибка

ff<-predict(knn.pred,PathFilename)

Ошибка в UseMethod («прогноз»):
нет применимого метода для предсказания, примененного к объекту класса "фактор"

# Text mining: Corpus and Document Term Matrix
library(tm)
# KNN model
library(class) 
# Stemming words
library(SnowballC)
# CrossTable
library('gmodels')
# function prediction
library(caret) 
# function for factor
library(e1071)
library(SparseM)

# Stemming words

# Read csv with columns: Document , Terms and category
PathFile <- read.csv(file.choose(), sep =";", header = TRUE)
PathFilename<-read.csv(file.choose(), sep =";", header = TRUE)
#Strectur of Csv file
str(PathFile)
tail(PathFile)

# Column bind category (known classification)
#mat.df <- cbind(PathFile, PathFile$Category)
#tail(mat.df)
# Change name of new column to "category"
#colnames(mat.df)[ncol(mat.df)] <- "Category"

# Split data by rownumber into two equal portions
train <- sample(nrow(PathFile), ceiling(nrow(PathFile) * .70))
test <- (1:nrow(PathFile))[- train]

##Show Training Data
train
##Show Test Data
test
#n <- names(PathFile)
#f <- as.formula(paste("Category ~", paste(n[!n %in% "Category"], collapse = " + ")))
#f


# Isolate classifier
cl <- PathFile[, "Category"]

# Create model data and remove "category"
modeldata <- PathFile[,!colnames(PathFile) %in% "Category"]

# Create model: training set, test set, training set classifier
knn.pred <- knn(modeldata[train, ], modeldata[test, ], cl[train], 70)
knn.pred

# Confusion matrix
conf.mat <- table("Predictions" = knn.pred, Actual = cl[test])
conf.mat


ff<-predict(knn.pred,PathFilename) #here i have an error 

ct<-CrossTable(x = cl[test], y = knn.pred, prop.chisq=FALSE)

table(knn.pred,cl[test])

plot(knn.pred,
     xlab = "Number of neighbours(k)",
     main = "Comparison of Accuracy against k",
     type = "b",
     col = "black",
     lwd = 1.8,
     pch = "O")



studentModel <- train(Category ~ ., data=PathFile, method = "knn")
studentTestPred <- predict(model, test) 

# Accuracy
(accuracy <- sum(diag(conf.mat))/length(test) * 100)


# Create data frame with test data and predicted category
setwd("C:/Users/Public/Desktop/")
df.pred <- cbind(knn.pred, modeldata[test, ])
write.table(df.pred, file="output.csv", sep=";")

1 Ответ

0 голосов
/ 13 мая 2018

knn работает иначе, чем многие другие классификаторы.Это «ленивый» классификатор.Там нет модели.Он вычисляет все, когда вам нужно сделать прогноз.Из-за этого не существует метода прогнозирования для knn .Функция knn возвращает свои прогнозы напрямую.Поскольку вы не предоставляете свои данные, я не могу использовать ваш пример, но я проиллюстрирую на встроенных данных, используя код, который является упрощенной версией вашего кода.

library(class)
train <- sample(nrow(iris), ceiling(nrow(iris) * .70))
test <- (1:nrow(iris))[- train]
knn.pred <- knn(iris[train, 1:4], iris[test,1:4 ], iris$Species[train], 5)
knn.pred
 [1] setosa     setosa     setosa     setosa     setosa     setosa     setosa    
 [8] setosa     setosa     setosa     setosa     setosa     setosa     setosa    
[15] setosa     setosa     setosa     setosa     setosa     setosa     versicolor
[22] versicolor versicolor versicolor versicolor versicolor versicolor versicolor
[29] versicolor versicolor versicolor virginica  versicolor versicolor versicolor
[36] versicolor virginica  virginica  virginica  virginica  virginica  virginica 
[43] virginica  virginica  virginica 
Levels: setosa versicolor virginica 

Как видите, knn.predэто не модель.Это прогнозы для тестовых данных.

Чтобы предсказать ваши новые тестовые данные, вам нужно снова запустить knn.

 knn(modeldata[train, ], PathFilename, cl[train], 70)

Это должно привести к предсказаниям, которые вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...