K-交叉验证是指将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.。而K-CV 的实验共需要建立 k 个models,并计算 k 次 test sets 的平均辨识率。在实作上,k 要够大才能使各回合中的 训练样本数够多,一般而言 k=10 (作为一个经验参数)算是相当足够了。
例如:假设将数据集D分为K个包(这里K = 6),每次将其中一个包作为验证集,其他K-1个包作为训练集
##一个简单的4折交叉验证
from sklearn.model_selection import KFold
import numpy as np
import matplotlib.pyplot as plt
X = np.array([[1,2], [3,4], [1,3], [3,5]])
Y = np.array([1, 2, 3, 4])
KF = KFold(n_splits = 4) #建立4折交叉验证方法 查一下KFold函数的参数
for train_index, test_index in KF.split(X):
print("TRAIN", train_index, "TEST", test_index)
X_train, X_test = X[train_index], X[test_index]
Y_train, Y_test = Y[train_index], Y[test_index]
print("对于数据X训练数据:", X_train)
print("对于数据X测试数据:", X_test)
print("对于数据Y训练数据:", Y_train)
print("对于数据Y测试数据:", Y_test)
结果如下:
'''代码解释
1、KFold(n_splits = 4) 2、KF.split(X)
n_splits:表示划分几等份
shuffle:在每次划分时,是否进行洗牌,①若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同,②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的
random_state:随机种子数
split():将数据集划分成训练集和测试集,返回索引生成器'''
from sklearn.model_selection import KFold
kf = KFold(n_splits=5, random_state=43, shuffle=True)
a=[[1,2],[3,4],[5,6],[7,8],[9,10]]
b=[1,2,3,4,5]
for i,j in kf.split(a,b):
print(i,j)