大家好！这节课，我想给大家介绍
评估机器学习算法性能的标准方法，交叉验证。
前几节课，我们学习了如何用一个独立的测试数据集进行评估，并且了解了
如何用训练数据进行评估（不要这么做）。
我们还学习了采用预留的方法，拿出数据集的
一小部分作为测试数据，其他剩余的部分作为训练数据。
Weka的分类面板提供的第四个选项叫做交叉验证，
这就是我们这节课要介绍的内容。
交叉验证改良了多次预留法。
我们曾经用不同的随机种子来运行预留法。
这叫做重复预留法。
交叉验证系统性地重复运行预留法。它通过
减少预测误差来提高预留法的性能。
我们载入训练数据并且创建一个分类器。
然后，我们试着评估这个分类器的性能，
这个评估会有一定的误差，因为这是建立在统计之上的。
我们想要尽量减少评估的误差。
交叉验证是一种减少误差的方法，一种叫做分层交叉验证， 交叉验证的变体，
进一步减少了误差。
本课，我会给大家解释这些方法。
在前面的课程中，我们拿出10%作为测试数据，并且重复10次。
这是一种重复预留法。
我们载入一个数据集，重复10次将它分割成训练数据集
和测试数据集。
在交叉验证中，我们只分割一次，但是我们分成10份。
然后，我们用其中的9份作为训练数据，
剩余的一份作为测试数据。
接着，还是用之前分割好的数据，我们用另外一组9份作为训练数据，
剩余的一份作为测试数据。
我们这样重复10次，每次都是用分割出的不同的数据作为测试数据。
换句话说，我们把数据集分为10份，然后用每份
轮流作为测试数据，剩余的作为训练数据，平均十次的结果。
这就是10层交叉验证。
把原始的数据随机分成10份（这些叫做分层），依次预留其中1份，
然后平均多次的结果。
所以，数据集中的每个数据都会用来作测试一次，训练九次。
这就是10层交叉验证。
分层交叉验证是一种简单的变体，当我们把原始数据分为
10部分时，我们确保每一份的类值的比例
大致是相同的。
当然，有很多不同的方法将数据集分为10份。
我们想选择一种能确保每一部分数据都具有分类
代表性的分割方式。
这就是分层交叉验证。
它可以进一步降低评估误差。
在我们做完交叉验证之后，Weka要对整个数据
再运行一次。
然后产生一个分类器，这就是我们实际使用的分类器。
我们采用10层交叉验证是为了得到评估结果和它的误差，
然后最终地，我们再次分类来得到一个
可以实际应用的分类器。
这就是我想说明的。
交叉验证比简单的重复预留法精确。我们下节课会介绍这一点。
分层交叉验证更加精确。
Weka的默认值是分层交叉验证。
使用10层交叉验证，Weka需要进行11次算法运算，前十次用每一份数据，
最后一次用整个数据集。
最实用的原则是，如果你有足够多的数据，你可以用百分比
分割数据集并只评估一次。
否则，如果你没有那么多数据，你需要使用分层交叉验证。
多少数据算多呢？这是一个每个人想知道的问题。
你知道一个字符串有多长吗？这很难说，但是（我们知道）它取决于一些方面。
它取决于数据集包含类的个数。
如果是一个只有两个类的数据集，那么，你有，例如100-1000条数据，
应该足够得到一个可靠的评估结果了。
你可按照90%和10%将数据集分为训练和测试数据。
对于二类的分类问题，如你有10,000条数据，我想这已足够
多，你不需要使用交叉验证。
如果，另一方面，数据有100个不同分类，这就不一样了，是吧？
你将需要一个大得多的数据集，因为你希望每一个分类都能够
被充分地评估。
这个问题很难给出确切的答案，因为它视具体情况而定。
如果你收集到了成千上万的数据，你也许只需要
用预留法做一次。
如果你只有少于1000的数据，即使是二类问题，你可能还是需要
运行10层交叉验证。
10层交叉验证需要更多运行时间。
它需要10倍的时间，但是，一般每一次运行的时间非常短。
你可以阅读课本的第五章第三节关于交叉验证的内容。
现在请大家完成本课的课后练习。
再见！