python 机器学习划分训练集/测试集/验证集

1.留出法(hold-out)

直接将数据集D划分为两个互斥的集合,训练集S、测试集T,用S训练模型,用T来评估其测试误差。

需要注意划分时尽可能保持数据分布的一致性,保持样本类别比例相似。可采用分层采样的方式。

在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。通常情况下我们将2/3~4/5的样本划分出来用于训练。

使用sklearn.model_selection中的train_test_split()来分割我们的数据集,其具体参数如下:

X、y代表带划分数据集所有样本特征集合(自变量)和标签集合(因变量);

test_size:测试集所占的比例,有以下几种输入类型:

  1.float型,0.0~1.0之间,此时传入的参数即作为测试集的比例;

  2.int型,此时传入的参数的绝对值即作为测试集样本的数量;

  3.None,这时需要另一个参数train_size有输入才生效,此时测试集取为train_size指定的比例或数量的补集;

  4.缺省时为0.25,但要注意只有在train_size和test_size都不输入值时缺省值才会生效;

train_size:基本同test_size,但缺省值为None,其实test_size和train_size输入一个即可;

random_state:int型,控制随机数种子,默认为None,即纯随机(伪随机);随机数种子其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数

stratify:控制分类问题中的分层抽样,为了保持split前类的分布,默认为None,即不进行分层抽样,当传入为数组时,则依据该数组进行分层抽样(一般传入因变量所在列即y);

shuffle:bool型,用来控制是否在分割数据前打乱原数据集的顺序,默认为True

返回值:

依次返回训练集自变量、测试集自变量、训练集因变量、测试集因变量,因此使用该函数赋值需在等号右边采取X_trainX_testy_trainy_test的形式;

如下是随机抽样时的sklearn实现:

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)

如下是分层抽样时的sklearn实现:

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,stratify=y)

随机划分法还有以下几种函数可以实现:ShuffleSplit,GroupShuffleSplit,StratifiedShuffleSplit

2.交叉验证法

交叉验证法(cross validation先将数据集D划分为k个大小相似的互斥子集,即D=D1UD2U...UDk,DiDj=Φ(i≠j),每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后每次用k-1个子集的并集作为训练集,剩下的那一个子集作为验证集;从而可以进行k次训练与测试,最终返回的是这k个测试结果的均值。显然,交叉验证法的稳定性和保真性在很大程度上取决与k的取值,因此交叉验证法又称作“k折交叉验证”(k-fold cross validation),k最常见的取值为10,即“10折交叉验证”,其他常见的有5,20等;

这个方法充分利用了所以样本,但计算比较繁琐,需要训练k次,测试k次

交叉验证法的一个特例:留一法(Leave-one-out,即LOO),留一法不受随机样本划分方式的影响,因为m个样本只有唯一的方式划分m个子集——每个子集包含一个样本,其优缺点如下:

1)优点:留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似,因此,留一法的评估结果往往被认为比较准确,

2)缺点:当数据集比较大时,训练m个模型的计算成本是难以想象的;

 

我们使用sklearn.model_selection里的函数进行交叉验证

K折交叉验证:KFold,GroupKFold,StratifiedKFold

留一法:LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,LeavePOut

3.自助法(bootstrapping

自助法则是使用有放回重复采样的方式进行数据采样,即我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。通过估计m次采样后每个样本大约有0.368的概率不被采样,因此我们可以认为在D中约有36.8%的数据没有在训练集中出现过。

优点:这种方法对于那些数据集小、难以有效划分训练/测试集时很有用

缺点:该方法改变了数据的初始分布导致会引入估计偏差。

这个可以自己自定义函数编程实现。

总结:

  1. 对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;
  2. 对于数据集小且难以有效划分训练/测试集时使用自助法
  3. 对于数据集小且可有效划分的时候最好使用留一法来进行划分,因为这种方法最为准确

 

TimeSeriesSplit():

  在机器学习中还存在着一种叫做时间序列的数据类型,这种数据的特点是高度的自相关性,前后相邻时段的数据关联程度非常高,因此在对这种数据进行分割时不可以像其他机器学习任务那样简单随机抽样的方式采样,对时间序列数据的采样不能破坏其时段的连续型,在sklearn.model_selection中我们使用TimeSeriesSplit()来分割时序数据,其主要参数如下:

n_splits:int型,控制产生(训练集+验证集)的数量;

max_train_size:控制最大的时序数据长度;

 

参考资料:https://www.cnblogs.com/feffery/p/8823405.html

                 https://www.cnblogs.com/nolonely/p/7007432.html



1.留出法(hold-out)

直接将数据集D划分为两个互斥的集合,训练集S、测试集T,用S训练模型,用T来评估其测试误差。

需要注意划分时尽可能保持数据分布的一致性,保持样本类别比例相似。可采用分层采样的方式。

在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。通常情况下我们将2/3~4/5的样本划分出来用于训练。

使用sklearn.model_selection中的train_test_split()来分割我们的数据集,其具体参数如下:

X、y代表带划分数据集所有样本特征集合(自变量)和标签集合(因变量);

test_size:测试集所占的比例,有以下几种输入类型:

  1.float型,0.0~1.0之间,此时传入的参数即作为测试集的比例;

  2.int型,此时传入的参数的绝对值即作为测试集样本的数量;

  3.None,这时需要另一个参数train_size有输入才生效,此时测试集取为train_size指定的比例或数量的补集;

  4.缺省时为0.25,但要注意只有在train_size和test_size都不输入值时缺省值才会生效;

train_size:基本同test_size,但缺省值为None,其实test_size和train_size输入一个即可;

random_state:int型,控制随机数种子,默认为None,即纯随机(伪随机);随机数种子其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数

stratify:控制分类问题中的分层抽样,为了保持split前类的分布,默认为None,即不进行分层抽样,当传入为数组时,则依据该数组进行分层抽样(一般传入因变量所在列即y);

shuffle:bool型,用来控制是否在分割数据前打乱原数据集的顺序,默认为True

返回值:

依次返回训练集自变量、测试集自变量、训练集因变量、测试集因变量,因此使用该函数赋值需在等号右边采取X_trainX_testy_trainy_test的形式;

如下是随机抽样时的sklearn实现:

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)

如下是分层抽样时的sklearn实现:

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,stratify=y)

随机划分法还有以下几种函数可以实现:ShuffleSplit,GroupShuffleSplit,StratifiedShuffleSplit

2.交叉验证法

交叉验证法(cross validation先将数据集D划分为k个大小相似的互斥子集,即D=D1UD2U...UDk,DiDj=Φ(i≠j),每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后每次用k-1个子集的并集作为训练集,剩下的那一个子集作为验证集;从而可以进行k次训练与测试,最终返回的是这k个测试结果的均值。显然,交叉验证法的稳定性和保真性在很大程度上取决与k的取值,因此交叉验证法又称作“k折交叉验证”(k-fold cross validation),k最常见的取值为10,即“10折交叉验证”,其他常见的有5,20等;

这个方法充分利用了所以样本,但计算比较繁琐,需要训练k次,测试k次

交叉验证法的一个特例:留一法(Leave-one-out,即LOO),留一法不受随机样本划分方式的影响,因为m个样本只有唯一的方式划分m个子集——每个子集包含一个样本,其优缺点如下:

1)优点:留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似,因此,留一法的评估结果往往被认为比较准确,

2)缺点:当数据集比较大时,训练m个模型的计算成本是难以想象的;

 

我们使用sklearn.model_selection里的函数进行交叉验证

K折交叉验证:KFold,GroupKFold,StratifiedKFold

留一法:LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,LeavePOut

3.自助法(bootstrapping

自助法则是使用有放回重复采样的方式进行数据采样,即我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。通过估计m次采样后每个样本大约有0.368的概率不被采样,因此我们可以认为在D中约有36.8%的数据没有在训练集中出现过。

优点:这种方法对于那些数据集小、难以有效划分训练/测试集时很有用

缺点:该方法改变了数据的初始分布导致会引入估计偏差。

这个可以自己自定义函数编程实现。

总结:

  1. 对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;
  2. 对于数据集小且难以有效划分训练/测试集时使用自助法
  3. 对于数据集小且可有效划分的时候最好使用留一法来进行划分,因为这种方法最为准确

 

TimeSeriesSplit():

  在机器学习中还存在着一种叫做时间序列的数据类型,这种数据的特点是高度的自相关性,前后相邻时段的数据关联程度非常高,因此在对这种数据进行分割时不可以像其他机器学习任务那样简单随机抽样的方式采样,对时间序列数据的采样不能破坏其时段的连续型,在sklearn.model_selection中我们使用TimeSeriesSplit()来分割时序数据,其主要参数如下:

n_splits:int型,控制产生(训练集+验证集)的数量;

max_train_size:控制最大的时序数据长度;

 

参考资料:https://www.cnblogs.com/feffery/p/8823405.html

                 https://www.cnblogs.com/nolonely/p/7007432.html



猜你喜欢

转载自blog.csdn.net/weixin_40902527/article/details/86246507