当前位置: 首页 > 知识库问答 >
问题:

如何使用交叉验证来确定使用训练、验证和测试集的最终模型

孙莫希
2023-03-14

*种子为重复性设置为123,我运行的是3.63 R。

library(pacman)
pacman::p_load(readr, caret, tidyverse, dplyr)

# Download the dataset:
download.file("https://raw.githubusercontent.com/christianmckinnon/StackQ/master/LifeExpectancyData.csv", "LifeExpectancyData.csv")

# Read in the data:
led <-read_csv("LifeExpectancyData.csv")

# Check for NAs
sum(is.na(led))
# Set all NAs to 0
led[is.na(led)] <- 0

# Rename `Life expectancy` to life_exp to avoid using spaces
led <-led %>% rename(life_exp = `Life expectancy`)

# Partition training and test sets
set.seed(123, sample.kind = "Rounding")
test_index <- createDataPartition(y = led$life_exp, times = 1, p = 0.2, list = F)
led_train <- led[-test_index,]
led_test <- led[test_index,]

# Add RMSE as unit of error measurement
RMSE <-function(true_ratings, predicted_ratings){
  sqrt(mean((true_ratings - predicted_ratings)^2))
}

# Create a linear model
led_lm <- lm(life_exp ~ GDP, data = led_train)
# Create prediction
lm_preds <-predict(led_lm, led_test)
# Check RMSE
RMSE(led_test$life_exp, lm_preds)
# The linear Model achieves an RMSE of 9.81141

# Create a Random Forest Model with Repeated Cross Validation
led_cv <- trainControl(method = "repeatedcv", number = 5, repeats = 3,
                      search = "random")
# Set the seed for reproducibility:
set.seed(123, sample.kind = "Rounding")
train_rf <- train(life_exp ~ GDP, data = led_train,
                  method = "rf", ntree = 150, trControl = led_cv,
                  tuneLength = 5, nSamp = 1000, 
                  preProcess = c("center","scale"))
# Create Prediction
rf_preds <-predict(train_rf, led_test)
# Check RMSE
RMSE(led_test$life_exp, rf_preds)
# The rf Model achieves an RMSE of 9.828415

# kNN Model:
knn_cv <-trainControl(method = "repeatedcv", repeats = 1)
# Set the seed for reproducibility:
set.seed(123, sample.kind = "Rounding")
train_knn <- train(life_exp ~ GDP, method = "knn", data = led_train,
                   tuneLength = 10, trControl = knn_cv,
                   preProcess = c("center","scale"))
# Create the Prediction:
knn_preds <-predict(train_knn, led_test)
# Check the RMSE:
RMSE(led_test$life_exp, knn_preds)
# The kNN model achieves the lowest RMSE of 8.923281

共有1个答案

云宝
2023-03-14

我的方法如下。最终的模型应该使用所有的数据。我不确定是什么动机不包括所有的数据在最终的模型。你只是在丢弃预测力。

对于交叉验证,只需将数据拆分为训练和测试数据即可。然后为完整模型选择性能最好的建模方法,再创建完整模型。

当前代码的更大问题是交叉验证方法可能会导致两个结果:虚假的准确性和潜在的虚假模型比较。在交叉验证中需要处理时间自相关。例如,如果我的训练数据集有英国2014年和2016年的特征,那么你就会期望像一个随机森林这样的东西能够高精度地预测2015年的预期寿命。这可能就是您在当前交叉验证类型中所要测量的全部内容。最好创建一个独立的数据集,以便训练和测试中的国家是不同的,或者将其划分为明显不同的时间段。确切的方法取决于您希望模型预测的内容

 类似资料:
  • 本文向大家介绍scikit-learn 使用交叉验证训练分类器,包括了scikit-learn 使用交叉验证训练分类器的使用技巧和注意事项,需要的朋友参考一下 示例 使用虹膜数据集: 数据分为训练集和测试集。要做到这一点,我们使用train_test_split效用函数来分割双方X和y(数据和目标矢量)用随机选择train_size=0.75(训练集包含数据的75%)。 训练数据集被输入到k最近邻

  • 问题内容: 将NumPy数组随机分为训练和测试/验证数据集的好方法是什么?与Matlab中的或函数类似。 问题答案: 如果要将数据集分成两半,可以使用,或者需要跟踪索引: 要么 有多种方法可以重复分区同一数据集以进行交叉验证。一种策略是从数据集中重复采样: 最后,sklearn包含几种交叉验证方法(k折,nave -n-out等)。它还包括更高级的“分层抽样”方法,这些方法创建了针对某些功能平衡的

  • 问题内容: 我想通过交叉验证从Logistic回归模型预测概率。我知道您可以获取交叉验证分数,但是可以从predict_proba返回值而不是分数吗? 问题答案: 现在,这已作为scikit- learn版本0.18的一部分实现。您可以将’method’字符串参数传递给cross_val_predict方法。文档在这里。 例: 还要注意,这是新的sklearn.model_selection包的一

  • 我的问题是,我得到了一个结果非常好的模型(训练和交叉验证),但当我再次测试它(使用不同的数据集)时,会出现糟糕的结果。 我得到了一个经过训练和交叉验证测试的模型。模型显示AUC=0.933、TPR=0.90和FPR=0.04 我猜看图片时没有过度拟合,对应于学习曲线(错误)、学习曲线(分数)和偏差曲线: 问题是,当我用不同的测试数据集测试这个模型时,我得到的结果很差,与我的previus结果AUC

  • 交叉验证 那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候。比如在我日常项目里面,对于普通适中问题,如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择模型。如果样本大于一万条的话,我们一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预