KNeighborsClassifier 中 k 的值
value of k in KNeighborsClassifier
我正在努力寻找 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()
这是结果。
您可以看到 k
在 14
到 20
之间时准确率更高。
1) 如何选择最佳的k值。
2) 是否有任何其他方法可以计算和找到 K
的最佳值?
3) 也欢迎任何其他改进建议。我是 ML
的新手
我们先来定义什么是K
?
K
是 投票者 的数量,算法参考这些投票者做出关于 的决定class 它属于.
的给定数据点
换句话说,它使用K
来划分每个class的边界。这些边界将 class 彼此隔离。
相应地,随着 K
值的增加,边界变得更平滑。
所以按道理来说,如果我们把K
增加到infinity,最后会变成任意[=的所有点110=] 取决于 总多数 !。然而,这会导致所谓的 High Bias(即欠拟合)。
相比之下,如果我们让 K
只等于 1,那么对于 训练样本。这是因为最接近任何训练数据点的点是它本身。然而,我们最终会 过度拟合 边界(即高方差),因此它 无法概括 任何新的和看不见的数据!
不幸的是,没有经验法则。 K
的选择在某种程度上是由最终应用程序和数据集驱动的。
建议的解决方案
使用 GridSearchCV 对估算器的指定参数值执行 详尽搜索。 因此我们使用它来尝试找到 K
的最佳值。
对我来说,当我想设置 K
的最大阈值时,每个 class 中的元素数量不会超过最大 class,并且到目前为止它并没有让我失望(稍后查看示例以了解我在说什么)
示例:
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
的更新
简单来说,就是重复超过n_repeats
次的KFold
,为什么?因为它可以降低偏差并在统计方面为您提供更好的估计。
它也是 Stratified
它试图确保每个 class 在每个测试折叠中 大约 平等代表(即 每个折叠代表数据的所有层)。
根据图表,我会说 13。
我假设这是一个 class化工作。
在那种情况下:不要 将 k 设置为偶数。
例如如果你有2个class A和B,并且k设置为4.
有可能新数据(或点)
介于 2 class A 和 2 class B.
之间
因此,您将有 2 次投票 class 将新数据点确认为 A
和 2 投票 class 确定为 B.
设置k为奇数可以避免这种情况。
我正在努力寻找 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()
这是结果。
您可以看到 k
在 14
到 20
之间时准确率更高。
1) 如何选择最佳的k值。
2) 是否有任何其他方法可以计算和找到 K
的最佳值?
3) 也欢迎任何其他改进建议。我是 ML
我们先来定义什么是K
?
K
是 投票者 的数量,算法参考这些投票者做出关于 的决定class 它属于.
换句话说,它使用K
来划分每个class的边界。这些边界将 class 彼此隔离。
相应地,随着 K
值的增加,边界变得更平滑。
所以按道理来说,如果我们把K
增加到infinity,最后会变成任意[=的所有点110=] 取决于 总多数 !。然而,这会导致所谓的 High Bias(即欠拟合)。
相比之下,如果我们让 K
只等于 1,那么对于 训练样本。这是因为最接近任何训练数据点的点是它本身。然而,我们最终会 过度拟合 边界(即高方差),因此它 无法概括 任何新的和看不见的数据!
不幸的是,没有经验法则。 K
的选择在某种程度上是由最终应用程序和数据集驱动的。
建议的解决方案
使用 GridSearchCV 对估算器的指定参数值执行 详尽搜索。 因此我们使用它来尝试找到 K
的最佳值。
对我来说,当我想设置 K
的最大阈值时,每个 class 中的元素数量不会超过最大 class,并且到目前为止它并没有让我失望(稍后查看示例以了解我在说什么)
示例:
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
简单来说,就是重复超过n_repeats
次的KFold
,为什么?因为它可以降低偏差并在统计方面为您提供更好的估计。
它也是 Stratified
它试图确保每个 class 在每个测试折叠中 大约 平等代表(即 每个折叠代表数据的所有层)。
根据图表,我会说 13。
我假设这是一个 class化工作。
在那种情况下:不要 将 k 设置为偶数。
例如如果你有2个class A和B,并且k设置为4.
有可能新数据(或点)
介于 2 class A 和 2 class B.
之间
因此,您将有 2 次投票 class 将新数据点确认为 A
和 2 投票 class 确定为 B.
设置k为奇数可以避免这种情况。