﻿1
00:00:17,210 --> 00:00:25,940
大家好！欢迎回来！上节课，我们学习了线性回归，

2
00:00:25,949 --> 00:00:30,500
（用于预测数值类而不是名词类的问题）。

3
00:00:30,500 --> 00:00:31,710
回归的问题。

4
00:00:31,710 --> 00:00:37,370
这节课，我们将要学习如何利用回归技术进行分类。

5
00:00:37,370 --> 00:00:42,589
这听起来有点奇怪，但是在某些情况下回归技术是非常有效的。

6
00:00:42,589 --> 00:00:47,399
我们要看看我们是否可以把回归技术应用到普通的分类问题。

7
00:00:47,399 --> 00:00:50,670
对于二类问题，这十分简单。

8
00:00:50,670 --> 00:00:57,039
我们用0和1代表两个分类，把它们用作数字，然后

9
00:00:57,039 --> 00:01:06,460
得到一条回归线，假设大多数0类实例会有一个非常低的值，

10
00:01:06,460 --> 00:01:11,390
大多数1类实例会有一个较大的值，然后找到一个阈值，

11
00:01:11,390 --> 00:01:15,909
如果小于阈值，预测为0类，如果大于阈值，

12
00:01:15,909 --> 00:01:18,600
预测为1类。

13
00:01:18,600 --> 00:01:23,820
如果我们想要推广到两个以上的类别，我们可对每个类别

14
00:01:23,820 --> 00:01:25,350
用单独的回归模型。

15
00:01:25,350 --> 00:01:31,270
我们把属于这个类别的实例输出设定为1，不属于这个类别的设定为0。

16
00:01:31,270 --> 00:01:36,250
然后找到每一个类别的回归线，对于未知测试

17
00:01:36,250 --> 00:01:40,229
实例，选择输出值最大的类别。

18
00:01:41,400 --> 00:01:48,990
这样，一个包含n个类别的问题就会产生n个回归模型。

19
00:01:48,990 --> 00:01:53,990
我们也可以使用成对回归：用类别组对（共有n的二次方除以2对）

20
00:01:53,990 --> 00:02:00,500
为每一对类别建立线性回归线来

21
00:02:00,500 --> 00:02:05,770
把这一对中的一个类别的实例和另一类别区分开。

22
00:02:05,770 --> 00:02:11,070
我们以二类问题为例，利用学习回归技术

23
00:02:11,070 --> 00:02:12,549
在二类问题上的应用。

24
00:02:12,549 --> 00:02:19,549
载入diabetes.arff。

25
00:02:19,540 --> 00:02:21,680
然后我要转换类别。

26
00:02:21,680 --> 00:02:25,820
实际上，让我们在这试一下应用回归分类器。

27
00:02:25,820 --> 00:02:28,950
尝试LinearRegression。

28
00:02:28,950 --> 00:02:30,570
你看，这里是灰色的。

29
00:02:30,570 --> 00:02:32,290
这意味着它是不可用的。

30
00:02:32,290 --> 00:02:37,800
我可以选择它，但是我不能运行它。

31
00:02:37,800 --> 00:02:43,580
不可用的原因是线性回归只能应用于数字类的数据集，

32
00:02:43,580 --> 00:02:48,320
我们载入的是一个名词类的数据集。

33
00:02:48,320 --> 00:02:49,300
我们需要解决这个问题。

34
00:02:49,300 --> 00:02:55,670
把这两个分类标签分别换成0和1。

35
00:02:55,670 --> 00:02:58,320
我们将利用过滤器完成这件事。

36
00:02:58,320 --> 00:03:00,200
我们想改变一个属性。

37
00:03:00,200 --> 00:03:04,140
这是无监督的。

38
00:03:04,140 --> 00:03:10,460
我们想把名词性属性变成二元属性，所以用NominalToBinary filter。

39
00:03:10,460 --> 00:03:12,460
我们想应用在第9个属性上。

40
00:03:12,460 --> 00:03:18,640
默认设置是应用于所有的属性，但是我们只想应用到第9个属性。

41
00:03:18,640 --> 00:03:22,680
希望这可以把属性从名词性转为二元的。

42
00:03:22,680 --> 00:03:24,110
不幸的是，没有成功。

43
00:03:24,110 --> 00:03:29,670
这没有起作用，失效的原因是

44
00:03:29,670 --> 00:03:34,450
这些属性过滤器不能作用于类的值。

45
00:03:34,450 --> 00:03:41,420
我可以改变类值，把数据集变成“无分类的”，之后

46
00:03:41,420 --> 00:03:43,620
它就不再是数据集的类值了。

47
00:03:43,620 --> 00:03:46,210
再次运行过滤器。

48
00:03:46,210 --> 00:03:51,490
现在我已经得到了我想的："分类"的值是0或者1。

49
00:03:51,490 --> 00:03:56,490
事实上，这是一个柱状图（这些是属性值为0的实例数和属性值为1的实例数），

50
00:03:56,490 --> 00:03:59,800
这对应于原始数据集中两种不同的类别。

51
00:04:01,230 --> 00:04:09,860
现在，我们找到LinearRegression，运行它。

52
00:04:09,860 --> 00:04:11,240
这是回归线。

53
00:04:11,240 --> 00:04:19,050
这个回归模型是，0.02乘以pregnancy属性加上这个乘以plas属性，

54
00:04:19,050 --> 00:04:22,110
等等，加上这个乘以age属性，加上这个数。

55
00:04:22,110 --> 00:04:26,390
对于每一个实例，这个模型输出一个数字。

56
00:04:26,390 --> 00:04:32,610
如果我们选择Output predictions，再次运行，我们可以看到输出的数字。

57
00:04:33,790 --> 00:04:39,300
这里是数据集的每一个实例的预测表格。

58
00:04:39,300 --> 00:04:46,070
这是实例的序号；这是实例的实际类别，0或者1；

59
00:04:46,070 --> 00:04:49,770
这是预测的类别，也是一个数字——有的时候会小于0。

60
00:04:49,770 --> 00:04:55,690
我们希望类别0的数字通常比较小，

61
00:04:55,690 --> 00:04:56,570
类别1的数字一般比较大。

62
00:04:56,570 --> 00:05:00,730
可以说是这样的，虽然它们看起来不明显。

63
00:05:00,730 --> 00:05:07,730
第四列是误差值。

64
00:05:09,500 --> 00:05:13,580
我还要做进一步的研究，你可能会问为什么

65
00:05:13,580 --> 00:05:17,440
这么做呢？首先，我想探索的是一个有趣的想法。

66
00:05:17,440 --> 00:05:21,540
它会导致回归分类有相当不错的表现，它将

67
00:05:21,540 --> 00:05:28,200
引入下一课的主题：Logistic回归，那是一个很好的分类技术。

68
00:05:28,200 --> 00:05:33,600
也许最重要的是，我们将学习如何使用Weka界面做一些很酷的事情。

69
00:05:33,600 --> 00:05:39,670
我的策略是添加一个新的属性称为classification，把预测的

70
00:05:39,670 --> 00:05:46,710
值赋给它，然后我们用OneR优化两种类别分割点。

71
00:05:46,710 --> 00:05:51,170
我们要把类别值恢复回原来的名词性值，因为，记得，

72
00:05:51,170 --> 00:05:54,920
我们刚刚将它转换成数值的了。

73
00:05:54,920 --> 00:05:56,350
这是它的细节。

74
00:05:56,350 --> 00:06:01,800
使用监督属性过滤器AddClassification。

75
00:06:01,800 --> 00:06:07,480
我认为这真的很酷。

76
00:06:07,480 --> 00:06:12,250
添加一个新的属性称为“classification”。

77
00:06:12,250 --> 00:06:20,390
选择一个分类器LinearRegression。

78
00:06:20,390 --> 00:06:24,700
我们需要把outputClassification设为True。

79
00:06:24,700 --> 00:06:28,730
如果我们运行这个，它会给数据集添加一个新的属性。

80
00:06:28,730 --> 00:06:34,540
这个属性叫做“classification”，它存有这些

81
00:06:34,540 --> 00:06:41,540
通过线性回归方法得到的数字。

82
00:06:43,390 --> 00:06:49,200
现在，我们已经得到了"classification"属性，现在要做的是

83
00:06:49,200 --> 00:06:52,320
把类属性从数值转化回名词。

84
00:06:52,320 --> 00:06:57,300
现在，用ZeroR，它只对名词性类有效。

85
00:06:57,300 --> 00:07:04,300
转化数据类型。

86
00:07:04,830 --> 00:07:11,830
我要用NumericToNominal。

87
00:07:12,050 --> 00:07:18,270
在编号9的属性上运行。

88
00:07:18,270 --> 00:07:27,040
应用它，现在，确信，我们得到了0和1两种标签。

89
00:07:27,040 --> 00:07:30,390
这是一个有两个标签的名词性属性。

90
00:07:30,390 --> 00:07:35,440
我一定要它把设为类属性。

91
00:07:38,150 --> 00:07:44,410
然后，我们得到了彩色的背景——2种颜色对应2个类别。

92
00:07:44,410 --> 00:07:49,290
我事实上想用“classification”的数值预测”class“的值。

93
00:07:49,290 --> 00:07:53,820
删除所有其他的属性。

94
00:07:56,570 --> 00:08:00,820
切换到这里的分类面板。

95
00:08:01,200 --> 00:08:15,220
预测class（这个名词性class），我将使用OneR。

96
00:08:21,290 --> 00:08:31,100
我想停止输出的预测数据，因为它们有点碍事；运行。

97
00:08:31,100 --> 00:08:33,300
准确率是72-73%，有点让人失望。

98
00:08:33,300 --> 00:08:38,360
但是，实际上，当你看这个模型，OneR创建了这个过度拟合的规则。

99
00:08:38,360 --> 00:08:40,270
我们想要一个单一的分割点。

100
00:08:40,270 --> 00:08:44,540
如果数值小于分割点，预测值为0，否则，预测值为1。

101
00:08:44,540 --> 00:08:52,330
我们可以通过改变第二个参数防止过度拟合，将minbucketsize参数，

102
00:08:52,330 --> 00:08:53,920
改为更大的数值。

103
00:08:53,920 --> 00:08:58,790
把它改成100，再次运行。

104
00:08:58,790 --> 00:09:05,250
现在，我得到了好得多的结果，77%的准确率，这是我们得到的划分点：

105
00:09:05,250 --> 00:09:10,180
如果“classification”的值（也是回归的值）小于1.47

106
00:09:10,180 --> 00:09:14,700
我们把它归为类别0；否则，把它归为类别1。

107
00:09:14,700 --> 00:09:17,630
所以，我得到了我想要的，回归分类。

108
00:09:17,630 --> 00:09:21,070
我们已经把线性回归的应用扩展到分类。

109
00:09:21,070 --> 00:09:27,260
这里，76.8%准确率的表现实际上非常好。

110
00:09:27,260 --> 00:09:33,460
这对两个类别（0和1）的分类非常简单；不然，你需要为每一个分类

111
00:09:33,460 --> 00:09:39,280
（多重线性回归）或者为每一对类别

112
00:09:39,280 --> 00:09:41,390
（成对线性回归）建立回归模型。

113
00:09:41,390 --> 00:09:43,020
我们学到了不少关于Weka的知识。

114
00:09:43,020 --> 00:09:48,100
我们学习了用无监督属性过滤器将名词属性变为二元数值，

115
00:09:48,100 --> 00:09:50,490
将数值属性变回名词性属性。

116
00:09:50,490 --> 00:09:55,100
我们学习了一个很酷的过滤器AddClassification，它可以

117
00:09:55,100 --> 00:09:59,210
把机器学习算法的分类结果作为一个属性添加到数据集。

118
00:09:59,210 --> 00:10:03,140
我们了解了设定和取消数据集的类，我们学到了

119
00:10:03,140 --> 00:10:08,290
如何利用参数minbucketsize防止OneR过度拟合。

120
00:10:08,290 --> 00:10:09,950
这就是回归分类。

121
00:10:09,950 --> 00:10:12,330
下节课，我们将做得更好。

122
00:10:12,330 --> 00:10:18,380
我们将了解logistic回归，一种更加有效地

123
00:10:18,380 --> 00:10:22,330
进行回归分类的技术。

124
00:10:22,330 --> 00:10:23,390
下次见。

125
00:10:23,390 --> 00:10:24,890
再见！
