交叉验证是机器学习的重要概念。

为了能够让模型更加稳定,需要用数据集的不同子集进行反复的验证。如果只是对特定的子集进行微调,最终可能会过度拟合(overfitting)模型

过度拟合是指模型在已知数据集上拟合得超级好,但是一遇到未知数据就挂了。

我们真正想要的,是让机器学习模型能够适用于未知数据。


当处理机器学习模型时,通常关心3个指标:精度(precision)、召回率(recall)和F1得分(F1 score)。可以用参数评分标准(parameter scoring)获得各项指标的得分。

  • 精度是指被分类器正确分类的样本数量分类器总分类样本数量的百分比(分类器分类结果中,有一些样本分错了)
  • 召回率是指被应正确分类的样本数量某分类总样本数量的百分比(有一些样本属于某分类,但分类器却没有分出来)
  • F1 score是精度和召回率的合成指标,实际上是精度和召回率的调和均值(harmonic mean),计算方式为F1 score=2×精度×召回率 / (精度+召回率)

通过一个例子来详细说明这三个指标:

假设数据集有100个样本,其中有82个样本是我们感兴趣的,现在想用分类器选出这82个样本。最终,分类器选出了73个样本,它认为都是我们感兴趣的。在这73个样本中,其实只有65个样本是我们感兴趣的,剩下的8个样本我们不感兴趣,是分类器分错了。可以如下方法计算分类器的精度:

  • 分类正确的样本数量 = 65
  • 总分类样本数量 = 73
  • 精度 = 65 / 73 = 89.04%

召回率的计算过程如下:

  • 数据集中我们感兴趣的样本数量 = 82
  • 分类正确的样本数量 = 65
  • 召回率 = 65 / 82 = 79.26%

一个给力的机器学习模型需要同时具备良好的精度和召回率。这两个指标是二律背反的,一个指标达到100%,那么另一个指标就会非常差!我们需要保持两个指标能够同时处于合理高度。为了量化两个指标的均衡性,引入了 F1得分指标,是精度和召回率的合成指标,实际上是精度和召回率的调和均值(harmonic mean):

F1 score=2×精度×召回率 / (精度+召回率)

上面示例中 F1得分的计算过程如下:

F1 score=2×0.89×0.79 / (0.89+0.79)=0.8370


来个代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.naive_bayes import GaussianNB
from sklearn import model_selection

classifier_gaussiannb = GaussianNB()

num_validations = 5

# 计算精度
precision = model_selection.cross_val_score(classifier_gaussiannb, X, y, scoring='precision_weighted', cv=num_validations)
print("Precision: " + str(round(100*precision.mean(), 2)) + "%")

# 计算召回率
recall = model_selection.cross_val_score(classifier_gaussiannb, X, y, scoring='recall_weighted', cv=num_validations)
print("Recall: " + str(round(100*recall.mean(), 2)) + "%")

# 计算F1 得分
f1 = model_selection.cross_val_score(classifier_gaussiannb, X, y, scoring='f1_weighted', cv=num_validations)
print("F1 score: " + str(round(100*f1.mean(), 2)) + "%")

(上述代码来自书本《Python 机器学习经典实例》)