目录
4.1Python代码实现划分训练集和测试集
伪随机函数介绍网站:https://docs.python.org/3/library/random.html。
# 导入库
from random import seed # 用于固定每次生成的随机数都是确定的(伪随机数)
from random import randrange # 用于生成随机数
def train_test_split(dataset,train=0.6):
"""
该函数用于划分训练集和测试集
Parameters
----------
dataset : 二维列表
传入需要划分成训练集和测试集的数据集.
train : 浮点数
传入训练集占整个数据集的比例.默认是0.6.
Returns
-------
train_basket : 二维列表
划分好的训练集.
dataset_copy : 二维列表
划分好的测试集.
"""
# 创建一个空列表用于存放后面划分好的训练集
train_basket = list()
# 根据输入的训练集的比例计算出训练集的大小(样本数量)
train_size = train*len(dataset)
# 复制出一个新的数据集来做切分,从而不改变原始的数据集
dataset_copy = list(dataset)
# 执行循环判断,如果训练集的大小小于所占的比例,就一直往训练集里添加数据
while len(train_basket) < train_size:
# 通过randrange()函数随机产生训练集的索引
random_choose = randrange(len(dataset_copy))
# 根据上面生成的训练集的索引将数据集中的样本加到train_basket中
# 注意pop函数会根据索引将数据集中的样本给移除,所以循环结束之后剩下的样本就是测试集
train_basket.append(dataset_copy.pop(random_choose))
return train_basket,dataset_copy
# 主函数
if '__main__' == __name__:
# 定义一个随机种子,使得每次生成的随机数都是确定的(伪随机数)
seed(666)
dataset = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]
# 调用手动编写的train_test_split函数划分训练集和测试集
train,test = train_test_split(dataset)
4.2 交叉验证
有关交叉验证的网站介绍:https://en.wikipedia.org/wiki/Cross-validation_(statistics)#k-fold_cross-validation(注:下面的一些图片转载自该网站,并非原创)。
交叉验证,[2] [3] [4]有时称为旋转估计[5] [6] [7]或样本外测试,其是一种重采样方法,它使用数据的不同部分在不同的迭代中测试和训练模型。在预测问题中,通常给模型一个已知数据集(训练数据集)和一个用于测试模型的未知数据集(或首次看到的数据)(称为验证数据集或测试)。[8] [9]交叉验证的目标是测试模型预测新数据的能力,以标记过度拟合或选择偏差等问题[10]并深入了解模型将如何推广到独立数据集(即未知数据集,例如来自实际问题)。一轮交叉验证涉及将数据样本划分为互补子集,对一个子集(称为训练集)执行分析,并在另一个子集(称为验证集或测试集)上验证分析。为了减少可变性,在大多数方法中,使用不同的分区执行多轮交叉验证,并将验证结果在各轮中组合(例如求平均准确率)以估计模型的预测性能。总之,交叉验证在预测中结合平均准确率,以得出更准确的模型预测性能。[11]
图1 比较五种分类模型的交叉验证准确率和假阴性(高估)百分比。气泡大小代表交叉验证准确度的标准偏差