【问题标题】:How to solve "cannot coerce class to data.frame?如何解决“无法将类强制转换为 data.frame?
【发布时间】:2020-03-11 05:33:09
【问题描述】:

第 20 行出现问题:x3 <- lm(Salary ~ ...

as.data.frame.default(data) 中的错误:无法将类'c("train", "train.formula")' 强制转换为 data.frame

如何解决?

attach(Hitters)
Hitters

library(caret)
set.seed(123)
# Define training control
set.seed(123) 
train.control <- trainControl(method = "cv", number = 10)
# Train the model
x2 <- train(Salary ~., data = x, method = "lm",
               trControl = train.control)
# Summarize the results
print(x)
x3 <- lm(Salary ~ poly(AtBat,3) + poly(Hits,3) + poly(Walks,3) + poly(CRuns,3) + poly(CWalks,3) + poly(PutOuts,3), data = x2)
summary(x3)
MSE = mean(x3$residuals^2)
print("Mean Squared Error: ")
print(MSE)

【问题讨论】:

  • 很难说。您没有指出Hitters 的来源(R 上有多个版本)。您没有定义x。但很可能是您尝试在对lm 的调用中使用x2 作为数据框。 train 的手册页表明它返回“train 类列表”,它不是一个 data.frame。

标签: r machine-learning regression training-data supervised-learning


【解决方案1】:

首先,正如@dcarlson 已经提到的,您应该定义 x。 其次,x3 不返回数据帧。 如果你跑

str(x2)

您会看到,您在 lm 函数中使用的所有元素都是名为 trainingData 的数据框的一部分。 因此,如果您打算使用 lm 函数,请将其用作 lm 函数中的数据源,NOT x2。 我在下面重写了你的代码。

PS 我远不是 R 专家,所以如果有人想回答这个问题,请继续,我总是愿意学习 ;)

attach(Hitters)
Hitters

library(caret)
set.seed(123)

# Define training control
set.seed(123) 
train.control <- trainControl(method = "cv", number = 10)

# Train the model
x2 <- train(Salary ~., data = x, method = "lm", trControl = train.control)

# Summarize the results
print(x2)
# str(x2) # $trainingData data.frame

x2$trainingData[["AtBat"]]
m <- x2$trainingData

x3 <- lm(Salary ~ poly(AtBat,3) + poly(Hits,3) + poly(Walks,3) + poly(CRuns,3) + poly(CWalks,3) + poly(PutOuts,3), data = m)
summary(x3)
MSE = mean(x3$residuals^2)
cat("Mean Squared Error: ", MSE) # use cat to concatenate text and variable value in one line

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 2017-07-09
    • 2017-04-19
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多