1 测试集和训练集的划分
我们需要从所有数据中额外取出一些数据来用作模型训练完成后的评估,所以需要训练集的测试集的划分
训练集和测试集的划分我们一般使用scikit-learn下的model_selection模块进行,代码如下
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
其中 X X X是data数据, y y y是标记数据,test_size是test数据所占比例,random_state是随机种子,能够保证你在对多组样本数量相同的数据拆分,相应的index可以对应
2 K折交叉
交叉验证我们使用的也是scikit-learn下的model_selection模块,主要是KFold类,使用方法如下
# K折交叉
from sklearn.model_selection import KFold
def kfold(X, y, n_splits):
kf = KFold(n_splits=n_splits, shuffle=True, random_state=1)
for train_index, test_index in kf.split(X, y):
yield X[train_index], y[train_index], X[test_index], y[test_index]
以上代码会生成一个得到k折交叉的数据集的生成器,接下来只需要使用for循环来调取数据即可
for train_data, train_label, test_data, test_label in kfold(X, y, 10):
pass
3 mini-batch
为了计算的效率,我们会把数据分解为多个batch,当模型遍历完一个batch才会更新一次参数。batch的划分可以通过手动完成,也可以通过其他工具完成,我们这里提供tensorflow和pytorch的batch划分方式
- tensorflow:在tensorflow中我们使用tf.data.DataSet来进行分batch的操作
# X和y是读取的data和label
train_x = tf.placeholder(shape=data.shape, dtype=data.dtype)
train_y = tf.placeholder(shape=label.shape, dtype=label.dtype)
# 创建dataset
dataset = tf.data.DataSet.from_tensor_slices((train_x, train_y))
# 创建batch(打乱,分批,重复)
batch_size = 64
dataset = dataset.shuffle(2).batch(batch_size).repeat()
iterator = dataset.make_initializable_iterator()
next_batch = iterator.get_next()
# ...此处省略你的其他处理
with tf.Session() as tf:
sess.run(iterator.initializer, feed_dict={train_x:X, train_y:y})
x_batch, y_batch = sess.run(next_batch)
# ...此处省略训练
具体操作见文档
- pytorch:pytorch对batch的实现比tensorflow简单很多
from torch.utils import data
batch_size = 64
dataset = data.TensorDataset(X, y)
data_iter = data.DataLoader(dataset, batch_size, shuffle=True)
# 这个实际上是定义了一个生成器
# ...此处省略其他处理
for x_batch, y_batch in data_iter:
# ...此处省略训练
具体见文档