训练集、校验集、测试集

转载自CSDN博主「chaolei_9527」的原创文章:https://blog.csdn.net/Chaolei3/article/details/79270939

训练集、校验集、测试集

如果给定的样本数据充足,我们通常使用均匀随机抽样的方式将数据集划分成3个部分——训练集、校验集和测试集,这三个集合不能有交集,常见的比例是8:1:1。需要注意的是,通常都会给定训练集和测试集,而不会给校验集。这时候校验集该从哪里得到呢?一般的做法是,从训练集中均匀随机抽样一部分样本作为验证集。//那不就会有交集?

训练集

用于训练模型,即确定模型的权重偏置这些参数,通常我们称这些参数为学习参数。

校验集

用于模型的选择,更具体地来说,校验集并不参与学习参数的确定(不确定参数?)也就是校验集并没有参与梯度下降的过程。校验集只是为了选择超参数,比如网络层数、网络节点数、迭代次数、学习率这些都叫超参数。比如在k-NN算法中,k值就是一个超参数。可以使用校验集来求出误差率最小的k。

测试集

用于模型的评价。测试集只使用一次,即在训练完成后评价最终的模型时使用。它既不参与学习参数过程,也不参数超参数选择过程,而仅仅使用于模型的评价。
千万不能在训练过程中使用测试集,而后再用相同的测试集去测试模型。这样做其实是一个cheat,使得模型测试时准确率很高。

交叉验证

之所以出现交叉验证,主要是因为训练集较小。无法直接像前面那样只分出训练集,验证集,测试就可以了(简单交叉验证)。
需要说明的是,在实际情况下,人们不是很喜欢用交叉验证,主要是因为它会耗费较多的计算资源。一般直接把训练集按照50%-90%的比例分成训练集和验证集。但这也是根据具体情况来定的:如果超参数数量多,你可能就想用更大的验证集,而验证集的数量不够,那么最好还是用交叉验证吧。至于分成几份比较好,一般都是分成3、5和10份。

交叉验证的实现
首先我们给出下面的图
在这里插入图片描述
图上面的部分表示我们拥有的数据,而后我们对数据进行了再次分割,主要是对训练集,假设将训练集分成5份(该数目被称为折数,5-fold交叉验证),每次都用其中4份来训练模型,粉红色的那份用来验证4份训练出来的模型的准确率,记下准确率。然后在这5份中取另外4份做训练集,1份做验证集,再次得到一个模型的准确率。直到所有5份都做过1次验证集,也即验证集名额循环了一圈,交叉验证的过程就结束。算得这5次准确率的均值。留下准确率最高的模型,即该模型的超参数是什么样的最终模型的超参数就是这个样的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于weka的数据分类分析实验报告 1实验基本内容 本实验的基本内容是通过使用weka中的三种常见分类方法(朴素贝叶斯,KNN和决策 树C4.5)分别在训练数据上训练出分类模型,并使用校验数据对各个模型进行测试和评 价,找出各个模型最优的参数值,并对三个模型进行全面评价比较,得到一个最好的分 类模型以及该模型所有设置的最优参数。最后使用这些参数以及训练集校验数据一 起构造出一个最优分类器,并利用该分类器对测试数据进行预测。 2数据的准备及预处理 2.1格式转换方法 原始数据是excel文件保存的xlsx格式数据,需要转换成Weka支持的arff文件格式或 csv文件格式。由于Weka对arff格式的支持更好,这里我们选择arff格式作为分类器原始 数据的保存格式。 转换方法:在excel中打开"movie_given.xlsx",选择菜单文件- >另存为,在弹出的对话框中,文件名输入"total_data",保存类型选择"CSV(逗号分隔 )",保存,我们便可得到"total_data.csv"文件;然后,打开Weka的Exporler,点击O pen file按钮,打开刚才得到的"total_data"文件,点击"save"按钮,在弹出的对话框中, 文件名输入"total_data",文件类型选择"Arff data files(*.arff)",这样得到的数据文件为"total_data.arff"。 2.2如何建立数据训练集校验测试集 数据的预处理过程中,为了在训练模型、评价模型和使用模型对数据进行预测能保证 一致性和完整性,首先要把movie_given.xslx和test.xslx合并在一起,因为在生成arf f文件的时候,可能会出现属性值不一样的情况,否则将为后来的测试过程带来麻烦。 通过统计数据信息,发现带有类标号的数据一共有100行,为了避免数据的过度拟合 ,必须把数据训练集校验分开,目前的拆分策略是各50行。类标号为'female'的数 据有21条,而类标号为'male'的数据有79条,这样目前遇到的问题是,究竟如何处理仅 有的21条female数据?为了能在训练分类模型时有更全面的信息,所以决定把包含21条 female类标号数据和29条male类标号数据作为模型训练数据,而剩下的另49条类标号 类male的数据将全部用于校验数据,这是因为在校验的时候,两种类标号的数据的作 用区别不大,而在训练数据模型时,则更需要更全面的信息,特别是不同类标号的数据 的合理比例对训练模型的质量有较大的影响。 2.3预处理具体步骤 第一步:合并movie_given.xlsx和test.xlsx,保存为total_data.xlsx; 第二步:在total_data.xlsx中删除多余的ID列信息; 第三步:在excel中打开"total_data.xlsx",选择菜单文件- >另存为,在弹出的对话框中,文件名输入"total_data",保存类型选择"CSV(逗号分隔 )"; 第四步:使用UltraEdit工具把total_data.csv中的数据缺失部分补上全局常量'?' ; 第五步:打开Weka的Exporler,点击Open file按钮,打开刚才得到的"total_data.csv"文件,点击"save"按钮,在弹出的对话框 中,文件名输入"total_data",文件类型选择"Arff data files(*.arff)",这样得到的数据文件为"total_data.arff"。 第六步:从total_data.arff文件里面剪切所有没有分类标号的数据作为预测数据(t est.arff),共26项。 第七步:把剩下含有类标号数据的total_data.arff文件复制一份,作为总的训练数据 。文件名称为build_model.arff。 第八步:从total_data.arff文件中剩下的数据里面选取所有分类标号为male的49行数据 作为校验数据(validate_data.arff)。 第九步:从把剩下的total_data.arff文件改名为train_data.arff。 3. 实验过程及结果截图 3.1决策树分类 用"Explorer"打开刚才得到的"train- data.arff",并切换到"Class"。点"Choose"按钮选择"tree (weka.classifiers.trees.j48)",这是WEKA中实现的决策树算法。 选择Cross-Validatioin folds=10,然后点击"start"按钮: "训练数据训练决策树得出的结果 " " " 使用不同配置训练参数,得到的实验数据: "配置不同的叶子节点的实例个数 " "实例数/叶节 "2 "3 "
首先,将不规则图片按照一定的方式划分为训练集测试集验证集,并将它们存储在不同的文件夹中。然后,我们需要使用Python中的Keras库来实现densenet-inception模型,并添加动态卷积层。 以下是示例代码: ```python from keras.layers import Input, Dense, Conv2D, MaxPooling2D, GlobalAveragePooling2D, Dropout, Concatenate, BatchNormalization, Activation from keras.models import Model from keras.optimizers import Adam from keras.regularizers import l2 import os # 定义输入形状 inputs = Input(shape=(224, 224, 3)) # 定义densenet-inception模型 def densenet_inception(inputs): # convolution block 1 x = Conv2D(64, (3,3), padding='same', kernel_regularizer=l2(0.01))(inputs) x = BatchNormalization()(x) x = Activation('relu')(x) # dense block 1 c1 = Concatenate()([inputs, x]) x = Conv2D(128, (1,1), padding='same', kernel_regularizer=l2(0.01))(c1) x = BatchNormalization()(x) x = Activation('relu')(x) x = Conv2D(32, (3,3), padding='same', kernel_regularizer=l2(0.01))(x) x = BatchNormalization()(x) x = Activation('relu')(x) # inception block 1 c2 = Concatenate()([inputs, x]) i1_1 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(c2) i1_1 = BatchNormalization()(i1_1) i1_1 = Activation('relu')(i1_1) i1_3 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(c2) i1_3 = BatchNormalization()(i1_3) i1_3 = Activation('relu')(i1_3) i1_3 = Conv2D(64, (3,3), padding='same', kernel_regularizer=l2(0.01))(i1_3) i1_3 = BatchNormalization()(i1_3) i1_3 = Activation('relu')(i1_3) i1_5 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(c2) i1_5 = BatchNormalization()(i1_5) i1_5 = Activation('relu')(i1_5) i1_5 = Conv2D(64, (5,5), padding='same', kernel_regularizer=l2(0.01))(i1_5) i1_5 = BatchNormalization()(i1_5) i1_5 = Activation('relu')(i1_5) i1_7 = MaxPooling2D((3,3), strides=(1,1), padding='same')(c2) i1_7 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(i1_7) i1_7 = BatchNormalization()(i1_7) i1_7 = Activation('relu')(i1_7) x = Concatenate()([i1_1, i1_3, i1_5, i1_7]) # dynamic convolution block 1 d1 = Conv2D(256, (1,1), padding='same', kernel_regularizer=l2(0.01))(x) d1 = BatchNormalization()(d1) d1 = Activation('relu')(d1) d1 = Conv2D(256, (3,3), padding='same', kernel_regularizer=l2(0.01))(d1) d1 = BatchNormalization()(d1) d1 = Activation('relu')(d1) d1 = Conv2D(1024, (1,1), padding='same', kernel_regularizer=l2(0.01))(d1) d1 = BatchNormalization()(d1) d1 = Activation('relu')(d1) d1 = Dropout(0.5)(d1) # dense block 2 c3 = Concatenate()([x, d1]) x = Conv2D(256, (1,1), padding='same', kernel_regularizer=l2(0.01))(c3) x = BatchNormalization()(x) x = Activation('relu')(x) x = Conv2D(32, (3,3), padding='same', kernel_regularizer=l2(0.01))(x) x = BatchNormalization()(x) x = Activation('relu')(x) # inception block 2 c4 = Concatenate()([x, d1]) i2_1 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(c4) i2_1 = BatchNormalization()(i2_1) i2_1 = Activation('relu')(i2_1) i2_3 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(c4) i2_3 = BatchNormalization()(i2_3) i2_3 = Activation('relu')(i2_3) i2_3 = Conv2D(64, (3,3), padding='same', kernel_regularizer=l2(0.01))(i2_3) i2_3 = BatchNormalization()(i2_3) i2_3 = Activation('relu')(i2_3) i2_5 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(c4) i2_5 = BatchNormalization()(i2_5) i2_5 = Activation('relu')(i2_5) i2_5 = Conv2D(64, (5,5), padding='same', kernel_regularizer=l2(0.01))(i2_5) i2_5 = BatchNormalization()(i2_5) i2_5 = Activation('relu')(i2_5) i2_7 = MaxPooling2D((3,3), strides=(1,1), padding='same')(c4) i2_7 = Conv2D(64, (1,1), padding='same', kernel_regularizer=l2(0.01))(i2_7) i2_7 = BatchNormalization()(i2_7) i2_7 = Activation('relu')(i2_7) x = Concatenate()([i2_1, i2_3, i2_5, i2_7]) # dynamic convolution block 2 d2 = Conv2D(256, (1,1), padding='same', kernel_regularizer=l2(0.01))(x) d2 = BatchNormalization()(d2) d2 = Activation('relu')(d2) d2 = Conv2D(256, (3,3), padding='same', kernel_regularizer=l2(0.01))(d2) d2 = BatchNormalization()(d2) d2 = Activation('relu')(d2) d2 = Conv2D(1024, (1,1), padding='same', kernel_regularizer=l2(0.01))(d2) d2 = BatchNormalization()(d2) d2 = Activation('relu')(d2) d2 = Dropout(0.5)(d2) # global average pooling and output layer x = Concatenate()([x, d2]) x = GlobalAveragePooling2D()(x) x = Dense(10, activation='softmax')(x) return x # 构建模型 outputs = densenet_inception(inputs) model = Model(inputs=inputs, outputs=outputs) # 编译模型 model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy']) # 加载数据 train_dir = 'path/to/train/dir' test_dir = 'path/to/test/dir' val_dir = 'path/to/val/dir' # 图像生成器 from keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1./255) val_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory(train_dir, target_size=(224,224), batch_size=32, class_mode='categorical') test_generator = test_datagen.flow_from_directory(test_dir, target_size=(224,224), batch_size=32, class_mode='categorical') val_generator = val_datagen.flow_from_directory(val_dir, target_size=(224,224), batch_size=32, class_mode='categorical') # 训练模型 model.fit_generator(train_generator, steps_per_epoch=7000//32, epochs=10, validation_data=val_generator, validation_steps=1000//32) # 评估模型 score = model.evaluate_generator(test_generator, steps=2000//32) print("Test accuracy:", score[1]) ``` 在上面的代码中,我们定义了一个densenet-inception模型,它包括了动态卷积层。我们还使用Keras的ImageDataGenerator类来加载和增强数据。最后,我们使用fit_generator()函数来训练模型,并使用evaluate_generator()函数来评估模型的性能。 请注意,这只是一种示例实现,您可能需要根据您的具体需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值