标签:knn python-3-x machine-learning python
我正在尝试为KNeighborsClassifier找到最佳的K值.
这是我的虹膜数据集的代码:
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()
这就是结果.
当k在14到20之间时,可以看到精度更高.
1)如何选择k的最佳值.
2)还有其他方法可以计算和找到K的最佳值吗?
3)任何其他改进建议也将受到赞赏.我是ML的新手
解决方法:
首先定义什么是K?
K是算法咨询以决定其给定数据点属于哪个类别的投票者的数量.
换句话说,它使用K来划分每个类的边界.这些界限将每个类别彼此隔离.
因此,边界随着K值的增加而变得更平滑.
因此,从逻辑上讲,如果将K增加到无穷大,它将最终成为所有类的所有点,具体取决于总数!但是,这将导致所谓的高偏差(即欠拟合).
相反,如果我们使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次,为什么?因为它可以降低偏差,并为您提供更好的统计估计.
也是分层的,它试图确保每个类在每个测试折叠中近似相等地表示(即每个折叠代表数据的所有层次).
标签:knn,python-3-x,machine-learning,python 来源: https://codeday.me/bug/20191025/1924764.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。