From 35525fd08bd0e008979775ba926389120dc608b9 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Thu, 25 Jan 2018 22:37:25 +0800 Subject: [PATCH] ch15. --- 15.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/15.md b/15.md index e0c6e33..f02eedd 100644 --- a/15.md +++ b/15.md @@ -162,3 +162,78 @@ ckd.scatter('White Blood Cell Count', 'Glucose', colors='Color') 最近邻分类器有一个简单的推广,修正了这个异常。它被称为 K 最近邻分类器。为了预测爱丽丝的诊断,我们不仅仅查看靠近她的一个邻居,而是查看靠近她的三个点,并用这三个点中的每一个点的诊断来预测艾丽丝的诊断。特别是,我们将使用这 3 个诊断中的大部分值作为我们对 Alice 诊断的预测。当然,数字 3 没有什么特别之处:我们可以使用 4 或 5 或更多。 (选择一个奇数通常是很方便的,所以我们不需要处理相等)。一般来说,我们选择一个数字`k`,而我们对 Alice 的预测诊断是基于训练集中最接近爱丽丝的`k`个点。直观来说,这些是血液测试结果与爱丽丝最相似的`k`个患者,因此使用他们的诊断来预测爱丽丝的诊断似乎是合理的。 +## 训练和测试 + +我们最近的邻居分类器有多好?要回答这个问题,我们需要知道我们的分类有多正确。如果患者患有慢性肾脏疾病,那么我们的分类器有多可能将其选出来呢? + +如果病人在我们的训练集中,我们可以立即找到。我们已经知道病人位于什么类别,所以我们可以比较我们的预测和病人的真实类别。 + +但是分类器的重点在于对未在训练集中的新患者进行预测。我们不知道这些病人位于什么类别,但我们可以根据分类器做出预测。如何知道预测是否正确? + +一种方法是等待患者之后的医学检查,然后检查我们的预测是否与检查结果一致。用这种方法,当我们可以说我们的预测有多准确的时候,它就不再能用于帮助病人了。 + +相反,我们将在一些真实类别已知的病人上尝试我们的分类器。然后,我们将计算分类器正确的时间比例。这个比例将作为我们分类器准确预测的所有新患者的比例的估计值。这就是所谓的测试。 + +## 过于乐观的“测试” + +训练集提供了一组非常吸引人的患者,我们在它们上测试我们的分类器,因为我们可以知道训练集中每个患者的分类。 + +但是,我们要小心,如果我们走这条道路,前面就会有隐患。一个例子会告诉我们为什么。 + +假设我们使用 1 邻近分类器,根据血糖和白细胞计数来预测患者是否患有慢性肾病。 + +```py +ckd.scatter('White Blood Cell Count', 'Glucose', colors='Color') +``` + +之前,我们说我们预计得到一些分类错误,因为在左下方有一些蓝色和金色的点。 + +但是训练集中的点,也就是已经在散点图上的点呢?我们会把它们误分类吗? + +答案是否。请记住,1 最近邻分类寻找训练集中离被分类点最近的点。那么,如果被分类的点已经在训练集中,那么它在训练集中的最近邻就是它自己!因此它将被划分为自己的颜色,这将是正确的,因为训练集中的每个点都已经被正确着色。 + +换句话说,如果我们使用我们的训练集来“测试”我们的 1 邻近分类器,分类器将以 100% 的几率内通过测试。 + +任务完成。多好的分类器! + +不,不是。正如我们前面提到的,左下角的一个新点很容易被误分类。 “100% 准确”是一个很好的梦想,而它持续。 + +这个例子的教训是不要使用训练集来测试基于它的分类器。 + +### 生成测试集 + +在前面的章节中,我们看到可以使用随机抽样来估计符合一定标准的总体中的个体比例。不幸的是,我们刚刚看到训练集不像所有患者总体中的随机样本,在一个重要的方面:我们的分类器正确猜测训练集中的个体,比例高于总体中的个体。 + +当我们计算数值参数的置信区间时,我们希望从一个总体中得到许多新的随机样本,但是我们只能访问一个样本。我们通过从我们的样本中自举重采样来解决这个问题。 + +我们将使用一个类似的想法来测试我们的分类器。我们将从原始训练集中创建两个样本,将其中一个样本作为我们的训练集,另一个用于测试。 + +所以我们将有三组个体: + ++ 训练集,我们可以对它进行任何大量的探索来建立我们的分类器 ++ 一个单独的测试集,在它上面测试我们的分类器,看看分类的正确比例是多少 ++ 个体的底层总体,我们不了解它;我们的希望是我们的分类器对于这些个体也会成功,就像我们的测试集一样。 + +如何生成训练和测试集?你猜对了 - 我们会随机选择。 + +`ckd`有 158 个个体。让我们将它们随机的一半用于训练,另一半用于测试。为此,我们将打乱所有行,把前 79 个作为训练集,其余的 79 个用于测试。 + +```py +shuffled_ckd = ckd.sample(with_replacement=False) +training = shuffled_ckd.take(np.arange(79)) +testing = shuffled_ckd.take(np.arange(79, 158)) +``` + +现在让我们基于训练样本中的点构造我们的分类器: + +```py +training.scatter('White Blood Cell Count', 'Glucose', colors='Color') +plt.xlim(-2, 6) +plt.ylim(-2, 6); +``` + +我们得到以下分类区域和决策边界: + +把测试数据放在这个图上,你可以立刻看到分类器对于几乎所有的点都正确,但也有一些错误。 例如,测试集的一些蓝点落在分类器的金色区域。 + +尽管存在一些错误,但分类器看起来在测试集上表现得相当好。 假设原始样本是从底层总体中随机抽取的,我们希望分类器在整个总体上具有相似的准确性,因为测试集是从原始样本中随机选取的。 -- GitLab