大家好！欢迎回来！上节课，我们学习了线性回归，
（用于预测数值类而不是名词类的问题）。
回归的问题。
这节课，我们将要学习如何利用回归技术进行分类。
这听起来有点奇怪，但是在某些情况下回归技术是非常有效的。
我们要看看我们是否可以把回归技术应用到普通的分类问题。
对于二类问题，这十分简单。
我们用0和1代表两个分类，把它们用作数字，然后
得到一条回归线，假设大多数0类实例会有一个非常低的值，
大多数1类实例会有一个较大的值，然后找到一个阈值，
如果小于阈值，预测为0类，如果大于阈值，
预测为1类。
如果我们想要推广到两个以上的类别，我们可对每个类别
用单独的回归模型。
我们把属于这个类别的实例输出设定为1，不属于这个类别的设定为0。
然后找到每一个类别的回归线，对于未知测试
实例，选择输出值最大的类别。
这样，一个包含n个类别的问题就会产生n个回归模型。
我们也可以使用成对回归：用类别组对（共有n的二次方除以2对）
为每一对类别建立线性回归线来
把这一对中的一个类别的实例和另一类别区分开。
我们以二类问题为例，利用学习回归技术
在二类问题上的应用。
载入diabetes.arff。
然后我要转换类别。
实际上，让我们在这试一下应用回归分类器。
尝试LinearRegression。
你看，这里是灰色的。
这意味着它是不可用的。
我可以选择它，但是我不能运行它。
不可用的原因是线性回归只能应用于数字类的数据集，
我们载入的是一个名词类的数据集。
我们需要解决这个问题。
把这两个分类标签分别换成0和1。
我们将利用过滤器完成这件事。
我们想改变一个属性。
这是无监督的。
我们想把名词性属性变成二元属性，所以用NominalToBinary filter。
我们想应用在第9个属性上。
默认设置是应用于所有的属性，但是我们只想应用到第9个属性。
希望这可以把属性从名词性转为二元的。
不幸的是，没有成功。
这没有起作用，失效的原因是
这些属性过滤器不能作用于类的值。
我可以改变类值，把数据集变成“无分类的”，之后
它就不再是数据集的类值了。
再次运行过滤器。
现在我已经得到了我想的："分类"的值是0或者1。
事实上，这是一个柱状图（这些是属性值为0的实例数和属性值为1的实例数），
这对应于原始数据集中两种不同的类别。
现在，我们找到LinearRegression，运行它。
这是回归线。
这个回归模型是，0.02乘以pregnancy属性加上这个乘以plas属性，
等等，加上这个乘以age属性，加上这个数。
对于每一个实例，这个模型输出一个数字。
如果我们选择Output predictions，再次运行，我们可以看到输出的数字。
这里是数据集的每一个实例的预测表格。
这是实例的序号；这是实例的实际类别，0或者1；
这是预测的类别，也是一个数字——有的时候会小于0。
我们希望类别0的数字通常比较小，
类别1的数字一般比较大。
可以说是这样的，虽然它们看起来不明显。
第四列是误差值。
我还要做进一步的研究，你可能会问为什么
这么做呢？首先，我想探索的是一个有趣的想法。
它会导致回归分类有相当不错的表现，它将
引入下一课的主题：Logistic回归，那是一个很好的分类技术。
也许最重要的是，我们将学习如何使用Weka界面做一些很酷的事情。
我的策略是添加一个新的属性称为classification，把预测的
值赋给它，然后我们用OneR优化两种类别分割点。
我们要把类别值恢复回原来的名词性值，因为，记得，
我们刚刚将它转换成数值的了。
这是它的细节。
使用监督属性过滤器AddClassification。
我认为这真的很酷。
添加一个新的属性称为“classification”。
选择一个分类器LinearRegression。
我们需要把outputClassification设为True。
如果我们运行这个，它会给数据集添加一个新的属性。
这个属性叫做“classification”，它存有这些
通过线性回归方法得到的数字。
现在，我们已经得到了"classification"属性，现在要做的是
把类属性从数值转化回名词。
现在，用ZeroR，它只对名词性类有效。
转化数据类型。
我要用NumericToNominal。
在编号9的属性上运行。
应用它，现在，确信，我们得到了0和1两种标签。
这是一个有两个标签的名词性属性。
我一定要它把设为类属性。
然后，我们得到了彩色的背景——2种颜色对应2个类别。
我事实上想用“classification”的数值预测”class“的值。
删除所有其他的属性。
切换到这里的分类面板。
预测class（这个名词性class），我将使用OneR。
我想停止输出的预测数据，因为它们有点碍事；运行。
准确率是72-73%，有点让人失望。
但是，实际上，当你看这个模型，OneR创建了这个过度拟合的规则。
我们想要一个单一的分割点。
如果数值小于分割点，预测值为0，否则，预测值为1。
我们可以通过改变第二个参数防止过度拟合，将minbucketsize参数，
改为更大的数值。
把它改成100，再次运行。
现在，我得到了好得多的结果，77%的准确率，这是我们得到的划分点：
如果“classification”的值（也是回归的值）小于1.47
我们把它归为类别0；否则，把它归为类别1。
所以，我得到了我想要的，回归分类。
我们已经把线性回归的应用扩展到分类。
这里，76.8%准确率的表现实际上非常好。
这对两个类别（0和1）的分类非常简单；不然，你需要为每一个分类
（多重线性回归）或者为每一对类别
（成对线性回归）建立回归模型。
我们学到了不少关于Weka的知识。
我们学习了用无监督属性过滤器将名词属性变为二元数值，
将数值属性变回名词性属性。
我们学习了一个很酷的过滤器AddClassification，它可以
把机器学习算法的分类结果作为一个属性添加到数据集。
我们了解了设定和取消数据集的类，我们学到了
如何利用参数minbucketsize防止OneR过度拟合。
这就是回归分类。
下节课，我们将做得更好。
我们将了解logistic回归，一种更加有效地
进行回归分类的技术。
下次见。
再见！