交叉验证法实现:
""" 交叉验证法(cross validation)可以很好地解决留出法的问题,它对数据量的要求不高,并且样本信息损失不多。 交叉验证法先将数据集D划分为k个大小相似的互斥子集,即 D = D 1 ∪ D 2 ∪ . . . ∪ D k , D i ∩ D j = ∅ ( i ≠ j ) D = D_1 \cup D_2 \cup ...\cup D_k, D_i \cap D_j = \varnothing(i \neq j) 为了保证数据分布的一致性,从D中随机分层抽样即可。 之后,每次都用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样我们就可以获得k组训练/测试集,从而进行k次训练和测试,最终返回这k组测试的均值。 具体说来,我们以k=10为例: 第一次我们选取第10份数据为测试集,前9份为训练集; 第二次我们选取第9份数据为测试集,第1-8和10为训练集; … 第十次我们选取第1份数据为测试集,第2-9为训练集; 由此,我们共获得10组训练集和测试集,进行10次训练和测试,最终返回10次测试结果的均值。 显然, 交叉验证法结果的稳定性和保真性很大程度取决于K的选择,为了强调这一点,交叉验证法也称为 K折交叉验证法,k的取值通常是10, 也有取5和20的。 """ #交叉验证法的实现 import pandas as pd from sklearn.model_selection import KFold data = pd.read_excel("data") kf = KFold(n_splits=4, shuffle=False, random_state=None) """ n_splits表示将数据分成了几份, shuffle 和random_state 表示是否随机生成 如果shuffle = False ,random_state=None, 重复运行将产生同样的结果 如果shuffle = True ,random_state=None, 重复运行将产生不同样的结果 如果shuffle = True ,random_state=(一个数值), 重复运行将产生同样的结果 """ for train, test in kf.split(data): print("%s %s" % (train, test)) """ #样例结果 [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18] [0 1 2 3 4] [ 0 1 2 3 4 10 11 12 13 14 15 16 17 18] [5 6 7 8 9] [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18] [10 11 12 13 14] [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] [15 16 17 18] """
留出法的实现:
"""留出法是最常用最直接最简单的方法,它直接将数据集D拆分成两个互斥的集合,其中一个作为训练集R,另一个作为测试集T。 即 D = S ∪ T , S ∩ T = ∅ D = S∪T,S∩T = \varnothing D=S∪T,S∩T=∅ 在使用留出法时,需要注意: 1.要有足够的样本量,以保证训练模型的效果 2.在划分市要注意保证数据分布的一致性,采用随机分层抽样即可 3.为了减弱随机划分的影响,重复划分训练集和测试集,对得到的多次结果取平均作为最后的的结果 4.一般训练集和测试集的比例在8:2或者是7:3 当然留出法的缺点就是 它会损失一定的样本信息;同时需要的样本足够大 """ # 留出法的实现 from sklearn.model_selection import train_test_split train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state=0) # X,为原始数据的自变量, Y为原始数据的因变量; # train_X, test_X 是将X按照8:2划分所得到; # train_Y, test_Y 是将Y按照8:2划分所得到; # test_size 是划分的比列; # random_state设置了是否使用随机数
留一法的实现:
""" 留一法,与留出法相比较,交叉验证的数据损失小,更加适合小样本的数据,但是其计算复杂度高, 存储空间变大 极端的来说,如皋将数据集D(m个样本)分成m份, 每次都是取m-1个样本为训练集,剩下的那一个为测试集, 共进行m次训练和测试,这种方法叫做留一法 """ # 留一法的优点是只损失一个样本,并不会受到样本随机划分的影响, 但是其计算复杂度过高,空间存储占用过大 #留一法的实现 from sklearn.model_selection import LeaveOneOut import numpy as np X = np.array([[1, 2, 3, 4], [11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]]) y = np.array([1,1,0,0]) loo = LeaveOneOut() for train_index, test_index in loo.split(X, y): print("Train Index:", train_index) print("Test Index:", test_index) print("X_train:", X[train_index]) print("X_test:", X[test_index]) print("")
代码是参照部分博客的,但是我忘记了博客的地址, 如有侵权还请联系删除。