首先定义什么是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:
{}
".format(clf.best_estimator_))
print("Best Parameters:
{}
".format(clf.best_params_))
print("Best Score:
{}
".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次,为什么?因为它可以降低偏差,并为您提供更好的统计估计.
也是分层的,它试图确保每个类在每个测试折叠中近似相等地表示(即每个折叠代表数据的所有层次).