原创

【机器学习】一种训练集和测试集划分算法

前言

在进行机器学习的时候,我们都会遇到一些问题,就是对模型的评估,那么就面临着对数据集的的划分。当然例如skitlearn等一些python包会提供这些快捷的处理方式,不过如果自己去书写,那么改怎么做呢?最近看到一些关于划分训练集和测试集的小算法拿来共享,当然这种处理也存在一些缺点,只是其思考的方式比较有意思。

算法内容

假设数据集有条,需要划分训练集的比率为,那么训练集的数据个数。可以事先定义一个长度为N的数组,并且初始化为,也就是说数组中索引为的元素值为,也间接对应于这N条数据的索引。

一遍循环找出训练集的索引,每次循环中找出一个随机数, 然后值减一操作,训练集通过这个随机数取出,这时中对应的数据被取走,这里,为了避免下次被同样取到,我们对的值进行更新,则有(需要注意之前N已经减一),那么在数据比较大的情况下这个被取到的概率很小,如此类推进行训练集数据获取。具体如下(JAVA记录):

 for (int i = 0; i < num; i++){
     int temp = (int)(Math.random()*(N--));
     // 训练集取数据
     Array[temp] = N;
     
 }

训练集数据取完之后,就是取测试集的数据,

 for (int i = 0; i < (N - num); i++){
     //直接取 原始数据集中索引为i的数据即可
 }

算法分析

优点:快速、方便

缺点:获取训练集时,如果数据集数量比较少的时候,temp=N的可能性变大,导致训练集数据会重合。

为什么第二个数据集可以直接从索引为0开始取?这里主要是因为在进行训练集获取的时候,对应的索引值发生变化。

简单测试

     public static void main(String[] args) {
         int N = 100;
         int[] data = new int[100];    // 数据集
         int[] train = new int[80];    // 训练集
         int[] test = new int[20];     // 测试集
         int[] Array = new int[100];
         for (int i = 0; i < N; i++) {
             data[i] = i + 100;        // 生成数据集
             Array[i] = i;             // 初始化数组
        }
         // 训练集获取
         for (int i = 0; i < 80; i++) {
             int temp = (int)(Math.random() * ( N--));
             // 测试 错误
             if (temp == N)  System.out.println(temp);
             // 获取训练集
             train[i] = data[Array[temp]];
             Array[temp] = N;
        }
         // 测试集获取
         for (int i = 0; i < 20; i++) test[i] = data[Array[i]];
         System.out.println("训练集:");
         for (int i = 0; i < 80; i++) System.out.print(train[i] + " ");
         System.out.println("\n测试集:");
         for (int i = 0; i < 20; i++) System.out.print(test[i] + " ");
    }

结果如下:

 87
 31
 训练集:
 165 112 105 100 153 146 117 136 178 109 174 124 187 151 180 196 193 155 110 157 170 195 145 144 129 103 178 147 142 184 175 127 118 128 164 107 143 177 180 162 173 156 108 172 192 121 114 150 170 160 137 102 133 168 147 130 183 140 167 166 120 155 197 137 111 146 144 188 131 106 135 130 151 116 126 198 125 101 119 190
 测试集:
 127 122 148 174 104 136 128 164 157 120 181 129 124 113 153 115 123 143 141 121

可以看到训练集和测试集重合的数字仅有:127。也就是说这样取值还是比较合理的,虽然出现两次但是对结果影响不是很大,当前也仅使用了100条数据而已,如果数据量再增大,那么出现重合的可能性也就随着降低了。

正文到此结束
本文目录