据我了解,k-NN 是一种惰性学习算法,不需要训练阶段。那么为什么我们需要使用.fit()
sklearn 以及使用它时会发生什么?
为什么我们需要拟合 k 最近邻分类器?
机器算法验证
分类
scikit-学习
k-最近邻
2022-02-08 17:05:50
3个回答
在概念层面
拟合分类器意味着将数据集作为输入,然后输出一个分类器,该分类器是从可能的分类器空间中选择的。在许多情况下,分类器是通过一组参数来识别的——也就是说,与其他可能的分类器区分开来。通常通过解决优化问题或其他一些数值程序来选择参数。但是,在 knn 的情况下,分类器由训练数据本身标识。因此,在抽象层面上,拟合 knn 分类器只需要存储训练集。
在执行层面
在新数据点上评估 knn 分类器需要在训练集中搜索其最近的邻居,当训练集很大时,这可能是一项昂贵的操作。正如 RUser 所提到的,有多种技巧可以加快搜索速度,通常通过基于训练集创建各种数据结构来工作。总体思路是,对新点进行分类所需的一些计算工作实际上是跨点通用的。因此,这项工作可以提前完成,然后重复使用,而不是为每个新实例重复。使用这些技巧的 knn 实现将在训练阶段完成这项工作。例如,scikit-learn 可以在调用fit()
函数期间构造 kd 树或球树。
选择和距离度量
邻居的数量和距离度量是 knn 分类器的超参数。通常可以通过选择它们来适应问题来提高性能。但是,最佳设置通常不会提前知道,我们必须在训练过程中搜索它们。这种搜索相当于解决优化问题,类似于其他方法的超参数调整。
虽然其他回答者提出的观点肯定是有效和有趣的,但我想从严格的软件工程角度再指出一件事:
使其与他们的 API 保持一致
sklearn 的估计器应该有一个fit
方法,该方法需要一个或两个类似数组的方法(取决于它是监督/无监督估计器)和一些特定于实现的细节(来源)。
因此,即使 knn 的fit
方法完全不做任何事情,它也可能仍然存在,因为 knn 是一个估算器,而 sklearn 的开发人员以及他们贡献的代码都希望估算器有一个fit
方法。
其它你可能感兴趣的问题