我正试图为K找到最佳的KNeighborsClassifier值。
这是我的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())

我在每个循环中都使用了SigixVall分数,并绘制了它。
plt.style.use('fivethirtyeight')
plt.plot(k_loop, k_scores)
plt.show()

这就是结果。
python - KNeighborsClassifier中k的值-LMLPHP
k介于1420之间时,可以看到精度更高。
1)如何选择K的最佳值。
2)是否有其他方法可以计算并找到K的最佳值?
3)如有其他改进建议,敬请谅解。我是新来的ML

最佳答案

让我们首先定义什么是K
K是该算法咨询的选民的数量,以决定它属于哪个给定的数据点的类。
换句话说,它使用K来划分每个类的边界。这些边界将把每个类与另一个类分隔开来。
因此,随着K值的增加,边界变得更平滑。
所以从逻辑上讲,如果我们将K增加到无穷大,它最终将成为任何一个类的所有点,这取决于总的多数!然而,这会导致所谓的高偏差(即不合适)。
相反,如果我们使K等于1,那么训练样本的误差总是为零。这是因为最接近任何训练数据点的是它本身。然而,我们最终会过度拟合边界(即高方差),所以它不能推广任何新的和看不见的数据!是的。
不幸的是,没有经验法则。K的选择在某种程度上取决于最终应用程序和数据集。
建议的解决方案
使用GridSearchCV对估计量的指定参数值执行穷举搜索。所以我们用它来寻找K的最佳值。
对我来说,当我想要设置K的最大阈值时,我不会超过max类中每个类中元素的数量,而且到目前为止它还没有让我失望(请参阅后面的示例以了解我所说的内容)
例子:

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的更新
简单地说,这是一个重复的次数,为什么?因为它可以降低偏见,并在统计方面给你一个更好的估计。
也就是KFold,它试图确保每个类在每个测试折叠中近似相等地表示(即每个折叠代表数据的所有层)。

08-25 09:03