如何在R中让训练集与测试集观测数一致?当前训练集观测数不足
解决方案
要实现训练集与测试集观测数相等,核心是通过采样操作调整其中一个数据集的行数,join/merge类操作用于合并数据集字段,无法实现该需求。根据使用场景可选择以下两种方案:
方案1:下采样测试集(推荐优先使用)
从测试集中随机抽取和训练集行数一致的样本,不会引入训练集过拟合风险。
Python(pandas)实现
假设train_df为训练集DataFrame,test_df为测试集DataFrame:
import pandas as pd # 获取训练集观测数 n_train = len(train_df) # 随机采样测试集,random_state固定保证结果可复现 test_sampled = test_df.sample(n=n_train, random_state=42)
如需保证测试集标签分布和原数据集一致,可使用分层采样:
from sklearn.model_selection import train_test_split test_sampled, _ = train_test_split( test_df, train_size = len(train_df)/len(test_df), stratify = test_df["label"], # label替换为你的标签列名 random_state = 42 )
R实现
假设train_df为训练集数据框,test_df为测试集数据框:
n_train <- nrow(train_df) set.seed(42) test_sampled <- test_df[sample(nrow(test_df), n_train), ]
分层采样实现(需提前安装加载caret包):
library(caret) set.seed(42) sample_idx <- createDataPartition( test_df$label, # label替换为你的标签列名 p = nrow(train_df)/nrow(test_df), list = FALSE ) test_sampled <- test_df[sample_idx, ]
方案2:上采样训练集(仅适用于训练集数据量极小的场景)
对训练集进行有放回重复采样,直到行数和测试集一致,该方案容易引发过拟合,需谨慎使用。
Python(pandas)实现
n_test = len(test_df) # replace=True开启有放回采样,支持抽取比原数据集更多的样本 train_sampled = train_df.sample(n=n_test, replace=True, random_state=42)
R实现
n_test <- nrow(test_df) set.seed(42) train_sampled <- train_df[sample(nrow(train_df), n_test, replace = TRUE), ]
内容的提问来源于stack exchange,提问作者ANA
相关产品推荐
相关产品推荐

