python数据分析之KNN(K近邻算法)实践

本文详细介绍了K近邻(KNN)算法,包括KNN的概述、算法步骤、超参数设置(如K值、距离度量和权重计算方式)以及KNN在分类和回归问题上的实践应用。KNN的超参数K值的选择对模型性能至关重要,过小可能导致过拟合,过大则可能欠拟合。实践中通常采用交叉验证来确定最佳K值。此外,还探讨了距离度量方式,如欧几里得和曼哈顿距离,并介绍了数据标准化和流水线优化对KNN算法性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、KNN概述
  • KNN(K-Nearest Neighbor),即K近邻算法。K近邻就是K个最近的邻居,当需要预测一个未知样本的时候,就由与该样本最接近的K个邻居来决定。
  • KNN既可以用于分类问题,也可以用于回归问题。当进行分类预测时,使用K个邻居中,类别数量最多(或加权最多)者,作为预测结果;当进行回归预测时,使用K个邻居的均值(或加权均值),作为预测结果。
  • KNN算法的原理在于,样本映射到多维空间时,相似度较高的样本,其距离也会比较接近,反之,相似度较低的样本,其距离也会比较疏远。
  • KNN是一种懒惰学习(与急切学习相对应)的算法,它输入基于实例的学习。KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。
2、KNN算法步骤

(1)确定算法超参数

  • 确定近邻的数量K
  • 确定距离度量方式
  • 确定权重计算方式
  • 其他超参数

(2)从训练集中选择离待预测样本A最近的K个样本

(3)根据这K个样本预测A

  • 对于分类,使用K个样本的类别(或加权类别)预测A。
  • 对于回归,使用K个样本目标值( y )的均值(或加权均值)预测A。
3、算法超参数
  • 超参数,是指我们在训练模型之前,需要人为指定的参数。 该参数不同于模型内部的参数,模型内部的参数是通过训练数据,在训练过程中计算得出的。
  • 超参数的不同,可能会对模型的效果产生很大影响。
3.1 K值
  • K值(临近数,即在预测目标点时取几个临近的点来预测)的选择,会直接影响到预测结果。
  • 当K值较小时,模型会较依赖于附近的邻居样本,具有较好敏感性,但是稳定性会较弱,容易导致过拟合。
  • 当K值较大时,稳定性增加,但是敏感性会减弱,容易导致欠拟合。
  • 通常情况下,可以通过交叉验证的方式,选择最合适的K值。
3.2 K值的取值方式
  • K的取值尽量要取奇数,以保证在计算结果最后会产生一个较多的类别,如果取偶数可能会产生相等的情况,不利于预测。
  • 常用的方法是从k=1开始,使用检验集估计分类器的误差率。重复该过程,每次K值增加1,即增加一个近邻,选取产生最小误差率的K。
  • 一般k的取值不超过20,上限是n(n为样本总数)的开方,随着数据集的增大,K的值也要增大。
3.3 距离度量方式
  • 闵可夫斯基距离(Minkowski distance):scikit-learn中默认使用的距离度量方式,它是衡量数值点之间距离的一种非常常见的方法。

    假设数值点P和Q坐标如下:

在这里插入图片描述

​ 那么,闵可夫斯基距离定义为:

在这里插入图片描述

  • 曼哈顿距离(Manhattan distance):当闵可夫斯基距离中的p为1时即为曼哈顿距离,也叫L1距离。
  • 欧几里得距离(Euclidean distance):当闵可夫斯基距离中的p为2时即为欧几里得距离,也叫L2距离。
  • 切比雪夫距离(Chebyshev distance):当闵可夫斯基距离中的p趋近无穷大时即为切比雪夫距离
3.4 权重计算方式
  • 统一权重:所有样本的权重相同。
  • 距离加权权重:样本的权重与待预测样本的距离成反比,权重之和等于1 。
  • 统一权重和距离加权权重算法不一样。
  • 距离加权权重分类预测或者回归预测时,都需提前计算权重。
4、KNN算法分类实践
4.1 自定超参数

以鸢尾花数据集为例,使用KNN算法实现分类预测:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

iris = load_iris()
X, y = iris.data[:, :2], iris.target      # 只使用两个特征
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

knn = KNeighborsClassifier(n_neighbors=3, weights="uniform")    # KNN算法,自定k值和权重计算方式
"""
n_neighbors:邻居的数量, 即K值
weights:权重计算方式,可选值为uniform与distance。
		 uniform:统一权重
		 distance:距离加权权重
"""

knn.fit(X_train, y_train)
y_hat = knn.predict(X_test)
print(classification_report(y_test, y_hat))
------------------------------------------------
				precision    recall  f1-score   support

           0       1.00      1.00      1.00        13
           1       0.78      0.44      0.56        16
           2       0.44      0.78      0.56         9

    accuracy                           0.71        38
   macro avg       0.74      0.74      0.71        38
weighted avg       0.77      0.71      0.71        38

不同的超参数值(K值和权重计算方式),会直接影响模型的分类效果:

from matplotlib.colors import ListedColormap
from itertools import product

# 定义决策边界函数,便于可视化
def plot_decision_boundary(model, X, y):
    color = ["r", "g", "b"]
    marker = ["o", "v", "x"]
    class_label = np.uni
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值