什么是交叉验证,为什么要进行交叉验证?代码举例讲解

交叉验证是一种统计分析方法,其目的是判断机器学习模型的泛化误差和精度。它的主要流程是:

  1. 将数据集分割为k个相同大小的子集。
  2. 选取k-1个子集用于训练,剩余1个子集用于测试。
  3. 重复k次,每次选不同的测试子集,最终得到k个测试结果。
  4. 计算k个测试结果的平均值,作为最终的泛化误差和精度。

进行交叉验证的主要原因是:

  1. 避免过拟合:交叉验证使用 k-1 个子集进行训练,并在独立的子集上测试,可以更准确地估计泛化误差,避免过拟合。
  2. 无需单独测试集:无需提前分割出测试集,交叉验证可以最大限度地利用全部数据集。
  3. 评估稳定性:多次训练与测试可以评估模型的稳定性,过滤掉由于随机抽样产生的误差。
  4. 超参数优化:可以用于网格搜索或随机搜索得到最佳的模型超参数。
代码示例:
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