交叉验证是一种统计分析方法,其目的是判断机器学习模型的泛化误差和精度。它的主要流程是:
- 将数据集分割为k个相同大小的子集。
- 选取k-1个子集用于训练,剩余1个子集用于测试。
- 重复k次,每次选不同的测试子集,最终得到k个测试结果。
- 计算k个测试结果的平均值,作为最终的泛化误差和精度。
进行交叉验证的主要原因是:
- 避免过拟合:交叉验证使用 k-1 个子集进行训练,并在独立的子集上测试,可以更准确地估计泛化误差,避免过拟合。
- 无需单独测试集:无需提前分割出测试集,交叉验证可以最大限度地利用全部数据集。
- 评估稳定性:多次训练与测试可以评估模型的稳定性,过滤掉由于随机抽样产生的误差。
- 超参数优化:可以用于网格搜索或随机搜索得到最佳的模型超参数。
代码示例:
python
from sklearn.model_selection import KFold
from sklearn.svm import SVC
import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=2) # 2折交叉验证
for train_index, test_index in kf.split(X):
# 训练和测试数据
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# 构建和训练模型
clf = SVC()
clf.fit(X_train, y_train)
# 模型预测并计算准确率
y_pred = clf.predict(X_test)
accuracy = clf.score(X_test, y_test)
print(accuracy) # [1. 0.5] 求平均值0.75