1、选择说明
K-近邻算法通过查找测试数据点的K个最近的邻居来进行预测。这些邻居的类别(对于分类问题)或值(对于回归问题)用于决定测试点的类别或值。K是一个正整数,通常较小。
1)避免过小的K值
K值过小可能会导致模型过于复杂,容易受到数据中噪声的影响,从而导致过拟合。避免在K-近邻算法中选择过小的K值是非常重要的,因为过小的K值会导致模型过于敏感,容易受到数据中噪声的影响,从而引起过拟合。当K值很小时,模型可能会对训练数据中的异常值和噪声过于敏感。
2)避免过大的K值
在使用K-近邻(KNN)算法时,避免选择过大的K值是很重要的。过大的K值可能导致模型过于简化,无法捕捉到数据的关键特征,进而导致欠拟合。如果数据集很小,选择一个较大的K值可能不合适,因为这会导致每个预测都依赖于数据集中的大部分点。考虑数据集的特征数量和种类。在高维数据集上,可能需要选择更小的K值,因为在高维空间中找到“近邻”变得更加困难。
3)选择奇数K值
在使用K-近邻算法(KNN)时,选择奇数的K值可以是一个有益的策略,尤其是在解决分类问题时。这是因为奇数的K值有助于避免在决策过程中出现平票的情况。尽管奇数的K值可以帮助避免平票问题,但选择哪个奇数作为K值仍然需要通过测试和验证来确定。
4)考虑数据集大小
选择K-近邻算法(KNN)的K值时,考虑数据集的大小是非常重要的。数据集的大小不仅影响K值的选择,还影响算法的性能和准确性。对于较小的数据集,较小的K值通常更好,因为较大的K值可能导致模型过于简化,无法捕捉数据中的细微差异。但需要注意,K值过小(如1或2)可能导致模型对噪声过于敏感,从而过拟合。在大型数据集上,可以考虑使用更大的K值。这有助于减少噪声的影响,并提高预测的稳定性。大型数据集通常包含更多的噪声和异常值,较大的K值有助于在这些情况下保持模型的健壮性。
2、操作方法
1)交叉验证
使用交叉验证来评估不同K值的性能。通常,可以从较小的K值开始,逐渐增加,观察模型性能如何变化。通过交叉验证来选择最佳的K值是一种有效的方法。交叉验证是一种统计分析方法,用于评估机器学习模型的泛化能力。它通过将数据集分成多个小的子集来进行,每次使用其中一个子集作为验证集,其余作为训练集。这种方法可以帮助我们理解不同K值对模型性能的影响,并选择最优的K值。
from sklearn.model_selection import cross_val_score from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris import matplotlib.pyplot as plt # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 试验不同的K值 k_range = range(1, 31) k_scores = [] for k in k_range: knn = KNeighborsClassifier(n_neighbors=k) scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy') # 10折交叉验证 k_scores.append(scores.mean()) # 找到最佳K值 best_k = k_range[k_scores.index(max(k_scores))] print(f"最佳的K值是:{best_k}") # 设置 Matplotlib 可以显示中文 plt.rcParams['font.sans-serif'] = ['Heiti TC'] # 设置字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 """ #Windows 中设置字体 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 设置字体为微软雅黑 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 """ # 绘制K值与准确度的关系图 plt.plot(k_range, k_scores) plt.xlabel(u'K值') plt.ylabel(u'交叉验证平均准确度') plt.title(u'K值与交叉验证准确度的关系') plt.draw() plt.show()
2)误差分析
绘制K值与误差率的图表,选择误差最小的K值。如果存在多个具有相似误差的K值,选择更简单的模型(较大的K值)。通过误差分析来选择K值是一种有效的方法。误差分析通常涉及评估不同K值下模型的性能,以便找到平衡偏差和方差的最佳K值。
import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 测试不同的K值 k_range = range(1, 40) accuracy_scores = [] for k in k_range: knn = KNeighborsClassifier(n_neighbors=k) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) accuracy_scores.append(accuracy_score(y_test, y_pred)) # 绘制K值和准确率之间的关系 plt.plot(k_range, accuracy_scores) plt.xlabel('Value of K for KNN') plt.ylabel('Testing Accuracy') plt.draw() plt.show()
3)平方根法则
一种常用的启发式方法是选择数据点总数的平方根作为K值。如有N个数据点,那么选择K值为sqrt(N)。这个方法的一个变体是选择数据点总数的平方根的整数部分。使用平方根法则来选择K-近邻算法(KNN)的K值是一种常见的经验法则。这个方法简单而直观,尤其适用于初步探索和快速实验。平方根法则建议将K值设置为训练集大小的平方根。
from sklearn.model_selection import cross_val_score from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris import numpy as np # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 应用平方根法则选择K值 n_samples = X.shape[0] k = int(np.sqrt(n_samples)) # 创建K-近邻模型 knn = KNeighborsClassifier(n_neighbors=k) # 使用交叉验证评估模型 scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy') print(f"平均准确率: {scores.mean()},使用K值: {k}")
详细文档:Python 机器学习 K-近邻算法