Keras与Sklearn数据切分及交叉验证实战指南
本文详解在深度学习训练中如何使用Keras进行数据切分,包括通过validation_split自动切分验证集和结合Sklearn手动指定验证集两种方法。同时深入解析K折交叉验证原理,展示利用StratifiedKFold进行分层抽样的完整代码示例,并厘清训练集、验证集与测试集的核心区别,帮助开发者更准确地评估模型泛化能力。
Keras数据切分与验证集评估概述
在深度学习模型的训练流程中,通常需要将原始数据集划分为训练集与验证集。Keras框架提供了两种主要的模型性能评估路径:
利用框架自动切分生成的验证集
通过用户手动指定切分的验证集
自动切分验证集的实现与注意事项
一、自动切分策略
在Keras环境中,可以从原始数据集中截取一部分作为验证集,并在每一次迭代(epoch)过程中对模型在验证集上的表现进行评估。
具体实现时,调用model.fit()函数训练模型,可以通过设置validation_split参数来定义从数据集中切分出验证集的比例。
# MLP with automatic validation set
from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
numpy.random.seed(7)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10)
该参数接受0到1之间的浮点数,用于指定训练集中一定比例的数据被用作验证集。需要注意的是,验证集数据不会参与模型参数的更新训练,但会在每个epoch结束后用于测试模型的各项指标,例如损失函数值和精确度等。
需要特别注意的是,validation_split的划分操作发生在数据打乱(shuffle)之前。因此,如果原始数据集本身具有顺序性,必须先手动对数据进行打乱处理,然后再指定validation_split,否则可能导致验证集中的样本分布不均匀,影响评估结果的可靠性。
手动指定验证集的操作方法
二、手动切分策略
Keras支持在模型训练过程中手动指定验证集数据。
例如,可以利用Sklearn库中的train_test_split()函数对数据集进行预先切分,随后在调用keras的model.fit()时,通过validation_data参数传入之前切分好的验证集数据。
# MLP with manual validation set
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# split into 67% for train and 33% for test
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=150, batch_size=10)
K折交叉验证原理与Sklearn实现
三、K折交叉验证(K-Fold Cross Validation)
该方法将数据集划分为k个子样本。在每一轮迭代中,使用其中的(k-1)个子样本进行模型训练,而剩余的1个子样本用于验证。通过执行k轮这样的操作,可以得到k个不同的模型。最终,将这k次评估的性能指标取平均值,作为该算法整体性能的代表。通常k值选取为5或10。
该方法的优点在于能够较为稳健地评估模型在未知数据上的泛化性能。
其缺点在于计算复杂度较高。因此,当数据集规模较大、模型结构复杂或计算资源有限时,该方法可能并不适用,特别是在训练大型深度学习模型时尤为明显。
Sklearn的model_selection模块提供了多种交叉验证变体,包括KFold、RepeatedKFold、LeaveOneOut、LeavePOut、ShuffleSplit、StratifiedKFold、GroupKFold以及TimeSeriesSplit等。
在下面的示例中,我们采用StratifiedKFold进行分层抽样。其核心作用是确保在切割后的每一个小数据集中,各类别样本的比例与原数据集中的比例保持一致。
# MLP for Pima Indians Dataset with 10-fold cross validation
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import StratifiedKFold
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# define 10-fold cross validation test harness
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
cvscores = []
for train, test in kfold.split(X, Y):
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0)
# evaluate the model
scores = model.evaluate(X[test], Y[test], verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
cvscores.append(scores[1] * 100)
print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))
训练集、验证集与测试集的职能辨析
补充知识:训练集、验证集与测试集的职能区分
训练集:通过最小化目标函数(即损失函数加上正则项)来训练模型的参数。当目标函数达到最小化状态时,模型训练过程完成。
验证集:主要用于模型超参数的选择,例如确定模型的阶数。目标函数最小化所对应的阶数,即为最终选定的模型阶数。
注意事项:
1. 验证集在训练过程中会被反复使用,在机器学习中作为不同模型选择的评判标准,在深度学习中则用于确定网络层数及每层节点数的评判依据。
2. 验证集的使用并非绝对必要。如果网络的层数和节点数已经预先确定,则无需进行此步骤操作。
测试集:用于评估模型的泛化能力。基于已选定的、训练好的最终模型,评估其在未见数据上的表现。
注意事项:
测试集仅用于评判最终训练好模型的泛化能力,且整个评估过程只进行一次。
以上关于Sklearn和Keras数据切分与交叉验证的实例详解即为全部内容,希望能对读者有所启发,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













