gpt4 book ai didi

python - KNeighborsClassifier 中 k 的值

转载 作者:太空狗 更新时间:2023-10-30 02:36:45 25 4
gpt4 key购买 nike

我正在尝试为 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()

这是结果。

Line Plot

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

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

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

3) 任何其他改进建议也将受到赞赏。我是 ML

的新手

最佳答案

我们先来定义什么是K

K投票者 的数量,算法引用该数量来决定给定数据将它指向哪个类别属于

换句话说,它使用K 来划分每个类的边界。这些边界将把每个类别与其他类别分开。

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

所以从逻辑上讲,如果我们将 K 增加到 infinity,它最终将成为任何类的所有点,具体取决于 多数!但是,这会导致所谓的高偏差(即欠拟合)。

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

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


建议的解决方案

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

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

示例:

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 重复 n_repeats 次,为什么?因为它可以降低偏差并在统计方面为您提供更好的估计。

它也是分层,旨在确保每个类在每个测试折叠中大约均等地表示(即每个折叠代表所有数据层)。

关于python - KNeighborsClassifier 中 k 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com