<
>

【学习机器学习】实验——模型评估与选择

2020-06-28 12:10:39 来源:易采站长站 作者:易采站长站整理


"Stratified train/test split is not implemented for "
"shuffle=False")

train = np.arange(n_train)
test = np.arange(n_train, n_train + n_test)

else:
if stratify is not None:
CVClass = StratifiedShuffleSplit
else:
CVClass = ShuffleSplit

cv = CVClass(test_size=n_test,
train_size=n_train,
random_state=random_state)

train, test = next(cv.split(X=arrays[0], y=stratify))

return list(chain.from_iterable((safe_indexing(a, train),
safe_indexing(a, test)) for a in arrays))
#返回值:一个列表,依次给出一个或者多个数据集的划分的结果。每个数据集都划分为两部分:训练集和测试集。

# Tell nose that train_test_split is not a test.
# (Needed for external libraries that may use nose.)
train_test_split.__test__ = False

一些参数的意义我已经写了注释,不过注释并不全面完整,因为这些参数可以取浮点值可以取整数值,还可以有布尔值的表示,我只列出了这次实验要用的最常用的。另外最后实际生效用来做划分的ShuffleSplit对象,以及调用split方法,大家可以点进链接看看比较专业的解答。

1.2 p次k折交叉验证法

交叉验证的原理也很好理解,把原本的数据集近似均分(大小相似即可)的划分为k个子集。每次用k-1个子集的并集作为训练集,剩下的那1个作为测试集,这样一来k折就会有k次训练、测试结果,而p次k折一共可以做出k*p次结果,却只需要p次划分,相当方便。
sklearn里面直接就有一个RepeatedKFold对象,完美实现:

    count = 0
kf = RepeatedKFold(n_splits=10, n_repeats=5, random_state=0)
for train, test in kf.split(data):
# print("%s""n""%s" % (train, test))
np.savetxt("./交叉验证法数据/train{no}.csv".format(no=count+1), train, fmt="%f", delimiter=",")
np.savetxt("./交叉验证法数据/test{no}.csv".format(no=count+1), test, fmt="%f", delimiter=",")
count = count + 1

这个的源码就不看了,因为连随机都用不到,直接等分即可。另外k折可以衍生出一种留一法,即假设数据有m条,那么就m折(每条数据算一个子集),这样即使数据不多也可以大幅提高测试量,结果一般会更准(但不一定),缺点是太费时。

1.3 自助法

自助法我喜欢叫抽签法,因为和概率论里那些抽来抽去的好像。基本原理就是对有m个数据的数据集进行m次有放回的抽取,把抽到的作为训练集D’,D-D’作为测试集。
从原理上讲,有大概35%的数据永远不会被抽到,因此一般只用于小量数据或者难以有效划分训练/测试集时才会用。

暂时禁止评论

微信扫一扫

易采站长站微信账号