R中predict()函数无法输出验证集预测结果的技术求助
问题描述
训练集包含87620行、5列数据,测试集行列数与训练集一致。使用CART模型预测目标变量Default时,模型运行正常且输出结果正常。但使用19561行、6列且不含Default变量的验证集执行View(validationsetpreds.CART3.3x)后,得到异常结果,测试集执行相同命令则显示正常。
用户完整代码:
set.seed(123) loans_training$Default <- as.factor(loans_training$Default)#Make the default variable categorical loans_test$Default <- as.factor(loans_test$Default)#Make the default variable categorical loans_training$term <- as.factor(loans_training$term) loans_test$term <- as.factor(loans_test$term) #Standardize datasets library(psych) library(caret) preprocess.train.z <- preProcess(loans_training[1:5], method = c("center", "scale")) preprocess.train.z loans_train.z <- predict(preprocess.train.z,loans_training[1:5]) describe(loans_train.z) View(loans_train.z) summary(loans_train.z$Default) preprocess.test.z <- preProcess(loans_test[1:5], method = c("center", "scale")) preprocess.test.z loans_test.z <- predict(preprocess.test.z,loans_test[1:5]) describe(loans_test.z) View(loans_test.z) summary(loans_train.z$Default) (22417 * 2.3) + 22417 #Resampling subroutine rare.record.indices <- which(loans_train.z$Default == "1") rare.indices.resampled <- sample(x = rare.record.indices,size = 51559, replace = TRUE) rare.records.resampled <- loans_train.z[rare.indices.resampled,] loans_train.3.3x <- rbind(loans_train.z, rare.records.resampled) table(loans_train.3.3x$Default) #Develop 3.3x CART model TC <- trainControl(method = "CV", number = 10) fit.CART.3.3x <- train(Default ~ ., data = loans_train.3.3x, method = "rpart", trControl = TC) fit.CART.3.3x$resample testsetpreds.CART3.3x <- predict(fit.CART.3.3x,loans_test.z) table(loans_test.z$Default, testsetpreds.CART3.3x) testsetpreds.CART3.3x #Predictions set.seed(123) loans_validation$grade <- as.character(loans_validation$grade)#Make the grade variable categorical loans_validation$term <- as.factor(loans_validation$term)#Make the term variable categorical loans_validation$Index <- as.factor(loans_validation$Index)#Make the Index variable categorical #Standardize dataset library(psych) library(caret) preprocess.validation.z <- preProcess(loans_validation[1:6], method = c("center", "scale")) preprocess.validation.z loans_validation.z <- predict(preprocess.validation.z,loans_validation[1:6]) #Predict Defaults using Cart validationsetpreds.CART3.3x <- predict(fit.CART.3.3x,loans_validation.z) View(validationsetpreds.CART3.3x)
问题根源
- 预处理规则不统一:训练集、测试集、验证集各自单独做标准化,导致数据缩放/中心化的基准不一致,模型无法识别验证集的特征分布。
- 特征列不匹配:验证集多了
Index列,而模型训练时仅使用了训练集的5个特征,多余列会干扰预测逻辑。 - 变量类型错误:将
grade转为字符型,而训练集里grade应为因子型,类型不匹配会导致模型无法解析该特征。
修正方案
1. 核心修正原则
- 复用训练集的预处理规则处理所有外部数据集(测试集、验证集)
- 保证验证集的特征列、变量类型与训练集完全对齐(除目标变量
Default外)
2. 修正后完整代码
set.seed(123) # 训练集与测试集基础处理 loans_training$Default <- as.factor(loans_training$Default) loans_test$Default <- as.factor(loans_test$Default) loans_training$term <- as.factor(loans_training$term) loans_test$term <- as.factor(loans_test$term) # 加载依赖库(仅需一次) library(psych) library(caret) # 基于训练集生成预处理规则,复用至测试集与验证集 train_features <- setdiff(colnames(loans_training), "Default") preprocess.train.z <- preProcess(loans_training[, train_features], method = c("center", "scale")) loans_train.z <- predict(preprocess.train.z, loans_training) loans_test.z <- predict(preprocess.train.z, loans_test) # 重采样步骤(保留原逻辑) rare.record.indices <- which(loans_train.z$Default == "1") rare.indices.resampled <- sample(x = rare.record.indices, size = 51559, replace = TRUE) rare.records.resampled <- loans_train.z[rare.indices.resampled,] loans_train.3.3x <- rbind(loans_train.z, rare.records.resampled) table(loans_train.3.3x$Default) # 训练CART模型(保留原逻辑) TC <- trainControl(method = "CV", number = 10) fit.CART.3.3x <- train(Default ~ ., data = loans_train.3.3x, method = "rpart", trControl = TC) # 测试集预测(保留原逻辑) testsetpreds.CART3.3x <- predict(fit.CART.3.3x, loans_test.z) table(loans_test.z$Default, testsetpreds.CART3.3x) # 验证集修正处理 set.seed(123) # 对齐变量类型:与训练集保持一致 loans_validation$grade <- as.factor(loans_validation$grade) loans_validation$term <- as.factor(loans_validation$term) # 移除多余的Index列,保留与训练集一致的特征列 loans_validation_clean <- loans_validation[, train_features] # 用训练集的预处理规则标准化验证集 loans_validation.z <- predict(preprocess.train.z, loans_validation_clean) # 执行预测 validationsetpreds.CART3.3x <- predict(fit.CART.3.3x, loans_validation.z) View(validationsetpreds.CART3.3x)
内容的提问来源于stack exchange,提问作者Carlos Ortega
相关产品推荐
相关产品推荐

