划分训练集验证和测试集代码_交叉验证与数据集划分,及其实现

关于交叉验证与数据集划分,及其实现

  • 交叉验证,主要就是当数据集较小的时候,为了更好的利用数据集,以kfold为例,将其等分为k份,进行k次训练,每次训练以第i份为test,其他的k-1份为train,然后对得到的结果的取平均,得到最终的模型评估数据
  • 一般的在k-1份上训练时,还需要兼具调参的过程,即选超参数

  • 首先要知道如何得到最终的模型,分为两步
    • 模型选择
    • 模型评估
  • 模型选择model selection:
    • 作用是选出在val上表现最好的超参数,是纵向的比较(主要是比较超参数的选择)
  • 模型评估model assessment:
    • 作用是无偏的对选出的模型进行评估,是横向的比较(和其他模型比较)
  • 一个数据集分为train_val_test三个部分
  • 下面以常用的一种交叉验证方式进行说明:
    • model_selection和test部分,用k-fold交叉验证,比如5折,10折
    • model_selection内部的train_val的划分,可以交叉验证(cross validation,cv),也可以直接holdout(留一,也就是直接split)
  • 实现部分:
    • 首先明确,我们划分的应该是index!,而不是直接对data划分,对index的划分会更加灵活一点
    • model_selection / test的划分:
      • 常见的是使用sklearn的 StratifiedKFold,Stratify是分层的意思,这有助于保证label的比例在每个部分都是一定的,避免出现正类负类比例在train/test中的不平衡所引起的误差,更甚者,如果test全是一个label,是无法使用roc_auc_score()的!
      • 首先是初始化:
        • class sklearn.model_selection.StratifiedKFold(n_splits=5, shuffle=False, random_state=None)
        • 通过方法split(self, X, y[, groups]) Generate indices to split data into training and test set 划分
        • 我们可以看到返回的index,所以这里的X可以用data,但是更好的是用np.arange(len(targets)),何乐而不为呢?
        • 在model_selection的划分一般就直接用train_test_split()
        • 一般的我们将split好的indices存到json文件
        self.splits = []
        for train_idxs , test_idxs in outer_kfold.split(X=np.arange(len(targets)) , y =targets)
            split = {"test":test_idxs , "model_selection":[]}
            train_inner_idx , val_inner_idx = train_test_split(train_idxs , stratify = targets[train_idxs] , test_size = self.holdout_test_size)
            split["model_selection"].append({"train":train_idxs[train_inner_idx] , "val":train_idxs[val_inner_idx]})
            self.splits.append(split)
        json.dump(self.splits , fp )

所用的函数: 1. sklearn : StratifiedKFold , train_test_split


REF:

A Fair Comparison of Graph Neural Networks for Graph Classification​arxiv.org

( 知乎不会在提交之后再渲染一下markdown我是没想到的,属实xx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以使用随机数生成器或者手动指定数据集的方式将数据集划分训练集验证集测试集。 下面是一个简单的示例代码,演示了如何使用随机数生成器将数据集划分训练集验证集测试集: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { // 生成数据集 vector<int> data_set(1000); for (int i = 0; i < data_set.size(); i++) { data_set[i] = i; } // 将数据集随机打乱 random_shuffle(data_set.begin(), data_set.end()); // 划分数据集 int train_size = 700; int valid_size = 200; int test_size = 100; vector<int> train_set(data_set.begin(), data_set.begin() + train_size); vector<int> valid_set(data_set.begin() + train_size, data_set.begin() + train_size + valid_size); vector<int> test_set(data_set.begin() + train_size + valid_size, data_set.begin() + train_size + valid_size + test_size); // 输出数据集大小 cout << "Train set size: " << train_set.size() << endl; cout << "Validation set size: " << valid_set.size() << endl; cout << "Test set size: " << test_set.size() << endl; return 0; } ``` 在上面的代码中,我们先生成了一个大小为1000的数据集,然后使用 `random_shuffle` 函数将数据集随机打乱。接着,我们指定了训练集大小为700,验证集大小为200,测试集大小为100,并使用 `vector` 类型将数据集划分训练集验证集测试集。最后,我们输出了每个数据集的大小。 当然,还有其他的方式可以进行数据集划分,例如使用交叉验证等方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值