﻿1
00:00:16,779 --> 00:00:24,500
大家好！在我们学习更多简单分类方法之前，我们先来学习过度拟合（overfit）。

2
00:00:25,890 --> 00:00:30,190
任何机器学习方法都有可能过度拟合训练数据。

3
00:00:30,190 --> 00:00:36,760
当创建的分类器过度拟合训练数据时，就很难推广到

4
00:00:36,760 --> 00:00:39,460
独立的测试数据。

5
00:00:39,460 --> 00:00:43,470
还记得你在第二部分开始创建的用户分类器吗？

6
00:00:43,470 --> 00:00:49,440
想象用小圈圈住每一个

7
00:00:49,440 --> 00:00:51,280
训练数据点。

8
00:00:51,280 --> 00:00:56,890
你可以花精力去创建一个百分百符合训练数据的分类器，

9
00:00:56,890 --> 00:01:01,280
但是这很可能不适用于独立的测试数据。

10
00:01:01,280 --> 00:01:03,320
这就是过度拟合（overfit）。

11
00:01:03,320 --> 00:01:04,900
一个常见的问题。

12
00:01:04,900 --> 00:01:07,040
我们用OneR来讲解过度拟合。

13
00:01:09,020 --> 00:01:14,960
我们来看数字性的天气数据。

14
00:01:14,960 --> 00:01:18,630
温度和湿度值都是数字，而不是名词性的值。

15
00:01:18,630 --> 00:01:25,630
你想一下OneR怎么工作，如果它用温度属性生成规则。

16
00:01:25,640 --> 00:01:31,430
它会针对数据集中14个不同的实例，生成有14个分叉的

17
00:01:31,430 --> 00:01:33,710
复杂的规则。

18
00:01:33,710 --> 00:01:39,290
每个规则的错误率都是零，也就是说，完全正确。

19
00:01:39,290 --> 00:01:44,070
根据属性温度分叉，我们可以得到一个完美的规则，

20
00:01:44,070 --> 00:01:45,210
完全没有错误。

21
00:01:48,020 --> 00:01:52,990
事实上，OneR有一个限定规则复杂度的参数。

22
00:01:53,920 --> 00:01:56,140
我们现在不学习这点。

23
00:01:56,140 --> 00:02:00,390
其实非常简单，只是与我们现在讲的无关，且不太重要。

24
00:02:00,390 --> 00:02:06,890
关键是你可以通过参数来限制OneR生成的规则的

25
00:02:06,890 --> 00:02:09,250
复杂度。

26
00:02:09,250 --> 00:02:16,250
打开数字性的天气数据。

27
00:02:20,020 --> 00:02:26,330
找到OneR，选择它。

28
00:02:26,330 --> 00:02:31,720
这就是OneR。我们来创建一个规则。

29
00:02:31,720 --> 00:02:35,610
规则是根据展望（outlook）属性创建的，

30
00:02:35,610 --> 00:02:38,050
和上节课使用

31
00:02:38,050 --> 00:02:42,990
名词性的天气数据一样。

32
00:02:42,990 --> 00:02:49,990
我们来删除展望（outlook）属性，再来试一次。

33
00:02:51,700 --> 00:02:57,310
再次使用OneR分类。

34
00:03:02,840 --> 00:03:04,710
这次是以湿度（humidity）分叉。

35
00:03:04,880 --> 00:03:11,080
如果湿度小于82.5%，设为yes；如果大于82.5%，即为no，

36
00:03:11,080 --> 00:03:15,100
这样得到10/14的正确率。

37
00:03:15,100 --> 00:03:22,060
到目前为止，一切顺利。我们用的是OneR的默认设置，

38
00:03:22,060 --> 00:03:24,420
也就是限定规则复杂度的设置。

39
00:03:24,420 --> 00:03:30,240
我们可以点击OneR来设置分类器。

40
00:03:30,240 --> 00:03:36,880
可以看到一个名为minBucketSize的参数，

41
00:03:36,880 --> 00:03:39,570
默认值是6，

42
00:03:39,570 --> 00:03:41,460
很好的折中值。

43
00:03:41,460 --> 00:03:47,960
我们来把它改为1，看看结果如何。

44
00:03:48,570 --> 00:03:54,320
运行OneR，得到了不同的规则。

45
00:03:54,320 --> 00:03:58,740
这个规则用温度属性做了很多不同的分叉。

46
00:03:58,740 --> 00:04:05,740
这就是对数据集的过度拟合。

47
00:04:06,120 --> 00:04:11,260
它对于训练数据非常精确，但是却很难适用于独立的

48
00:04:11,260 --> 00:04:14,910
测试数据。

49
00:04:15,280 --> 00:04:18,729
我们来看一个更为真实的数据集。

50
00:04:18,729 --> 00:04:25,729
打开diabetes，这也是一个数字性数据集。

51
00:04:26,849 --> 00:04:32,910
数据集diabetes是数字性属性，包含tested_negative和tested_positive两个分类。

52
00:04:32,910 --> 00:04:37,860
先选择ZeroR计算数据集的基线数据，

53
00:04:37,860 --> 00:04:41,180
得到65%。

54
00:04:41,180 --> 00:04:44,430
应该能得到更好的准确率。

55
00:04:44,430 --> 00:04:47,090
选择OneR。

56
00:04:47,090 --> 00:04:52,020
OneR的默认值是6，它决定着规则的

57
00:04:52,020 --> 00:04:53,389
复杂度。

58
00:04:53,389 --> 00:04:56,150
我们得到71.5%的准确率。

59
00:04:56,150 --> 00:04:58,310
还不错。

60
00:04:58,310 --> 00:05:00,560
我们再做交叉验证，

61
00:05:00,560 --> 00:05:05,560
OneR的准确率远远高于基线准确率，71%比65%。

62
00:05:05,560 --> 00:05:10,020
我们来看规则，规则是基于 plas，

63
00:05:10,020 --> 00:05:11,729
血浆葡萄糖浓度的，

64
00:05:11,729 --> 00:05:16,620
根据血浆葡萄糖浓度所在的范围，

65
00:05:16,620 --> 00:05:19,400
我们可以判定是阴性（negative）或阳性（positive）。

66
00:05:19,400 --> 00:05:21,650
这看上去是个很合理的规则。

67
00:05:21,650 --> 00:05:25,770
现在，我们来改变OneR参数，使其过度拟合。

68
00:05:25,770 --> 00:05:31,280
我们来设置OneR，找到参数minBucketSize，改为1。

69
00:05:33,720 --> 00:05:41,440
再次运行，得到57%的准确率，比通过ZeroR得到的基线准确率

70
00:05:41,440 --> 00:05:41,750
65%低得多。

71
00:05:41,750 --> 00:05:45,850
我们来看规则，

72
00:05:45,850 --> 00:05:49,470
这是规则。

73
00:05:49,470 --> 00:05:53,229
OneR在测试另一个属性pedi，如果看

74
00:05:53,229 --> 00:05:58,630
ARFF文件，它指糖尿病家族史。

75
00:05:58,630 --> 00:06:02,039
可以看到这个属性有一系列不同的数值，

76
00:06:02,039 --> 00:06:04,660
看起来我们在用每一个值做分叉。

77
00:06:04,660 --> 00:06:10,069
当做交叉验证时，也就是我们现在所做的，表现不是太好。

78
00:06:10,930 --> 00:06:16,849
如果我们使用训练数据做评估，应该会得到很好的结果。

79
00:06:16,849 --> 00:06:23,849
是的，针对训练数据，我们得到87%的准确率，非常好的结果。

80
00:06:24,110 --> 00:06:29,110
当然，这完全是误导。规则过度拟合训练数据，

81
00:06:29,110 --> 00:06:33,160
就很难推广到独立的测试数据。

82
00:06:33,160 --> 00:06:36,340
这就是过度拟合的例子。

83
00:06:36,340 --> 00:06:39,819
过度拟合是所有机器学习方法都存在的问题。

84
00:06:39,819 --> 00:06:45,280
我们通过演示OneR的参数讲解了过度拟合，

85
00:06:45,280 --> 00:06:47,319
不过过度拟合存在于所有的机器学习方法中。

86
00:06:47,319 --> 00:06:51,190
这就是你不能使用测试数据评估的原因之一。

87
00:06:51,190 --> 00:06:54,380
过度拟合会出现在更普遍的情形中。

88
00:06:54,380 --> 00:06:59,229
假设你有一个数据集，你尝试了无数种机器学习方法，

89
00:06:59,229 --> 00:07:04,789
比如一百万种不同的方法，用交叉验证来选择对你的数据来说

90
00:07:04,789 --> 00:07:06,370
最好的方法。

91
00:07:06,370 --> 00:07:10,800
但是，不能因为你试了许多种机器学习方法，你就期望在新数据集上

92
00:07:10,800 --> 00:07:13,610
取得相同的效果。

93
00:07:13,610 --> 00:07:18,490
你尝试了那么多，最后选择的将会过度拟合

94
00:07:18,490 --> 00:07:20,669
你的数据。

95
00:07:20,669 --> 00:07:24,669
使用交叉验证，然后相信得到的结果是不够的。

96
00:07:24,669 --> 00:07:30,720
这种情况下，你可以把数据分为训练数据、测试数据和

97
00:07:30,720 --> 00:07:33,289
验证数据。

98
00:07:33,289 --> 00:07:36,120
使用训练和测试数据来选择方法。

99
00:07:36,120 --> 00:07:40,210
可以从成千上万种机器学习方法中选择最适合训练和

100
00:07:40,210 --> 00:07:44,180
测试数据的，或者用交叉验证选择最适合训练数据的。

101
00:07:44,180 --> 00:07:50,050
当你选好了机器学习方法，

102
00:07:50,050 --> 00:07:56,479
再使用验证数据来评估

103
00:07:56,479 --> 00:08:00,870
它针对独立的测试数据的真实效果，

104
00:08:00,870 --> 00:08:04,770
过度拟合是机器学习的一个大问题。

105
00:08:04,770 --> 00:08:10,560
你可以阅读4.1章来进一步了解OneR

106
00:08:10,560 --> 00:08:13,449
及其参数。

107
00:08:13,449 --> 00:08:17,620
请做这节课的相关练习。

108
00:08:17,620 --> 00:08:18,600
再见！

