【数据处理】数据集划分、打乱(shuffle)、以及keras里K-折交叉验证

前言  在进行机器学习的时候,本质上都是在训练模型,而训练模型都离不开对数据集的处理。往往在模型表现不佳或难以再提升的情况下,进行一定的处理,科学的训练会使模型再更进一步。目录前言1 数据集划分1.1 常规理解1.2 自己理解2 打乱(shuffle)2.1 numpy里的shuffle2.2 keras里的shuffle2.3 sklearn里的shuffle ★2.4 代码(2.1和2.3两种)3 keras里进行K-折交叉验证3.1 K-折交叉验证3.2 keras模型实现K折交叉验证3.3 完整
摘要由CSDN通过智能技术生成

前言

  在进行机器学习的时候,本质上都是在训练模型,而训练模型都离不开对数据集的处理。往往在模型表现不佳或难以再提升的情况下,进行一定的处理,科学的训练会使模型再更进一步。

1 数据集划分

1.1 常规理解

  这是老生常谈的问题,但理论和实践还是会有偏差。理论上,数据集可划分为三类,训练集验证集测试集。引用cnn网络为什么有时验证集会和训练集一起参与训练?的一个理解,这三者的关系就如同刷题模拟考高考。刷题不能刷到模拟考题目,那模拟考直接起飞,高考题目不准看,看了考的分数就是假分数。
  下面开始盗图,参考训练集、验证集、测试集划分,从图中可以看出各部分之间的关系,其中训练集和测试集是大家经常听到的,而验证集在图中归属于训练集,这也是导致验证集和测试集经常混淆的点。
在这里插入图片描述
在这里插入图片描述
  参考中还给了不同数据集大小的情况下划分比例。
在这里插入图片描述
在这里插入图片描述

1.2 自己理解

  自己其实在之前的博客中也经常搞混,现在来说下自己的理解,不一定正确。其实我认为,在写论文、打比赛的时候,我们主要划分的还是训练集与验证集,测试集不属于考虑范围,或者认为测试集和验证集是一个东西。以打比赛为例,我们拿到了比赛的数据集,然后自己进行了数据集划分,对于模型训练来说,数据量一般越多越好,所以我们是划分训练集与验证集,在验证集效果较好时,再把验证集也拿去训练。那测试集呢?测试集其实是比赛官方拿出一部分数据集出来,用它来评估你的模型。因此对于比赛选手来说,专门拿出测试集来仅进行测试是不利的,而一旦测试完又拿去训练,那就变成验证集了。所以,我认为只有真正在工业环境下,才需要进行严格的划分。

2 打乱(shuffle)

  既然有数据集的划分,那么就少不了随机打乱。因为原本的数据集有可能是有序的,如果正例集中在前面,负例集中在后面,那么便会导致验证集或测试集会出现大部分是负例的情况。很有可能导致负例训练效果不佳,模型整体性能变差。此外,就算不是有序的,打乱也会显得更为“公平”,也给模型提升多一份机会。(即随机划分出的某个数据集可能更能代表整体数据(包括未收集到的数据))。
  那么接下来介绍shuffle的几种方式:numpy shuffle、keras fit里的shuffle以及sklearn shuffle。
  当你的数据集比较简单的时候,如特征与标签在一个numpy矩阵中,那么可以直接选用numpy里的shuffle。以鸢尾花数据集为例,该数据集本身是有序的,部分数据如下所示。
在这里插入图片描述

2.1 numpy里的shuffle

  该方法适合简单的矩阵,且特征和标签未分开。如果是分开的,还要先合并再拆开。

# In[*] shuffle in numpy
def shuffle_np(X,Y):
    Y = Y.reshape(len(Y),1)
    data = np.concatenate([X,Y],axis=-1)
    np.random.seed(1337)
    np.random.shuffle(data)
    print(data)
    X = data[:,:-1]
    Y = data[:,-1]
    return X,Y

  部分效果。
在这里插入图片描述

2.2 keras里的shuffle

  可参考Keras model.fit()参数详解,要注意这里的shuffle的解释是:
在这里插入图片描述
  但由于这是封闭的,看不到shuffle后的结果。其次,有很多博客说这个函数是个坑参考[keras中文文档笔记6——使用陷阱],因为fit函数往往先执行了validation_split再执行shuffle,参考[【私人笔记】深度学习框架keras踩坑记],意味着数据先被分割了再打乱,那么这个“打乱”可能并不能达到我们想要的效果,即仍会有负例全被分割在验证集,导致训练效果不佳的出现。

2.3 sklearn里的shuffle ★

  这个是目前我接触到最好用的shuffle,因为它既可以如2.1一样,打乱一个矩阵,也可以同时打乱两个变量组成的特征与标签,而且随机种子也集成了,总之就是省事。

from sklearn.utils import shuffle
X,Y = shuffle(X,Y, random_state=1337) 

在这里插入图片描述

2.4 代码(2.1和2.3两种)

from sklearn import datasets
from keras.layers import *
import keras.backend as K
from keras import Model
from keras.utils import plot_model,to_categorical
import pandas as pd
import numpy as np
from keras.utils import plot_model
from sklearn.utils import shuffle
# In[*] get data 
iris = datasets.load_iris()
X = np.array(iris['data'])
Y = np.array(iris['target'])

# In[*] shuffle in numpy
def shuffle_np(X,Y):
    Y = Y.reshape(len(Y),1)
    data = np.concatenate
  • 24
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Keras可以很容易地处理本地数据集。下面是一些处理本地数据集的步骤: 1. 确定你的本地数据集的存储路径和格式。 2. 加载数据集并将其转换为Keras所需的格式。例如,对于图像数据集,你可以使用`ImageDataGenerator`类来加载和预处理数据集。 3. 划分数据集为训练集、验证集和测试集。你可以使用`train_test_split`函数来划分数据集。 4. 定义模型并编译。你可以使用Keras的Sequential API或Functional API来定义模型。 5. 使用`fit`函数来训练模型。你可以指定训练集和验证集,以及其他训练参数。 6. 使用`evaluate`函数来评估模型在测试集上的表现。 7. 使用`predict`函数来预测新数据的标签。 下面是一个加载和处理图像数据集的示例代码: ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator from sklearn.model_selection import train_test_split # 设置数据路径和格式 data_path = "path/to/data" img_size = (224, 224) batch_size = 32 # 加载数据集 datagen = ImageDataGenerator(rescale=1./255) data_generator = datagen.flow_from_directory( data_path, target_size=img_size, batch_size=batch_size, class_mode='categorical') # 划分数据集为训练集、验证集和测试集 train_data, test_data, train_labels, test_labels = train_test_split( data_generator, data_generator.classes, test_size=0.2, random_state=42) # 定义模型并编译 model = Sequential(...) model.compile(...) # 训练模型 model.fit( train_data, train_labels, batch_size=batch_size, epochs=10, validation_data=(test_data, test_labels)) # 评估模型 score = model.evaluate(test_data, test_labels) # 预测新数据的标签 pred_labels = model.predict(new_data) ``` 你可以根据你的数据集和模型来调整这个示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lechuan_dafo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值