0

I'm new to R. I have an issue, but haven't found solutions that work for me.

When calling prediction on a saved object, I get the following error: Error in UseMethod("predict") : no applicable method for 'predict' applied to an object of class "character"

Note that after loading the saved objects, they show Values in my environment. But, when they are first created, they show up as Data. Perhaps this is a save/load issue, but I don't see it.

I have the following:

  1. Reloaded libraries. No change (Prediction using saved model object)
  2. Tried solution to #94 (https://github.com/facebook/prophet/issues/94), and gotten another error (maybe that's about Prophet and not R?): Error in loadNamespace(name) : there is no package called ‘devtools’
## Load required packages
required.packages = c("ggplot2", "readr", "tidyr", "tree")
lapply (required.packages, require, character.only=TRUE)

## Load data 
data.all <- read.csv("BreastCancerWisconsinDataSet.csv")

## Some simple cleaning and set up
 
# set the target: we are trying to predict whether a diagnosis is malignant (M) or benign (B).
data.all$target [data.all$diagnosis == "M"] = 1
data.all$target [data.all$diagnosis == "B"] = 0

# all variables available for training
vars <- names(data.all)[c(-1, -2, -33)]
data.all <- data.all[c(-1, -2, -33)]

# split data into training vs testing
set.seed(1000)
data.all$rand <- runif(nrow(data.all))
data.training <- data.all[which(data.all$rand <= 0.5), ] 
data.testing <- data.all[which(data.all$rand > 0.5), ]

##
# Save the data.all, data.training and data.testing objects into appropriately named .RData files
##
save(data.all, file = "Chunk_13_35_data_all.RData")
save(data.training, file = "Chunk_13_35_data_training.RData")
save(data.testing, file = "Chunk_13_35_data_testing.RData")


## Clean up (dont need data.all anymore)
rm(data.all)

## Fit a simple decision tree model
Tree.m1 <- tree (target ~ radius_mean + 
                           texture_mean +
                           perimeter_mean +
                           area_mean +
                           smoothness_mean  + 
                           compactness_mean +
                           concavity_mean   +
                           concave.points_mean +
                           symmetry_mean, 
                 data = data.training)

##
# Save the Tree.m1 model into and appropriately named .RData file
##
save(Tree.m1, file = "Chunk_13_35_tree_m1.RData")

## Predict results - re-run this code after you reload the objects you saved. Make sure the results are the same!
Tree.m1.pred.train = predict(Tree.m1, data.training, type = "vector")
Tree.m1.pred.train  = ifelse(Tree.m1.pred.train > 0.5, 1, 0)
error = mean(Tree.m1.pred.train != data.training$target)
print(paste('Tree Training Model Accuracy', 1-error))

Tree.m1.pred.test = predict(Tree.m1, data.testing, type = "vector")
Tree.m1.pred.test = ifelse(Tree.m1.pred.test > 0.5, 1, 0)
error = mean(Tree.m1.pred.test != data.testing$target)
print(paste('Tree Testing Model Accuracy', 1-error))

## Clean up
rm(list = ls()) # This will remove all objects in the environment

######
# Check that can run on saved objects
######

required.packages = c("ggplot2", "readr", "tidyr", "tree")
lapply (required.packages, require, character.only=TRUE)

# Note that tried to add devtools line here.

data.training <- load("Chunk_13_35_data_training.RData")
data.testing <- load("Chunk_13_35_data_testing.RData")
Tree.m1 <- load("Chunk_13_35_tree_m1.RData")

Tree.m1.pred.train = predict(Tree.m1, data.training, type = "vector")   # Error occurs here
Tree.m1.pred.train  = ifelse(Tree.m1.pred.train > 0.5, 1, 0)
error = mean(Tree.m1.pred.train != data.training$target)
print(paste('Tree Training Model Accuracy', 1-error))

Tree.m1.pred.test = predict(Tree.m1, data.testing, type = "vector")
Tree.m1.pred.test = ifelse(Tree.m1.pred.test > 0.5, 1, 0)
error = mean(Tree.m1.pred.test != data.testing$target)
print(paste('Tree Testing Model Accuracy', 1-error))
cngzz1
  • 143
  • 2
  • 9
  • See if you can distill the issue you're seeing into a very short, clear, reproducible example. This is a lot of code, which makes hunting for the key problem noisier. For example, you probably don't need to include all of the specific predictors, or even a proper train/test split, to reproduce the main error with `predict` on a saved object. At minimum, please provide data that can reproduce the issue (this code loads from a CSV). But you're much more likely to get better help, faster, with a [mcve]. – andrew_reece Dec 25 '20 at 00:56
  • BTW, your use of `require` is wrong and prone to unrecognized failure. Either use `library` or do something with what `require` returns. If not, you will at some point silently fail and wonder why package xyz does not seem to be available. https://stackoverflow.com/a/51263513/3358272 – r2evans Dec 25 '20 at 01:24

1 Answers1

1

If you want to load the object that is written by "save" command, then when you want to load it, you shouldn't have to assign it. Please check the following code :

required.packages = c("ggplot2", "readr", "tidyr", "tree")
lapply (required.packages, require, character.only=TRUE)

## Load data 
data.all <- read.csv("BreastCancerWisconsinDataSet.csv")

## Some simple cleaning and set up

# set the target: we are trying to predict whether a diagnosis is malignant (M) or benign (B).
data.all$target [data.all$diagnosis == "M"] = 1
data.all$target [data.all$diagnosis == "B"] = 0

# all variables available for training
vars <- names(data.all)[c(-1, -2, -33)]
data.all <- data.all[c(-1, -2, -33)]

# split data into training vs testing
set.seed(1000)
data.all$rand <- runif(nrow(data.all))
data.training <- data.all[which(data.all$rand <= 0.5), ] 
data.testing <- data.all[which(data.all$rand > 0.5), ]

##
# Save the data.all, data.training and data.testing objects into appropriately named .RData files
##
save(data.all, file = "Chunk_13_35_data_all.RData")
save(data.training, file = "Chunk_13_35_data_training.RData")
save(data.testing, file = "Chunk_13_35_data_testing.RData")


## Clean up (dont need data.all anymore)
rm(data.all)

## Fit a simple decision tree model
Tree.m1 <- tree (target ~ radius_mean + 
                   texture_mean +
                   perimeter_mean +
                   area_mean +
                   smoothness_mean  + 
                   compactness_mean +
                   concavity_mean   +
                   concave.points_mean +
                   symmetry_mean, 
                 data = data.training)

##
# Save the Tree.m1 model into and appropriately named .RData file
##
save(Tree.m1, file = "Chunk_13_35_tree_m1.RData")

## Predict results - re-run this code after you reload the objects you saved. Make sure the results are the same!
Tree.m1.pred.train = predict(Tree.m1, data.training, type = "vector")
Tree.m1.pred.train  = ifelse(Tree.m1.pred.train > 0.5, 1, 0)
error = mean(Tree.m1.pred.train != data.training$target)
print(paste('Tree Training Model Accuracy', 1-error))

Tree.m1.pred.test = predict(Tree.m1, data.testing, type = "vector")
Tree.m1.pred.test = ifelse(Tree.m1.pred.test > 0.5, 1, 0)
error = mean(Tree.m1.pred.test != data.testing$target)
print(paste('Tree Testing Model Accuracy', 1-error))

## Clean up
rm(list = ls()) # This will remove all objects in the environment

######
# Check that can run on saved objects
######

required.packages = c("ggplot2", "readr", "tidyr", "tree")
lapply (required.packages, require, character.only=TRUE)

# Note that tried to add devtools line here.

load("Chunk_13_35_data_training.RData")
load("Chunk_13_35_data_testing.RData")
load("Chunk_13_35_tree_m1.RData")

Tree.m1.pred.train = predict(Tree.m1, data.training, type = "vector")   # Error occurs here
Tree.m1.pred.train  = ifelse(Tree.m1.pred.train > 0.5, 1, 0)
error = mean(Tree.m1.pred.train != data.training$target)
print(paste('Tree Training Model Accuracy', 1-error))

Tree.m1.pred.test = predict(Tree.m1, data.testing, type = "vector")
Tree.m1.pred.test = ifelse(Tree.m1.pred.test > 0.5, 1, 0)
error = mean(Tree.m1.pred.test != data.testing$target)
print(paste('Tree Testing Model Accuracy', 1-error))

That's work for me actually.

Furthermore, if you want to save the object then load it with the assigned variable, try using command "saveRDS" then "readRDS" instead.

Ahmad Zaenal
  • 148
  • 1
  • 7