如何根据最高精度在sklearn的KNeighborsClassifier中选择K

Posted

技术标签:

【中文标题】如何根据最高精度在sklearn的KNeighborsClassifier中选择K【英文标题】:How to select K in sklearn's KNeighborsClassifier based on the highest accuracy 【发布时间】:2019-12-12 07:20:15 【问题描述】:

我在分类项目中使用 KNN

我正在尝试找到精度最高的 K 位,它只是给了我最高的 K 我正在使用更多的自动化过程而不是使用肘部方法。

k=6
acc_array=np.zeros(k)
for n in range(1,k):
    classifier=KNeighborsClassifier(n_neighbors=k).fit(x_train,y_train)
    y_pred=classifier.predict(x_test)
    acc=metrics.accuracy_score(y_test, y_pred)
    acc_array[k-1]=acc
max_acc=np.amax(acc_array)
acc_list=list(acc_array)
k=acc_list.index(max_acc)
print("The best accuracy was with", max_acc, "with k=",k) 

我尝试了不同的值,结果都是一样的。

【问题讨论】:

您的循环完全错误。 n_neighbors=k 被赋予了始终相同的 k 【参考方案1】:

您的代码中有多个错误

首先,在 forloop 内,n_neighbors=kk 在循环外定义,因此始终相同。

第二,您使用acc_array[k-1]=acc 并且k 是常量,因此您将acc 值存储在相同的位置。

这是使用 Iris 数据集的正确版本:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics                

# import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

k=10
acc_array=np.zeros(k)
for k in np.arange(1,k+1,1): # here k will take values from 1 to 10
    classifier = KNeighborsClassifier(n_neighbors=k).fit(x_train,y_train) # k changes after each iteration
    y_pred = classifier.predict(x_test)
    acc = metrics.accuracy_score(y_test, y_pred)
    acc_array[k-1]=acc # store correctly the results

max_acc=np.amax(acc_array)
acc_list=list(acc_array)
k=acc_list.index(max_acc)
print("The best accuracy was with", max_acc, "with k=", k+1)

在这种情况下,acc 对于所有使用的k 都是相同的。

acc_array
array([0.98, 0.98, 0.98, 0.98, 0.98, 0.98, 0.98, 0.98, 0.98, 0.98])

【讨论】:

我认为最后是 k+1 而不是 k 什么意思?在哪里? print("最佳准确度是 with", max_acc, "with k=",k) 是的。在印刷品中是k+1。如果我的回答有帮助,请点赞并采纳。

以上是关于如何根据最高精度在sklearn的KNeighborsClassifier中选择K的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 如何计算average_precision_score?

如何在sklearn中使用make_scorer自定义评分功能

精度最高的计时仪器是啥?

精度、召回率、F1 分数等于 sklearn

如何使用 SSE 指令集绝对 2 个双精度或 4 个浮点数? (最高 SSE4)

使用 sklearn 获得相同的精度和召回率 (K-NN) 值