1. K 近邻算法 API
K近邻(K-Nearest Neighbors, KNN)算法作为一种基础且广泛应用的机器学习技术,其API的重要性不言而喻。它提供了快速、直接的方式来执行基于实例的学习,通过查找与待分类样本最邻近的K个样本,并基于这些邻近样本的类别来预测新样本的类别。KNN API的标准化和易用性,使得数据分析师和开发者能够轻松集成该算法到他们的项目中,无需深入算法细节,即可享受其强大的分类与回归能力。此外,KNN API通常还包含参数调整功能,如K值选择、距离度量方法等,使得用户可以根据具体需求优化算法性能,进一步凸显了其在机器学习实践中的不可或缺性。
学习目标
- 掌握sklearn中K近邻算法API的使用方法
1.1 Sklearn API介绍
本小节使用 scikit-learn 的 KNN API 来完成对鸢尾花数据集的预测.
- API介绍
1.2 鸢尾花分类示例代码
鸢尾花数据集
鸢尾花Iris Dataset数据集是机器学习领域经典数据集,鸢尾花数据集包含了150条鸢尾花信息,每50条取自三个鸢尾花中之一:Versicolour、Setosa和Virginica
每个花的特征用如下属性描述:
示例代码:
from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier if __name__ == '__main__': # 1. 加载数据集 iris = load_iris() #通过iris.data 获取数据集中的特征值 iris.target获取目标值 # 2. 数据标准化 transformer = StandardScaler() x_ = transformer.fit_transform(iris.data) # iris.data 数据的特征值 # 3. 模型训练 estimator = KNeighborsClassifier(n_neighbors=3) # n_neighbors 邻居的数量,也就是Knn中的K值 estimator.fit(x_, iris.target) # 调用fit方法 传入特征和目标进行模型训练 # 4. 利用模型预测 result = estimator.predict(x_) print(result)
1.3 小结
1、sklearn中K近邻算法的对象:
from sklearn.neighbors import KNeighborsClassifier estimator = KNeighborsClassifier(n_neighbors=3) # K的取值通过n_neighbors传递
2、sklearn中大多数算法模型训练的API都是同一个套路
estimator = KNeighborsClassifier(n_neighbors=3) # 创建算法模型对象 estimator.fit(x_, iris.target) # 调用fit方法训练模型 estimator.predict(x_) # 用训练好的模型进行预测
3、sklearn中自带了几个学习数据集
- 都封装在sklearn.datasets 这个包中
- 加载数据后,通过data属性可以获取特征值,通过target属性可以获取目标值, 通过DESCR属性可以获取数据集的描述信息
2. K 值选择问题
K值选择问题是K近邻算法中的关键,它直接影响到算法的准确性与效率。在平衡“过拟合”与“欠拟合”需要注意:K值过小可能导致模型复杂,对新样本敏感,易于过拟合;K值过大则可能平滑类边界,忽视邻近样本的细节,造成欠拟合。因此,合理选取K值是确保K近邻算法性能的重要步骤。
学习目标
- 了解 K 值大小的影响
- 掌握 GridSearchCV 的使用
2.1 K取不同值时带来的影响
举例:
- 有两类不同的样本数据,分别用蓝颜色的小正方形和红色的小三角形表示,而图正中间有一个绿色的待判样本。
- 问题:如何给这个绿色的圆分类?是判断为蓝色的小正方形还是红色的小三角形?
- 方法:应用KNN找绿色的邻居,但一次性看多少个邻居呢(K取几合适)?
解决方案:
- K=4,绿色圆圈最近的4个邻居,3红色和1个蓝,按少数服从多数,判定绿色样本与红色三角形属于同一类别
- K=9,绿色圆圈最近的9个邻居,6红和3个蓝,判定绿色属于红色的三角形一类。
有时候出现K值选择困难的问题
KNN算法的关键是什么?
答案一定是K值的选择,下图中K=3,属于红色三角形,K=5属于蓝色的正方形。这个时候就是K选择困难的时候。
2.2 如何确定合适的K值
K值过小:容易受到异常点的影响
k值过大:受到样本均衡的问题
K=N(N为训练样本个数):结果只取决于数据集中不同类别数量占比,得到的结果一定是占比高的类别,此时模型过于简单,忽略了训练实例中大量有用信息。
在实际应用中,K一般取一个较小的数值
我们可以采用交叉验证法(把训练数据再分成:训练集和验证集)来选择最优的K值。
2.3 GridSearchCV 的用法
使用 scikit-learn 提供的 GridSearchCV 工具, 配合交叉验证法可以搜索参数组合.
# 1. 加载数据集 x, y = load_iris(return_X_y=True) # 2. 分割数据集 x_train, x_test, y_train, y_test = \ train_test_split(x, y, test_size=0.2, stratify=y, random_state=0) # 3. 创建网格搜索对象 estimator = KNeighborsClassifier() param_grid = {'n_neighbors': [1, 3, 5, 7]} estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5, verbose=0) estimator.fit(x_train, y_train) # 4. 打印最优参数 print('最优参数组合:', estimator.best_params_, '最好得分:', estimator.best_score_) # 4. 测试集评估模型 print('测试集准确率:', estimator.score(x_test, y_test))
2.4 小结
KNN 算法中K值过大、过小都不好, 一般会取一个较小的值
GridSearchCV 工具可以用来寻找最优的模型超参数,可以用来做KNN中K值的选择
K近邻算法的优缺点:
- 优点:简单,易于理解,容易实现
- 缺点:算法复杂度高,结果对K取值敏感,容易受数据分布影响+