You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题根源
  1. 预处理规则不统一:训练集、测试集、验证集各自单独做标准化,导致数据缩放/中心化的基准不一致,模型无法识别验证集的特征分布。
  2. 特征列不匹配:验证集多了Index列,而模型训练时仅使用了训练集的5个特征,多余列会干扰预测逻辑。
  3. 变量类型错误:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:30:57