实验一 模型评估方法-数据集划分

1.数据集划分方法

对于一个包含m个样例的数据集,划分训练集S和测试集T的方法有:留出法(hold-out)、交叉验证法(cross validation)、留一法(Leave-One-Out,LOO)和自助法(boostraping)。

1)留出法

留出法:直接将数据集D划分为两个互斥的集合,一个作为训练集S,另一个作为测试集 T,即 D=S∪T,S∩T=∅。

例如:数据集D中包含1000个样例,其中有500个正例和500个反例。我们可以使用 7:3 的比例将其划分为训练集S以及验证集T,这样S中有700个样本,T中有300个样本。在划分的过程中,要尽可能地保证S和T中的正例反例比例相同(也就是数据分布相同,可以使用分层抽样),例如S中700个样本有350个正例和350个反例,T中有150个正例和 150个反例,S和T中正反例的比例均为1:1。

说明:

(a)测试集合和训练集合尽可能保持数据分布的一致性,比如要保证正反样本的比例不变(这是一种导致过拟合的原因);

(b)在给定了训练/测试集合的样本比例之后,仍要存在多种的划分方式,对数据集合D进行分割(单次使用留出法结果往往不够稳定);

(c)训练/测试集合的大小比例问题;

测试集合过小,会导致测评结果的方差变大;

训练集合过小,会导致偏差过大,一般使用的都是2/3~4/5的样本用于训练;

2)交叉验证法(无放回的重采样)

交叉验证法:随机将样本拆分成K个互不相交大小相同的子集,然后用K-1个子集作为训练集训练模型,用剩余的子集测试模型,对K中选择重复进行,最终选出K次测评中的平均测试误差最小的模型。常用的k值有 5、10、20等。下图是10折交叉验证的示意图:

说明:

(a)假设我们确定了折数k,由于进行划分的方法不同,得到的结果也会不同(例如使用不同的随机数种子)。在实际使用中,我们可以进行 p次不同的k折交叉验证,取p*k 次实验结果的平均作为最终的实验结果,这叫做p次k折交叉验证。例如,10次10折交叉验证共进行了100次实验。
(b)与留出法类似,划分为S折存在多种方式,所以为了减小样本划分不同而引入的误差,通常随机使用不同的划分重复P次,即为P次S折交叉验证

3)留一法

留一法:可以看做是交叉验证法的一个特例。假设数据集 D中有 m 个样例,我们将其划分为 m 个互斥的集合进行交叉验证,这种交叉验证方法就被成为留一法。在留一法中,我们每次使用 m-1 个样例进行训练,1 个样例进行测试。这样用训练出的模型和直接使用全部数据集 D 训练出的模型非常接近,但当数据量比较大时,例如数据集包含 100 万个样例,使用留一法意味着我们要训练 100 万个模型,这显然是不现实的。

4)自助法

自助法:留出法每次从数据集 D 中抽取一个样本加入数据集 D′ 中,然后再将该样本放回到原数据集 D 中,即 D 中的样本可以被重复抽取。这样,D 中的一部分样本会被多次抽到,而另一部分样本从未被抽到。假设抽取 m 次,则在 m 次抽样中都没有被抽到的概率为 (1−1/m)m,取极限有:

也就是说,原数据集 D 中约 36.8% 的数据未在 D′ 中出现过,所以我们可以将 D′ 作为训练集,将 D−D′(D 与 D′ 的差集)作为测试集。

说明:自助法适用于数据集较小,难以划分训练、验证集的情况。

代码:自助法

#sklearn机器工具库的使用
#留出法hold_out 划分训练集和测试集
#1)待划分数据集为,2W规模的人脸图像,用不同文件夹分类放置,一类为’male',标签用1表示,另一类为'female',标签用0表示
#2)划分出进二分类训练和测试的数据集,并将划分的数据集存储到本地磁盘,文件名称分别为training.txt和testing.txt
import glob
import os.path
import random
import numpy as np

In [3]:

#图片数据集的根目录
ROOT_DIR='face_data\\'

In [4]:

#创建字典result,用于存放划分后的训练集和测试集
result={}

In [5]:

#获取当前目录下所有的子目录,这里x 是一个三元组(root,dirs,files),
#第一个元素表示ROOT_DIR当前目录, 
#第二个元素表示当前目录下的所有子目录, 
#第三个元素表示当前目录下的所有的文件
sub_dirs = [x[0] for x in os.walk(ROOT_DIR)]

In [6]:

# sub_dirs[0]表示当前文件夹本身的地址,不予考虑,只考虑他的子目录(各个类别)
for sub_dir in sub_dirs[1:]:
# 获取当前目录下所有的有效图片文件
    #创建image_list列表,用于存放图片
    image_list=[]
    # os.path.basename(sub_dir)返回sub_sir最后的文件名
    dir_name=os.path.basename(sub_dir)
    # 通过目录名获取类别的名称,返回将字符串中所有大写字符转换为小写后生成的字符串
    label_name=dir_name.lower()

    #数据集的中图片类型,已知:为Jpg格式
    image_glob=os.path.join(ROOT_DIR,dir_name,'*.jpg')
    image_list.extend(glob.glob(image_glob))
    if not image_list:continue

    # 获得数据集长度
    images_length=len(image_list)
    #创建index_label列表
    index_label=[]
    #根据文件类别,'male’用1表示,‘female'用0表示
    if label_name=='male':
        for i in range(images_length):
            index_label.insert(i,1)
    elif label_name=='female':
        for i in range(images_length):
            index_label.insert(i,0)

    #打印输出
    print('类别',dir_name,'的图片数量为:',len(image_list))
    #存储到字典中
    result[label_name]={'imgs':image_list,'label':index_label}
类别 female 的图片数量为: 10038
类别 male 的图片数量为: 10190

In [7]:

imgs_list=result['male']['imgs']+result['female']['imgs']
imgs_label_list=result['male']['label']+result['female']['label']
#打印输出
print('数据集imgs_list图片的数量,总数为:',len(imgs_list))
数据集imgs_list图片的数量,总数为: 20228

In [8]:

#通过产生的随机数获得抽取样本的序号
round = 1#抽取轮数
bootstrapping_list = []#有重复
bootstrapping=[]#无重复
for j in range(round):
    bootstrapping = []
    for i in range(len(imgs_list)):
        bootstrapping.append(int(np.floor(np.random.random()*len(imgs_list))))


    bootstrapping_list.append(bootstrapping)
bootstrapping=list(set(bootstrapping))#去除相同的元素
bootstrapping2=[]#变成二维
bootstrapping2.append(bootstrapping)

In [10]:

#训练集存盘
for bootstrap in bootstrapping2:
    fileTrain = open('sklearn_training_bootstrap'+'.txt', 'w')  
    for i in range(len(bootstrap)):
        temp_data=imgs_list[bootstrap[i]]+'    '+str(imgs_label_list[bootstrap[i]])
        fileTrain.write(temp_data)  
        fileTrain.write('\n') 
    fileTrain.close()  

print("抽取到的训练集数量为:%d"%(len(bootstrapping_list[0])))
抽取到的训练集数量为:20228
#测试集存盘
#计算测试集图片数据
list1 = list(range(0,20228))
list1_not_in_list2 = [i for i in list1 if i not in bootstrapping]#D−D′(D 与 D′ 的差集)
list1_not_in_list3=[]
list1_not_in_list3.append(list1_not_in_list2)#把一维的测试集转化成二维
for bootstrap in list1_not_in_list3:
    fileTrain = open('sklearn_test_bootstrap'+'.txt', 'w')  
    for i in range(len(bootstrap)):
        temp_data=imgs_list[bootstrap[i]]+'    '+str(imgs_label_list[bootstrap[i]])
        fileTrain.write(temp_data)  
        fileTrain.write('\n')
    fileTrain.close()   

print("剩下的测试集数量为:%d"%(len(list1_not_in_list3[0])))
剩下的测试集数量为:7435

交叉验证法:

#sklearn机器工具库的使用
#留出法hold_out 划分训练集和测试集
#1)待划分数据集为,2W规模的人脸图像,用不同文件夹分类放置,一类为’male',标签用1表示,另一类为'female',标签用0表示
#2)划分出进二分类训练和测试的数据集,并将划分的数据集存储到本地磁盘,文件名称分别为training.txt和testing.txt
import glob
import os.path
import random
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold

In [28]:

#图片数据集的根目录
ROOT_DIR='face_data\\'

In [29]:

#创建字典result,用于存放划分后的训练集和测试集
result={}

In [30]:

#获取当前目录下所有的子目录,这里x 是一个三元组(root,dirs,files),
#第一个元素表示ROOT_DIR当前目录, 
#第二个元素表示当前目录下的所有子目录, 
#第三个元素表示当前目录下的所有的文件
sub_dirs = [x[0] for x in os.walk(ROOT_DIR)]

In [31]:

#设置数据集划分比例,即训练集:测试集=4:1,训练集占数据集的80% 测试集占比则为20%
proportion=0.8

In [32]:

# sub_dirs[0]表示当前文件夹本身的地址,不予考虑,只考虑他的子目录(各个类别)
for sub_dir in sub_dirs[1:]:
# 获取当前目录下所有的有效图片文件
    #创建image_list列表,用于存放图片
    image_list=[]
    # os.path.basename(sub_dir)返回sub_sir最后的文件名
    dir_name=os.path.basename(sub_dir)
    # 通过目录名获取类别的名称,返回将字符串中所有大写字符转换为小写后生成的字符串
    label_name=dir_name.lower()

    #数据集的中图片类型,已知:为Jpg格式
    image_glob=os.path.join(ROOT_DIR,dir_name,'*.jpg')
    image_list.extend(glob.glob(image_glob))
    if not image_list:continue

    # 获得数据集长度
    images_length=len(image_list)
    #创建index_label列表
    index_label=[]
    #根据文件类别,'male’用1表示,‘female'用0表示
    if label_name=='male':
        for i in range(images_length):
            index_label.insert(i,1)
    elif label_name=='female':
        for i in range(images_length):
            index_label.insert(i,0)

    #打印输出
    print('类别',dir_name,'的图片数量为:',len(image_list))
    #存储到字典中
    result[label_name]={'imgs':image_list,'label':index_label}
类别 female 的图片数量为: 10038
类别 male 的图片数量为: 10190

In [39]:

#从result字典中取出'male','female'两个类别的数据集放到列表imgs_list中
imgs_list=result['male']['imgs']+result['female']['imgs']
#从result字典中取出'male','female'两个类别的数据集放到列表imgs_label_list中
imgs_label_list=result['male']['label']+result['female']['label']
#打印输出
print('数据集imgs_list图片的数量,总数为:',len(imgs_list))
数据集imgs_list图片的数量,总数为: 20228

In [38]:

#说明:调用sklearn库API划分数据集
#imgs_training_list  训练集
#imgs_training_label_list 训练集标签
#index_testing_list 测试集
#index_testing_list 测试集标签
#参数test_size代表test集占据的比例  也可以指定train_size
#参数random_state用于分割的training和testing集合打乱的个数设定
#5折交叉验证 sklean库的方法帮我们分出了各个子训练集在总图集中的下标
#通过给出的子训练集下标找出对应的字段存入磁盘
#将总数据集平均分成了10份
count=1
imgs_split_list = []#用来存放训练集和测试集的下标
print('完成数据集划分,其中把数据集分成5份:')
kf = StratifiedKFold(n_splits=5)
for train , valid in kf.split(imgs_list,imgs_label_list):
        print("第%d份训练集图片数量为:%d,测试集图片数量为:%d"%(count,len(train),len(valid)))
        print((train,valid))
        imgs_split_list.append((train,valid))
        count+=1
完成数据集划分,其中把数据集分成5份:
第1份训练集图片数量为:16182,测试集图片数量为:4046
(array([ 2038,  2039,  2040, ..., 20225, 20226, 20227]), array([    0,     1,     2, ..., 12195, 12196, 12197]))
第2份训练集图片数量为:16182,测试集图片数量为:4046
(array([    0,     1,     2, ..., 20225, 20226, 20227]), array([ 2038,  2039,  2040, ..., 14203, 14204, 14205]))
第3份训练集图片数量为:16182,测试集图片数量为:4046
(array([    0,     1,     2, ..., 20225, 20226, 20227]), array([ 4076,  4077,  4078, ..., 16211, 16212, 16213]))
第4份训练集图片数量为:16183,测试集图片数量为:4045
(array([    0,     1,     2, ..., 20225, 20226, 20227]), array([ 6114,  6115,  6116, ..., 18218, 18219, 18220]))
第5份训练集图片数量为:16183,测试集图片数量为:4045
(array([    0,     1,     2, ..., 18218, 18219, 18220]), array([ 8152,  8153,  8154, ..., 20225, 20226, 20227]))

In [35]:

#5折5份训练集存盘
count = 1
for cross_list in imgs_split_list:
    fileTrain = open('sklearn_training_cross_'+str(count)+'.txt', 'w') 
    cross_train_length = len(cross_list[0])
    #通过for循环,将训练集图片路径,和标签组成字符串,存储到文件training.txt中
    for ip in range(cross_train_length):  
    #使用str()内部函数,将标签的整型变量转变成字符串,并与训练集图片路径拼接
        temp_data=imgs_list[cross_list[0][ip]]+'    '+str(imgs_label_list[cross_list[0][ip]])
        fileTrain.write(temp_data)  
        fileTrain.write('\n') 
    fileTrain.close()  
    print("成功保存训练集文件:{}".format('sklearn_training_cross_'+str(count)+'.txt'))
    count+= 1
成功保存训练集文件:sklearn_training_cross_1.txt
成功保存训练集文件:sklearn_training_cross_2.txt
成功保存训练集文件:sklearn_training_cross_3.txt
成功保存训练集文件:sklearn_training_cross_4.txt
成功保存训练集文件:sklearn_training_cross_5.txt

In [36]:

#测试集存盘
#计算测试集图片数据
count = 1
for cross_list in imgs_split_list:
    fileTrain = open('sklearn_testing_cross_'+str(count)+'.txt', 'w')  
    cross_test_length = len(cross_list[1])
    #cross_List的0就是训练集,1是测试集
    for ip in range(cross_test_length):
        temp_data=imgs_list[cross_list[1][ip]]+'    '+str(imgs_label_list[cross_list[1][ip]])
        fileTrain.write(temp_data)  
        fileTrain.write('\n') 
    fileTrain.close()  
    print("成功保存训练集文件:{}".format('sklearn_training_cross_'+str(count)+'.txt'))
    count+=1
成功保存训练集文件:sklearn_training_cross_1.txt
成功保存训练集文件:sklearn_training_cross_2.txt
成功保存训练集文件:sklearn_training_cross_3.txt
成功保存训练集文件:sklearn_training_cross_4.txt
成功保存训练集文件:sklearn_training_cross_5.txt

留一法:

#sklearn机器工具库的使用
#留出法hold_out 划分训练集和测试集
#1)待划分数据集为,2W规模的人脸图像,用不同文件夹分类放置,一类为’male',标签用1表示,另一类为'female',标签用0表示
#2)划分出进二分类训练和测试的数据集,并将划分的数据集存储到本地磁盘,文件名称分别为training.txt和testing.txt
import glob
import os.path
import random
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold

In [28]:

#图片数据集的根目录
ROOT_DIR='face_data\\'

In [29]:

#创建字典result,用于存放划分后的训练集和测试集
result={}

In [30]:

#获取当前目录下所有的子目录,这里x 是一个三元组(root,dirs,files),
#第一个元素表示ROOT_DIR当前目录, 
#第二个元素表示当前目录下的所有子目录, 
#第三个元素表示当前目录下的所有的文件
sub_dirs = [x[0] for x in os.walk(ROOT_DIR)]

In [31]:

#设置数据集划分比例,即训练集:测试集=4:1,训练集占数据集的80% 测试集占比则为20%
proportion=0.8

In [32]:

# sub_dirs[0]表示当前文件夹本身的地址,不予考虑,只考虑他的子目录(各个类别)
for sub_dir in sub_dirs[1:]:
# 获取当前目录下所有的有效图片文件
    #创建image_list列表,用于存放图片
    image_list=[]
    # os.path.basename(sub_dir)返回sub_sir最后的文件名
    dir_name=os.path.basename(sub_dir)
    # 通过目录名获取类别的名称,返回将字符串中所有大写字符转换为小写后生成的字符串
    label_name=dir_name.lower()

    #数据集的中图片类型,已知:为Jpg格式
    image_glob=os.path.join(ROOT_DIR,dir_name,'*.jpg')
    image_list.extend(glob.glob(image_glob))
    if not image_list:continue

    # 获得数据集长度
    images_length=len(image_list)
    #创建index_label列表
    index_label=[]
    #根据文件类别,'male’用1表示,‘female'用0表示
    if label_name=='male':
        for i in range(images_length):
            index_label.insert(i,1)
    elif label_name=='female':
        for i in range(images_length):
            index_label.insert(i,0)

    #打印输出
    print('类别',dir_name,'的图片数量为:',len(image_list))
    #存储到字典中
    result[label_name]={'imgs':image_list,'label':index_label}
类别 female 的图片数量为: 10038
类别 male 的图片数量为: 10190

In [39]:

#从result字典中取出'male','female'两个类别的数据集放到列表imgs_list中
imgs_list=result['male']['imgs']+result['female']['imgs']
#从result字典中取出'male','female'两个类别的数据集放到列表imgs_label_list中
imgs_label_list=result['male']['label']+result['female']['label']
#打印输出
print('数据集imgs_list图片的数量,总数为:',len(imgs_list))
数据集imgs_list图片的数量,总数为: 20228

In [38]:

#说明:调用sklearn库API划分数据集
#imgs_training_list  训练集
#imgs_training_label_list 训练集标签
#index_testing_list 测试集
#index_testing_list 测试集标签
#参数test_size代表test集占据的比例  也可以指定train_size
#参数random_state用于分割的training和testing集合打乱的个数设定
#5折交叉验证 sklean库的方法帮我们分出了各个子训练集在总图集中的下标
#通过给出的子训练集下标找出对应的字段存入磁盘
#将总数据集平均分成了10份
count=1
imgs_split_list = []#用来存放训练集和测试集的下标
print('完成数据集划分,其中把数据集分成5份:')
kf = StratifiedKFold(n_splits=5)
for train , valid in kf.split(imgs_list,imgs_label_list):
        print("第%d份训练集图片数量为:%d,测试集图片数量为:%d"%(count,len(train),len(valid)))
        print((train,valid))
        imgs_split_list.append((train,valid))
        count+=1
完成数据集划分,其中把数据集分成5份:
第1份训练集图片数量为:16182,测试集图片数量为:4046
(array([ 2038,  2039,  2040, ..., 20225, 20226, 20227]), array([    0,     1,     2, ..., 12195, 12196, 12197]))
第2份训练集图片数量为:16182,测试集图片数量为:4046
(array([    0,     1,     2, ..., 20225, 20226, 20227]), array([ 2038,  2039,  2040, ..., 14203, 14204, 14205]))
第3份训练集图片数量为:16182,测试集图片数量为:4046
(array([    0,     1,     2, ..., 20225, 20226, 20227]), array([ 4076,  4077,  4078, ..., 16211, 16212, 16213]))
第4份训练集图片数量为:16183,测试集图片数量为:4045
(array([    0,     1,     2, ..., 20225, 20226, 20227]), array([ 6114,  6115,  6116, ..., 18218, 18219, 18220]))
第5份训练集图片数量为:16183,测试集图片数量为:4045
(array([    0,     1,     2, ..., 18218, 18219, 18220]), array([ 8152,  8153,  8154, ..., 20225, 20226, 20227]))

In [35]:

#5折5份训练集存盘
count = 1
for cross_list in imgs_split_list:
    fileTrain = open('sklearn_training_cross_'+str(count)+'.txt', 'w') 
    cross_train_length = len(cross_list[0])
    #通过for循环,将训练集图片路径,和标签组成字符串,存储到文件training.txt中
    for ip in range(cross_train_length):  
    #使用str()内部函数,将标签的整型变量转变成字符串,并与训练集图片路径拼接
        temp_data=imgs_list[cross_list[0][ip]]+'    '+str(imgs_label_list[cross_list[0][ip]])
        fileTrain.write(temp_data)  
        fileTrain.write('\n') 
    fileTrain.close()  
    print("成功保存训练集文件:{}".format('sklearn_training_cross_'+str(count)+'.txt'))
    count+= 1
成功保存训练集文件:sklearn_training_cross_1.txt
成功保存训练集文件:sklearn_training_cross_2.txt
成功保存训练集文件:sklearn_training_cross_3.txt
成功保存训练集文件:sklearn_training_cross_4.txt
成功保存训练集文件:sklearn_training_cross_5.txt

In [36]:

#测试集存盘
#计算测试集图片数据
count = 1
for cross_list in imgs_split_list:
    fileTrain = open('sklearn_testing_cross_'+str(count)+'.txt', 'w')  
    cross_test_length = len(cross_list[1])
    #cross_List的0就是训练集,1是测试集
    for ip in range(cross_test_length):
        temp_data=imgs_list[cross_list[1][ip]]+'    '+str(imgs_label_list[cross_list[1][ip]])
        fileTrain.write(temp_data)  
        fileTrain.write('\n') 
    fileTrain.close()  
    print("成功保存训练集文件:{}".format('sklearn_training_cross_'+str(count)+'.txt'))
    count+=1
成功保存训练集文件:sklearn_training_cross_1.txt
成功保存训练集文件:sklearn_training_cross_2.txt
成功保存训练集文件:sklearn_training_cross_3.txt
成功保存训练集文件:sklearn_training_cross_4.txt
成功保存训练集文件:sklearn_training_cross_5.txt

流出法:

#sklearn机器工具库的使用
#留出法hold_out 划分训练集和测试集
#1)待划分数据集为,2W规模的人脸图像,用不同文件夹分类放置,一类为’male',标签用1表示,另一类为'female',标签用0表示
#2)划分出进二分类训练和测试的数据集,并将划分的数据集存储到本地磁盘,文件名称分别为training.txt和testing.txt
import glob
import os.path
import random
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold

In [3]:

#图片数据集的根目录
ROOT_DIR='face_data\\'

In [4]:

#创建字典result,用于存放划分后的训练集和测试集
result={}

In [5]:

#获取当前目录下所有的子目录,这里x 是一个三元组(root,dirs,files),
#第一个元素表示ROOT_DIR当前目录, 
#第二个元素表示当前目录下的所有子目录, 
#第三个元素表示当前目录下的所有的文件
sub_dirs = [x[0] for x in os.walk(ROOT_DIR)]

In [6]:

#设置数据集划分比例,即训练集:测试集=4:1,训练集占数据集的80% 测试集占比则为20%
proportion=0.8

In [7]:

# sub_dirs[0]表示当前文件夹本身的地址,不予考虑,只考虑他的子目录(各个类别)
for sub_dir in sub_dirs[1:]:
# 获取当前目录下所有的有效图片文件
    #创建image_list列表,用于存放图片
    image_list=[]
    # os.path.basename(sub_dir)返回sub_sir最后的文件名
    dir_name=os.path.basename(sub_dir)
    # 通过目录名获取类别的名称,返回将字符串中所有大写字符转换为小写后生成的字符串
    label_name=dir_name.lower()

    #数据集的中图片类型,已知:为Jpg格式
    image_glob=os.path.join(ROOT_DIR,dir_name,'*.jpg')
    image_list.extend(glob.glob(image_glob))
    if not image_list:continue

    # 获得数据集长度
    images_length=len(image_list)
    #创建index_label列表
    index_label=[]
    #根据文件类别,'male’用1表示,‘female'用0表示
    if label_name=='male':
        for i in range(images_length):
            index_label.insert(i,1)
    elif label_name=='female':
        for i in range(images_length):
            index_label.insert(i,0)

    #打印输出
    print('类别',dir_name,'的图片数量为:',len(image_list))
    #存储到字典中
    result[label_name]={'imgs':image_list,'label':index_label}
类别 female 的图片数量为: 10038
类别 male 的图片数量为: 10190

In [8]:

#从result字典中取出'male','female'两个类别的数据集放到列表imgs_list中
imgs_list=result['male']['imgs']+result['female']['imgs']
#从result字典中取出'male','female'两个类别的数据集放到列表imgs_label_list中
imgs_label_list=result['male']['label']+result['female']['label']
#打印输出
print('数据集imgs_list图片的数量,总数为:',len(imgs_list))
数据集imgs_list图片的数量,总数为: 20228

In [11]:

#说明:调用sklearn库API划分数据集
#imgs_training_list  训练集
#imgs_training_label_list 训练集标签
#index_testing_list 测试集
#index_testing_list 测试集标签
#参数test_size代表test集占据的比例  也可以指定train_size
#参数random_state用于分割的training和testing集合打乱的个数设定
imgs_training_list,imgs_testing_list,imgs_training_label_list,index_testing_list=train_test_split(imgs_list,imgs_label_list, train_size=0.8, random_state=0)
#打印输出
print('完成数据集划分,其中:')
print('训练集名称为:imgs_training_list,图片数量为:',len(imgs_training_list))
print('测试集名称为:imgs_testing_list,图片数量为:',len(imgs_testing_list))
#训练集存盘
#计算训练集图片数据
imgs_training_length=len(imgs_training_list)
fileTrain = open('sklearn_training.txt', 'w')  
#通过for循环,将训练集图片路径,和标签组成字符串,存储到文件training.txt中
for ip in range(imgs_training_length):  
    #使用str()内部函数,将标签的整型变量转变成字符串,并与训练集图片路径拼接
    temp_data=imgs_training_list[ip]+'    '+str(imgs_training_label_list[ip])
    fileTrain.write(temp_data)  
    fileTrain.write('\n') 
fileTrain.close()  
#打印输出
print('完成训练集存盘,文件名称为:sklearn_training.txt')
完成训练集存盘,文件名称为:sklearn_training.txt

In [22]:

#测试集存盘
#计算测试集图片数据
imgs_testing_length=len(imgs_testing_list)
fileTest = open('sklearn_testing.txt', 'w')  
#通过for循环,将测试集图片路径,和标签组成字符串,存储到文件testing.txt中
for ip in range(imgs_testing_length):  
    #使用str()内部函数,将标签的整型变量转变成字符串,并与测试集图片路径拼接
    temp_data=imgs_testing_list[ip]+'    '+str(index_testing_list[ip])
    fileTest.write(temp_data)  
    fileTest.write('\n') 
fileTest.close()  
#打印输出
print('完成测试集存盘,文件名称为:sklearn_testing.txt')

机器学习数据集划分留出法,留一法,交叉法,自助法相关推荐

  1. 统计机器学习 作业一 采用交叉验证、留出法、自助法划分数据集,绘制PR图

    要求:随机生成两组数据,每组50个数,其中一组服从正态分布,另一组服从N(1,1) .编写一个code: Input:上面产生的100个数,类别数:2 Output:1.0标签序列(每个标签对应每个数 ...

  2. python交叉验证法_详解python实现交叉验证法与留出法

    在机器学习中,我们经常在训练集上训练模型,在测试集上测试模型.最终的目标是希望我们的模型在测试集上有最好的表现. 但是,我们往往只有一个包含m个观测的数据集D,我们既要用它进行训练,又要对它进行测试. ...

  3. 交叉验证法与留出法及其python实现

    在机器学习中,我们经常在训练集上训练模型,在测试集上测试模型.最终的目标是希望我们的模型在测试集上有最好的表现. 但是,我们往往只有一个包含m个观测的数据集D,我们既要用它进行训练,又要对它进行测试. ...

  4. python实现留一法_数据分割:留出法train_test_split、留一法LeaveOneOut、GridSearchCV(交叉验证法+网格搜索)、自助法...

    1.10 交叉验证,网格搜索 学习目标 目标 知道交叉验证.网格搜索的概念 会使用交叉验证.网格搜索优化训练模型 1 什么是交叉验证(cross validation) 交叉验证:将拿到的训练数据,分 ...

  5. 评估方法(交叉验证法、自助法、留出法)

    文章目录 留出法 hold-out 交叉验证法 cross validation k折交叉验证 留一法 leave-one-out cross validation 自助法 bootstrapping ...

  6. 统计学习:模型评估与选择--留出法(python实现)

    使用测试集来测试学习器对新样本的判别能力,然后在测试集上的"测试误差"作为泛化误差的近似,且假设测试样本是从样本真实分布中独立同分布采用而得.这样的目的也就是利用测试样本模拟真实模 ...

  7. 深度学习评估方法--留出法、交叉验证法、自助法

    目录 1.评估方法: 1.1 留出法(hold-out) 1.2 交叉验证法(cross validation) 1.2.1 "k折交叉验证"(k-fold cross valid ...

  8. 波斯顿房价(lasso、线性回归、留出法、k折交叉验证法)

    经过几天水水的学习,利用波斯顿房价数据集做了一点小小练习,并写此笔记来记录自己点滴实验心得.新手实验,望有经验人士勿喷,本人抛砖引玉,望得到宝贵建议.如今后有新的体会,则会更新笔记. 1.线性回归+留 ...

  9. 机器学习 数据集划分 训练集 验证集 测试集

    版权声明:本文为博主原创文章,转载请注明转自 Scofield's blog[http://blog.csdn.net/scotfield_msn] https://blog.csdn.net/Sco ...

  10. 交叉验证的缘由、原理以及四种交叉验证法(留出法,K-Fold,留一法,Bootstrap)

    [机器学习]Cross-Validation(交叉验证)详解 普通情况下,就是将数据集分为训练集和测试集. 这个简单的划分方法存在两个弊端. 1.最终模型与参数的选取将极大程度依赖于你对训练集和测试集 ...

最新文章

  1. 一代偶像终将老去,总有AI正在年轻
  2. Tomcat9+eclipse如何发布网站
  3. 深入理解MyBatis的原理(三):配置文件(上)
  4. 【数字信号处理】序列傅里叶变换 ( 傅里叶变换物理意义 | 反应信号在整个数字角频率上的能量分布 )
  5. 26. 删除排序数组中的重复项
  6. 分布式事务的特征、原理、以及常见3种解决方案
  7. PHP 结合redis实现高并发下抢购、秒杀
  8. 计算机技术应用论文参考,计算机技术应用参考论文(2)
  9. jmeter的json提取器提取数据
  10. PyS2:RDD编程基础(二)
  11. kali工具之Beef
  12. ChemDraw怎么调整键长?调整键长教程
  13. 低代码架构,内容赋能业务的最后一块拼图?
  14. Could not inflate Behavior subclass
  15. 阿里云大数据助理工程师ACA认证最新笔记(2021)
  16. 【Java校招你不知道的那些事儿】java内推是坑吗?纯忽悠,一点用没有?
  17. 亲测UEFI启动模式的电脑安装Win10和Ubuntu双系统(dell笔记本和hp笔记本)
  18. android remoteViews
  19. 由sp单位引发的惨案
  20. java怎么提升编程能力_怎样提升java编程能力

热门文章

  1. 「自动搬运+CDN」FFmpeg + x264 t_mod + x265 yuuki
  2. 搭建hexo博客与yilia主题优化
  3. layim框架+websocket即时通讯功能
  4. Centos7 安装mongodb 4.x
  5. vue移动端点击事件延迟_如何解决移动端Click事件300ms延迟的问题?
  6. 设计模式---004策略模式---【巷子】
  7. 书籍推荐-游戏程序员的学习之路
  8. JavaScript完成知乎页面
  9. Firefox与chrome 远程调试标签页初体验,顺便解决PC移动端网页因为safe-browsing表现不一致问题。
  10. AndroidStudio如何删除Modle