鱼C论坛

 找回密码
 立即注册
查看: 2413|回复: 0

python机器学习数据划分

[复制链接]
发表于 2019-8-1 16:47:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
机器学习划分
方法
留出法(hold-out)


留出法直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即D=S∪T,S∩T=空集。
在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
注意训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。




交叉验证(cross validation)


交叉验证法先将数据集D划分为k个大小相似的互斥子集,即D=D1∪D2∪……Dk,Di∩Dj=空集(i≠j)。每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。
然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样就可获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值。


显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值。k的常用取值是10,其他常用的k值有5和20等。


为减小因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的“10次10折交叉验证”。


特例: 留一法(样本数目m等于划分子集数k)留一法不受随机样本划分方式的影响,因为m个样本只有唯一的方式划分为m个子集。


在留出法和交叉验证法中,保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度过高。




自助法(BootStrapping)


——可减少训练样本规模不同造成的影响,同时能比较高效地进行实验估计。在数据集较小、难以有效划分训练/测试集时很有用。




以自助采样法为基础,给定包含m个样本的数据集D,我们对它进行采样产生数据集D’:每次随机从D中挑选一个样本,将其拷贝到D’中,然后放回样本,重复m次得到包含m个样本的数据集D’。


通过极限估计,初始数据集D中约有36.8%的样本未出现在采样数据集中,于是将D’作为训练集,D\D’作为测试集。








  1. def hold_out(dataSet, train_size):
  2.     """
  3.     留出法
  4.     dataSet:数据集
  5.     train_size:留出法中训练集所占得比例
  6.     """
  7.     totalLen = dataSet.shape[0]
  8.     train_len = int(totalLen * train_size)
  9.     index = range(totalLen)
  10.     index_1 = np.random.choice(index, train_len, replace=False)     # 训练集的索引
  11.     index_2 = np.delete(index, index_1)                      # 测试集的索引
  12.     train = dataSet[index_1]
  13.     test = dataSet[index_2]
  14.     return train, test
复制代码






  1. def cross_validation(dataSet, k):
  2.     """
  3.     交叉验证法
  4.     dataSet:数据集
  5.     k:交叉验证的次数
  6.     return : datasets:shape(k,num,feature)  list类型
  7.     """
  8.     datasets = []
  9.     num = int(dataSet.shape[0]/k)
  10.     start = 0
  11.     end = num
  12.     for i in range(k):
  13.         datasets.append(dataSet[start:end, :].tolist())
  14.         start += num
  15.         end += num
  16.     return datasets
复制代码





  1. def BootStrapping(dataSet):
  2.     """
  3.     自助法
  4.     :param dataSet:数据集
  5.     :return: train训练集,test测试集
  6.     """
  7.     m = dataSet.shape[0]
  8.     index1 = []
  9.     index2 = []
  10.     for i in range(m):
  11.         index1.append(np.random.randint(m))
  12.     index2 = np.delete(range(m), index1)
  13.     train = dataSet[index1]
  14.     test = dataSet[index2]
  15.     return train, test
复制代码







小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 23:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表