1. 什么是交叉验证
交叉验证(Cross-validation)主要用于建模应用中,例如PCR 、PLS 回归建模中。在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方加和。
而我们常用的就是K折交叉验证。K折就是讲数据集切分成K小块,验证集和测试集相互形成补集,循环交替,它有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性
你可能会问K选多少合适呢?我个人根据情况和个人喜好调节,常用的K值有3,6,10等。
K折交叉验证,初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10折交叉验证是最常用的。
2. 基本思想
交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。
3. 目的
用交叉验证的目的是为了得到可靠稳定的模型。在深度学习中可以使用图像的亮度,旋转,灰度,翻转等等(博主CV方向),也就是所谓的数据增强,二机器学习中此种方法也就类似于此。
在建立PCR 或PLS 模型时,一个很重要的因素是取多少个主成分的问题。用cross validation 校验每个主成分下的PRESS值,选择PRESS值小的主成分数。或PRESS值不再变小时的主成分数。
4. sklearn实现
def by_sklearn(k):
train = list()
test = list()
X = np.random.random_integers(10, 20, size=(4, 2))
kf = KFold(n_splits=k)
for train_index, test_index in kf.split(X):
train.append(X[train_index])
test.append(X[test_index])
return train, test
5. keras实现
def by_keras(param):
data = np.random.randint(0, 100, size=(100, 12))
X = data[:, 0:11]
Y = data[:, 11]
model = Sequential()
model.add(Dense(18, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, validation_data=0.33, epochs=100, batch_size=10)
return X, Y
详细代码见搓这里
6. 总结
测试准确度的一个缺点是其样本准确度是一个高方差估计(high variance estimate),所以该样本准确度会依赖不同的测试集,其表现效果不尽相同。
交叉验证的过程
- 选择K的值(一般是10),将数据集分成K等份
- 使用其中的K-1份数据作为训练数据,另外一份数据作为测试数据,进行模型的训练
- 使用一种度量测度来衡量模型的预测性能
交叉验证的优点
交叉验证通过降低模型在一次数据分割中性能表现上的方差来保证模型性能的稳定性
交叉验证可以用于选择调节参数、比较模型性能差别、选择特征
交叉验证的缺点
交叉验证带来一定的计算代价,尤其是当数据集很大的时候,导致计算过程会变得很慢
我是龙哥,一个什么都会一点的计算机小白,每天持续更新博客,欢迎添加微信,共同进步
微信
微信公众号
欢迎转载,转载请注明出处