Фактор, производящий значения NA во время SVM в R - PullRequest
0 голосов
/ 04 мая 2020

Мне не удалось найти ответы от соответствующего поста к вызову factor (), производящему значения NA. Я все еще изучаю R, извините, если вы находите этот пост глупым. При первом вызове factor () в наборе данных создается 167 значений NA. С помощью upSample () столбец «Class» добавляется в набор данных, это то, что я прочитал из документации R (с помощью («upSample»)). После этой строки кода, с помощью str () я обнаружил, что она имеет аналогичную тенденцию, подобную столбцу «is_patient» (переменная предиктора / класса), и по сумме (is.na ()) она выдает 832 значения NA. Теперь определенно что-то не так. Я также получил предупреждение о вызове createDataPartition (). Я все еще двигался вперед в надежде на позитивность. Но я знал, что это станет ужасным, как и ожидалось, при обучении модели SVM это не удалось из-за значений NA. Вот ссылка на код, набор данных и изображения для ошибок:

https://github.com/JordanTheDodger/SVM- Ps: Код не длинный, поэтому я добавляю сообщение также:

library(readr)
library(party)
library(caret)
library(ggplot2)
library(pROC)

df <- read_csv(file.choose())
str(df)
head(df)
names(df)
df <- df[,-2]
sum(is.na(df))
df$alkphos[is.na(df$alkphos)] <- median(df$alkphos, na.rm = T)
mdf <- df
str(mdf$is_patient)
head(mdf)

#factor
mdf$is_patient <- factor(mdf$is_patient, levels = c(0,1))
str(mdf) #1st factor call 2 levels, 167 producing na values 
sum(is.na(mdf))
set.seed(1234)
mdf <- data.frame(mdf)
str(mdf) # 1st data.frame call, 2 levels
names(mdf)

#updsmpling
mdf <- upSample(x=mdf, mdf$is_patient) 
mdf <- mdf[sample(nrow(mdf)),]
names(mdf) # "Class" column is added
str(mdf)
sum(is.na(mdf)) #832 na values
mdf <- subset(mdf[c(1:10)])
sum(is.na(mdf))#416 NA values
data_part <- createDataPartition(y= mdf$is_patient, p=0.7, list=FALSE)

#spliting the dataset
training <- mdf[data_part,]
testing <- mdf[-data_part,]
str(training) 
sum(is.na(training)) #292 NA values
trainCtrl <- trainControl(method = "repeatedcv", number = 10, repeats = 3)
set.seed(7777)

svmModel3 <- train(is_patient ~ ., data = training, method = "svmRadial",
                   trControl = trainCtrl, preProcess = c("center", "scale"),
                   tuneLength = 20) 
svmModel3

predictor <- predict(svmModel3)

1 Ответ

0 голосов
/ 10 мая 2020

Я нашел решение. Изучая документацию по факторам, мне нужно преобразовать столбец с типом данных int с использованием as.interger (), а затем выполнить факторинг. Ниже приведен фрагмент кода:

is_patient <- df$is_patient levels(is_patient)[is_patient] is_patient = factor(is_patient) as.numeric(is_patient)

...