• 背景
  • 原理
  • 适用场景
  • 案例说明

背景

通过模型验证结果,根据结果来选择最合适的模型。特别是对于监督学习而言,会希望好的模型对未知数据处理有很强的泛化能力。目前模型常用的几种方式。

  1. 用训练准确度,也就是全部数据进行训练和测试。这种方法可能会导致模型过拟合;
  2. 用测试准确度,可以有效避免过拟合,也是最常用的方式。具体是将所有数据分成训练集和测试集两部分,用训练集进行模型训练,得到的模型再用测试集来衡量模型的预测表现能力。测试准确度的缺点是其样本准确度是一个高方差估计。样本准确度依赖不同的测试集,每次测试集结果是不同的,结果呈现是一组低偏差,高方差数据。
  3. 交叉验证。也叫 K 折交叉验证,是在测试准确度的基础上,确定把训练集、测试集分成 K 次(K 取决于数据量大小或者个人经验),然后取结果平均值。

原理

  1. 将数据集平均分割成K个等份;
  2. 使用 1 份数据作为测试数据,其余作为训练数据;
  3. 计算测试集准确率;
  4. 使用不同的测试集,重复2、3步骤;
  5. 测试集准确率取平均值,作为对未知数据预测准确率的估计。

注意:

  1. K = 10是常规建议,如上面所说,K 取决于数据量大小、个人经验、分析目的。
  2. 对于分类问题,应该使用分层抽样(stratified sampling)来生成数据,保证正负例的比例在训练集和测试集中的比例相同。

适用场景

在模型选择、参数选择、交叉验证的场景下可以使用交叉验证。

案例说明

使用 iris 数据,KNN 和 logistic 回归模型进行模型的比较和选择。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score

# read in the iris data
iris = load_iris()
X = iris.data
y = iris.target

# 10折 KNN model
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=20)
print(cross_val_score(knn, X, y, cv=10, scoring='accuracy').mean())

# 10折 logistic regression
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
print(cross_val_score(logreg, X, y, cv=10, scoring='accuracy').mean())
1
2
0.9800000000000001
0.9733333333333334