10

我有 7 个需要分类的类,我有 10 个特征。在这种情况下,我是否需要使用 k 的最佳值,或者我是否必须针对 1 到 10(大约 10)之间的 k 值运行 KNN 并在算法本身的帮助下确定最佳值?

4

5 回答 5

16

除了我在评论中发布的文章之外,还有这篇文章表明:

k 的选择非常关键——k 值较小意味着噪声对结果的影响较大。较大的值使其计算成本很高,并且有点违背 KNN 背后的基本理念(靠近的点可能具有相似的密度或类别)。选择 k 的简单方法设置为 k = n^(1/2)。

这在很大程度上取决于您的个人情况,有时最好遍历 k 的每个可能值并自己决定。

于 2012-07-19T21:03:35.580 回答
11

在 k-NN 算法中要注意的重要一点是,特征的数量和的数量都不会影响k-NN 算法中 k 的值。k-NN算法是一种ad-hoc分类器,用于根据距离度量对测试数据进行分类,即如果与其他类相比,靠近测试样本的Class-1训练样本数量更多,则将测试样本分类为Class-1训练样本。例如:如果 k = 5 个样本的值,则根据距离度量选择 5 个最接近的训练样本,然后对每个类的大多数样本进行投票。因此,如果 3 个样本属于 1 类,2 个样本属于 5 类,则该测试样本被归类为 1 类。所以k的值表示对测试样本进行分类所需的训练样本数。

谈到您的问题,k的值是非参数的,选择 k 值的一般经验法则k = sqrt(N)/2,其中N代表训练数据集中的样本数。我建议的另一个技巧是尽量保持 k 的值奇数,这样在选择类之间就没有联系,但这表明训练数据在类之间高度相关,并且使用简单的分类算法,例如 k- NN 会导致较差的分类性能。

于 2016-08-16T02:51:47.830 回答
5

在 KNN 中,找到 k 的值并不容易。k 值较小意味着噪声对结果的影响较大,而较大的值使其计算量大。

数据科学家通常选择:

1.如果班级数为2,则为奇数

2.另一种选择k的简单方法是设置k = sqrt(n)。其中 n = 训练数据中的数据点数。

希望这会帮助你。

于 2019-03-30T03:26:40.333 回答
3

您可能想尝试将其作为一种遍历不同 k 值并将其可视化以帮助您做出决策的方法。我已经使用了很多次,它给了我想要的结果:

error_rate = []

for i in range(1,50):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train, y_train)
    pred = knn.predict(X_test)
    error_rate.append(np.mean(pred != y_test))

plt.figure(figsize=(15,10))
plt.plot(range(1,50),error_rate, marker='o', markersize=9)
于 2020-06-27T23:21:53.140 回答
1

没有预定义的统计方法可以找到最有利的 K 值。选择非常小的 K 值会导致决策边界不稳定。K 的值可以选择为 k = sqrt(n)。其中 n = 训练数据中的数据点数 奇数优先作为 K 值。

大多数情况下,工业中遵循以下方法。初始化一个随机的 K 值并开始计算。得出错误率和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最小错误率。得出精度和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最大精度。尝试在误差曲线和准确度曲线之间找到 K 的折衷值。

于 2021-07-01T09:58:16.733 回答