我有 7 个需要分类的类,我有 10 个特征。在这种情况下,我是否需要使用 k 的最佳值,或者我是否必须针对 1 到 10(大约 10)之间的 k 值运行 KNN 并在算法本身的帮助下确定最佳值?
5 回答
在 k-NN 算法中要注意的重要一点是,特征的数量和类的数量都不会影响k-NN 算法中 k 的值。k-NN算法是一种ad-hoc分类器,用于根据距离度量对测试数据进行分类,即如果与其他类相比,靠近测试样本的Class-1训练样本数量更多,则将测试样本分类为Class-1训练样本。例如:如果 k = 5 个样本的值,则根据距离度量选择 5 个最接近的训练样本,然后对每个类的大多数样本进行投票。因此,如果 3 个样本属于 1 类,2 个样本属于 5 类,则该测试样本被归类为 1 类。所以k的值表示对测试样本进行分类所需的训练样本数。
谈到您的问题,k的值是非参数的,选择 k 值的一般经验法则是k = sqrt(N)/2,其中N代表训练数据集中的样本数。我建议的另一个技巧是尽量保持 k 的值奇数,这样在选择类之间就没有联系,但这表明训练数据在类之间高度相关,并且使用简单的分类算法,例如 k- NN 会导致较差的分类性能。
在 KNN 中,找到 k 的值并不容易。k 值较小意味着噪声对结果的影响较大,而较大的值使其计算量大。
数据科学家通常选择:
1.如果班级数为2,则为奇数
2.另一种选择k的简单方法是设置k = sqrt(n)。其中 n = 训练数据中的数据点数。
希望这会帮助你。
您可能想尝试将其作为一种遍历不同 k 值并将其可视化以帮助您做出决策的方法。我已经使用了很多次,它给了我想要的结果:
error_rate = []
for i in range(1,50):
knn = KNeighborsClassifier(n_neighbors=i)
knn.fit(X_train, y_train)
pred = knn.predict(X_test)
error_rate.append(np.mean(pred != y_test))
plt.figure(figsize=(15,10))
plt.plot(range(1,50),error_rate, marker='o', markersize=9)
没有预定义的统计方法可以找到最有利的 K 值。选择非常小的 K 值会导致决策边界不稳定。K 的值可以选择为 k = sqrt(n)。其中 n = 训练数据中的数据点数 奇数优先作为 K 值。
大多数情况下,工业中遵循以下方法。初始化一个随机的 K 值并开始计算。得出错误率和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最小错误率。得出精度和 K 之间的图,表示定义范围内的值。然后选择K值作为具有最大精度。尝试在误差曲线和准确度曲线之间找到 K 的折衷值。