机器学习 :训练集、验证集、测试集分配比例

根据《统计学习方法》中的观点:
“如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set)、验证集(validation set)和测试集(test set)。训练集用来训练模型,验证集用来模型选择,而测试集用于最终对学习方法的评估。”

训练集较小

如果数据集较小时,一般采用简单交叉验证的方法,即不设置验证集,而只设置训练集和测试集,根据西瓜书的观点,训练集和测试集的比例设置一般为 2:1 ~ 4:1 。根据目前我所看到的方法,大多数人将比例设置为7:3。

训练集较大

如果数据量较大时(有人说是数据集以万为单位),一般训练集、验证集、测试集的分配比例为 6:2:2。

训练集非常大

如果数据量更大时,例如百万级的数据集,一般划分比例在 98:1:1 以上(即根据情况再提高训练集的占比)。

好的,我可以帮助你完成这个任务。 首先,你需要解压缩“mnist.rar”文件,然后使用图像处理库(如OpenCV)对图像进行切分。以下是一个简单的Python代码示例,用于提取每个数字的小片: ```python import cv2 import os # 定义感兴趣区域 roi = [(50, 100), (400, 100), (50, 600), (400, 600)] # 读取图像 img = cv2.imread('mnist.png') # 切割感兴趣区域 for i in range(4): x, y = roi[i] crop = img[y-50:y+50, x-50:x+50] # 切割数字小片 for j in range(10): num_crop = crop[10*j:10*(j+1), :] filename = "num{}_{}_{}.jpg".format(i+1, j+1) # 保存数字小片 cv2.imwrite(os.path.join('dataset', filename), num_crop) ``` 在这个示例中,我们定义了四个感兴趣区域,然后使用OpenCV库读取图像并进行切割。对于每个区域,我们切割出10个数字小片,并将它们保存到“dataset”文件夹中。 接下来,你可以使用以下代码将数据集拆分为训练集测试集: ```python import os import random import shutil # 定义数据集路径拆分比例 data_dir = 'dataset' train_dir = 'train' test_dir = 'test' split_ratio = 0.7 # 创建训练集测试集目录 os.makedirs(train_dir, exist_ok=True) os.makedirs(test_dir, exist_ok=True) # 遍历所有数字小片 for file in os.listdir(data_dir): # 获取数字类别文件名 num = file.split('_')[0] filename = os.path.join(data_dir, file) # 随机划分训练集测试集 if random.random() < split_ratio: shutil.copy(filename, os.path.join(train_dir, num)) else: shutil.copy(filename, os.path.join(test_dir, num)) ``` 在这个示例中,我们遍历数据集中的所有数字小片,并随机将它们划分训练集测试集。要确保同一名同学的手写体要么全部在训练集中,要么全部在测试集中,我们可以根据文件名中的信息来进行划分。 最后,你可以构建一个简单的卷积神经网络来对手写数字图像进行分类。以下是一个可能的模型架构: ```python from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Dense, Flatten # 定义模型 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(20, 20, 1))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 在这个模型中,我们使用了两个卷积层两个最大池化层来提取特征。然后我们使用了两个全连接层来进行分类。最后,我们使用了softmax函数来产生10种不同的输出,对应于0到9的数字。 你可以使用类似以下的代码来训练模型: ```python from keras.preprocessing.image import ImageDataGenerator # 定义训练数据生成器 train_datagen = ImageDataGenerator(rescale=1./255) # 从文件夹中读取训练数据 train_generator = train_datagen.flow_from_directory( train_dir, target_size=(20, 20), color_mode='grayscale', batch_size=32, class_mode='categorical') # 训练模型 model.fit_generator(train_generator, steps_per_epoch=100, epochs=10) ``` 在这个示例中,我们使用了Keras库中的ImageDataGenerator类来生成训练数据,然后使用fit_generator()函数进行模型训练。 希望这个示例能够对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值