【发布时间】:2020-12-01 08:31:15
【问题描述】:
对于 ML 课程,我应该基于训练集构建一个模型来预测验证集上的变量“classe”。我删除了训练集中所有不必要的变量,使用交叉验证来防止过度拟合,并确保验证集在删除哪些列方面与训练集匹配。当我预测验证集中的类时,它会产生所有类 A,我知道这是不正确的。
我在下面包含了整个脚本。
我哪里做错了?
library(caret)
download.file("https://d396qusza40orc.cloudfront.net/predmachlearn/pml-training.csv", "train.csv")
download.file("https://d396qusza40orc.cloudfront.net/predmachlearn/pml-testing.csv", "test.csv")
train <- read.csv("./train.csv")
val <- read.csv("./test.csv")
#getting rid of columns with NAs
nas <- sapply(train, function(x) sum(is.na(x)))
train <- train[, nas<1900]
#removing near zero variance columns
remove <- nearZeroVar(train)
train <- train[, -remove]
#create partition in our training set
set.seed(8675309)
inTrain <- createDataPartition(train$classe, p = .7, list = FALSE)
training <- train[inTrain,]
testing <- train[-inTrain,]
model <- train(classe ~ ., method = "rf", data = training)
confusionMatrix(predict(model, testing), testing$classe)
#make sure validation set has same features as training set
trainforvalid <- subset(training, select = -classe)
val <- val[, colnames(trainforvalid)]
predict(model, val)
#the above step yields all predictions as classe A
【问题讨论】:
-
如果它预测所有的 A,它怎么能给出 0.99 的 ACC,但 A 只占数据的 0.284(根据你在 Khelifi 的答案中对目标的分布)?
-
此外,删除
zeroVar是您应该考虑的事情。如果您有一个特征X1在 [10^(-10),10^(-8) ] 的范围内,由于规模,它本质上会具有“低方差”,但它可能非常清楚将您的班级分开,例如每个班级可以是医疗产品,X1是给定活性化学物质的数量。使用归一化/缩放方差代替 IMO
标签: r machine-learning random-forest prediction