функция randomForest () из e1071 выдает мне ошибку, говоря, что NA вводятся, когда в наборе данных нет NA - PullRequest
0 голосов
/ 20 июня 2020

Я прошел несколько курсов машинного обучения R с примерами использования для торговли. Я загрузил некоторые данные, GE в этом примере, добавил несколько столбцов индикаторов и разделил данные на обучающий и тестовый наборы (75% против 25%). Я запустил наивный байесовский компьютер с векторной поддержкой без каких-либо проблем, но функция randomForest из пакета e1071 выдает ошибку. Я упростил свой код на случай, если вы запустите его, чтобы вы не загружали столько данных:

require(dplyr)
require(quantmod)
require(e1071)
getSymbols("GE",from="2015-01-01")
GE_data_frame <- as.data.frame(GE)
GE_data_frame$Absolute.Return <- abs(GE_data_frame$GE.Open-GE_data_frame$GE.Adjusted)
GE_data_frame$Next.Day.Return <- shift(GE_data_frame$Absolute.Return,1)
GE_data_frame$Candle.Type <- ifelse(GE_data_frame$GE.Adjusted<GE$GE.Open,"Bear","Bull")
GE_data_frame$Candle.Type.Previous <- lag(factor(GE_data_frame$Candle.Type, n = 1))
GE_data_frame$Next.Candle <- lead(factor(GE_data_frame$Candle.Type,n=1))
GE_data_frame$Seven.SMA <- na.locf(SMA(GE_data_frame$GE.Adjusted,7),fromLast = TRUE)
GE_data_frame$Ten.SMA <- na.locf(SMA(GE_data_frame$GE.Adjusted,10),fromLast = TRUE)
GE_data_frame$Twenty.SMA <- na.locf(SMA(GE_data_frame$GE.Adjusted,20),fromLast = TRUE)

#slice the first 20 rows of the data set out since they contain wrong SMAs/slopes
GE_data_frame <- slice(GE_data_frame,21:nrow(GE_data_frame))
training_range <- round(nrow(GE_data_frame)*.75,digits = 0);print(training_range)
training_range <- 1:training_range
test_range <- 1007:1320


training_data <- GE_data_frame[training_range,]
test_data <- GE_data_frame[test_range,]

#define target and predictor variables
target.var <- "Next.Candle"
predictors.var <- c("Candle.Type","Absolute.Return","Candle.Type.Previous","Seven.Under.Ten","Ten.Under.Twenty","Seven.Slope","Ten.Slope","Twenty.Slope","Seven.Ten.Slope.Signal","Ten.Twenty.Slope.Signal")
predictors.var <- paste(predictors.var,collapse = "+")

#define formula (regression)
formula <- as.formula(paste(target.var,"~",predictors.var,sep = ""))

#function for processing predictions
predicted_returns_function <- function(data,pred){
  #pred is our prediction from our ML model
  data$Pred <- pred
  data$PredReturn <- ifelse(data$Next.Candle != data$Pred, -data$Next.Day.Return,data$Next.Day.Return)
  data$CumulativeReturn <- cumsum(data$PredReturn)
  return(data)
}

Это часть алгоритма случайного леса, которая теперь выдает мне ошибку:

require(randomForest)

rf_model <- randomForest(formula,data = training_data)
summary(rf_model)

rf_pred <- predict(rf_model,test_data)

rf_test <- predicted_returns_function(test_data,rf_pred)

plot(rf_test$PredReturn,type = "l")
plot(rf_test$CumulativeReturn,type = "l")

#confusion matrix
confusion_matrix_rf <- table(rf_test$Next.Candle,nb_test$Pred)
confusion_matrix_rf

#accuracy
rf_error <- 1-(mean(rf_test$Next.Candle != rf_test$Pred))
rf_error
...