sklearn包中拆分数据集进行交叉验证的方法对比

一、对比训练模型前,不同拆分数据集方法

  1. sklearn.model_selection.KFold()
    交叉采样,将实验数据划分得到若干个互斥子集。
  2. sklearn.model_selection.StratifiedKFold()
    根据数据标签各类型占比进行交叉采样,将实验数据划分得到若干个互斥子集。
  3. sklearn.cross_validation.train_test_split()
    按特定比例,将实验数据随机拆分为实验数据和测试数据。

此外还有sklearn.cross_validation.cross_val_score(),其作用在于利用所选的模型对实验数据进行交叉验证,并输出评分(根据cv的分组)。
参考:cross_val_score用法

二、具体用法比较
结合不同的问题选取相应的采样或数据拆分方法,一般而言在分类问题中,对数据进行交叉采样时选择StratifiedKFold可能比较合适,如果是回归问题则可选择另外两种方法。
1、KFold交叉采样
将训练/测试数据集划分n_splits个互斥子集,每次只用其中一个子集当做测试集,剩下的(n_splits-1)作为训练集,进行n_splits次实验并得到n_splits个结果。

from sklearn.model_selection import KFold
kfolder=sklearn.model_selection.KFold(n_splits=3,shuffle=False,random_state=None)

2、StratifiedKFold分层采样
与KFold最大的差异在于,StratifiedKFold方法是根据标签中不同类别占比来进行拆分数据的。

from sklearn.model_selection import StratifiedKFold
sfolder=sklearn.model_selection.StratifiedKFold(n_splits=3,shuffle=False,random_state=None)

n_splits:表示将数据划分几等份
shuffle:在每次划分时,是否进行洗牌
若为False,其效果相当于random_state为整数(含零),每次划分的结果相同
若为True,每次划分的结果不一样,表示经过洗牌,随机取样的
random_state:随机种子数,当设定值(一般为0)后可方便调参,因为每次生成的数据集相同;若设为None,则每次拆分结果可能不同
StratifiedKFold和KFold用法区别

3、train_test_split拆分数据
按照设定的比例,随机将样本集合划分为训练集和测试集,并返回划分好的训练集和测试集数据。

from sklearn.cross_validation import train_test_split
X_train,X_test, y_train, y_test =
cross_validation.train_test_split(X,y,test_size=0.4, random_state=0)

X:待划分的样本特征集合
y:待划分的样本标签
test_size:若在0~1之间,为测试集样本数目与原始样本数目之比;若为整数,则是测试集样本的数目。
random_state:随机数种子
X_train:划分出的训练集数据
X_test:划分出的测试集数据
y_train:划分出的训练集标签
y_test:划分出的测试集标签

import numpy as np
from sklearn.model_selection import train_test_split
 
X,y=np.arange(10).reshape((5,2)),range
X=np.array([[0,1],[2,3],[4,5],[6,7],[8,9]])
y=[0,1,2,3,4]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print(X_train,'\n')
print(y_train,'\n')
print(X_test,'\n')
print(y_test)
>>>
[[2 3]
 [6 7]
 [8 9]] 

[1, 3, 4] 

[[4 5]
 [0 1]] 

[2, 0]

你可能感兴趣的:(python学习)