KNeighborsClassifier 中 k 的值

value of k in KNeighborsClassifier

我正在努力寻找 KNeighborsClassifier 的最佳 K 值。

这是我的 iris 数据集代码:

k_loop = np.arange(1,30)
k_scores = []
for k in k_loop:
    knn = KNeighborsClassifier(n_neighbors=k)
    cross_val = cross_val_score(knn, X, y, cv=10 , scoring='accuracy')
    k_scores.append(cross_val.mean())

我在每个循环中取了 cross_val_score 的平均值并绘制了它。

plt.style.use('fivethirtyeight')
plt.plot(k_loop, k_scores)
plt.show()

这是结果。

您可以看到 k1420 之间时准确率更高。

1) 如何选择最佳的k值。

2) 是否有任何其他方法可以计算和找到 K 的最佳值?

3) 也欢迎任何其他改进建议。我是 ML

的新手

我们先来定义什么是K?

K 投票者 的数量,算法参考这些投票者做出关于 的决定class 它属于.

的给定数据点

换句话说,它使用K来划分每个class的边界。这些边界将 class 彼此隔离。

相应地,随着 K 值的增加,边界变得更平滑。

所以按道理来说,如果我们把K增加到infinity,最后会变成任意[=的所有点110=] 取决于 总多数 !。然而,这会导致所谓的 High Bias(即欠拟合)。

相比之下,如果我们让 K 只等于 1,那么对于 训练样本。这是因为最接近任何训练数据点的点是它本身。然而,我们最终会 过度拟合 边界(即高方差),因此它 无法概括 任何新的和看不见的数据!

不幸的是,没有经验法则。 K 的选择在某种程度上是由最终应用程序和数据集驱动的。


建议的解决方案

使用 GridSearchCV 对估算器的指定参数值执行 详尽搜索。 因此我们使用它来尝试找到 K 的最佳值。

对我来说,当我想设置 K 的最大阈值时,每个 class 中的元素数量不会超过最大 class,并且到目前为止它并没有让我失望(稍后查看示例以了解我在说什么

示例:

import numpy as np
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold
from sklearn.neighbors import KNeighborsClassifier

iris = datasets.load_iris()
X, y = iris.data, iris.target
# get the max class with respect to the number of elements
max_class = np.max(np.bincount(y))
# you can add other parameters after doing your homework research
# for example, you can add 'algorithm' : ['auto', 'ball_tree', 'kd_tree', 'brute']
grid_param = {'n_neighbors': range(1, max_class)}
model = KNeighborsClassifier()
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=2)
clf = GridSearchCV(model, grid_param, cv=cv, scoring='accuracy')
clf.fit(X, y)
print("Best Estimator: \n{}\n".format(clf.best_estimator_))
print("Best Parameters: \n{}\n".format(clf.best_params_))
print("Best Score: \n{}\n".format(clf.best_score_))

结果

Best Estimator: 
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=17, p=2,
           weights='uniform')

Best Parameters: 
{'n_neighbors': 17}

Best Score: 
0.98

关于RepeatedStratifiedKFold

的更新

简单来说,就是重复超过n_repeats次的KFold为什么?因为它可以降低偏差并在统计方面为您提供更好的估计。

它也是 Stratified 它试图确保每个 class 在每个测试折叠中 大约 平等代表(即 每个折叠代表数据的所有)。

根据图表,我会说 13。

我假设这是一个 class化工作。
在那种情况下:不要 将 k 设置为偶数。

例如如果你有2个class A和B,并且k设置为4.
有可能新数据(或点)
介于 2 class A 和 2 class B.
之间 因此,您将有 2 次投票 class 将新数据点确认为 A
和 2 投票 class 确定为 B.
设置k为奇数可以避免这种情况。