速通机器学习 | 01 K 近邻算法 (KNN):最简单的监督分类算法
速通机器学习 | 01 K 近邻算法 (KNN)
专栏前言 欢迎来到【速通机器学习】系列。本系列拒绝堆砌复杂公式,优先理解思想,搭配可直接运行代码,快速掌握传统机器学习主流算法。本章作为系列第一篇,我们从最简单、最好理解的 KNN(K 近邻算法)入手。
一、什么是 KNN?通俗理解
KNN 全称 K-Nearest Neighbors,K 近邻算法。
一句话理解:物以类聚。在预测一个样本的时候,找寻距离它最近的 k 个邻居,通过少数服从多数来划分类别。
二、怎么计算距离?
在初中我们就学过两点之间的距离,也就是欧氏距离,二维公式:,多维特征以此类推。计算待测样本和所有样本距离后进行排序,选取 k 个最近的数据,统计类别,数量最多的类别即为该预测数据的类别。
三、代码实现
该代码是通过鸢尾花的特征对鸢尾花进行分类,训练数据与测试数据均可以在本文顶部免费下载。
分段讲解完整代码
训练数据样例:

测试集数据样例:

简单介绍一下 pandas 库:主要用于表格型数据处理,能够读取 Excel、筛选指定列、构建数据表,非常适合机器学习前期数据整理工作。
步骤1:对训练集和测试集进行特征与标签分离
# 导入pandas库读取Excel数据
import pandas as pd
#读取数据
train_data = pd.read_excel(r"D:\pythoncode2\bigdata_ai40\机器学习\data\鸢尾花训练数据.xlsx")
test_data = pd.read_excel(r'D:\pythoncode2\bigdata_ai40\机器学习\data\鸢尾花测试数据.xlsx')
#将特征和标签分离
train_X = train_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
train_Y = train_data[['类型_num']]
test_X = test_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
test_Y = test_data[['类型_num']]
步骤2:由于不同特征数值范围差距较大,距离计算会被大数特征主导,因此 KNN 需要做标准化处理。两种常见标准化方法:
-
Min-Max 归一化:将数值压缩在 0 到 1 之间,公式为:
-
Z-Score 标准化:将数值进行标准化处理,使其符合标准正态分布。本文代码使用该方式,公式为:
使用sklearn库:
sklearn.preprocessing:提供标准化工具scale,对每一列进行标准化
#导入用于标准化的scale
from sklearn.preprocessing import scale
#创建空DataFrame存放标准化之后的训练特征
data = pd.DataFrame()
data['萼片长标准化'] = scale(train_X['萼片长(cm)'])
data['萼片宽标准化'] = scale(train_X['萼片宽(cm)'])
data['花瓣长标准化'] = scale(train_X['花瓣长(cm)'])
data['花瓣宽标准化'] = scale(train_X['花瓣宽(cm)'])
步骤3:开始训练
sklearn.neighbors.KNeighborsClassifier:sklearn 内置 KNN 分类器,自动计算 k 个最近值并分类
#导入knn模块
from sklearn.neighbors import KNeighborsClassifier
#设置K=3,选取最近3个邻居
knn = KNeighborsClassifier(n_neighbors=3)
#传入标准化特征与标签开始训练
knn.fit(data,train_Y)
步骤4:进行自测,predict() 可以输出预测值,score() 可以对预测值和真实值进行比对,输出正确率。
#自测,将训练数据放入训练好的模型进行预测
train_predicted = knn.predict(data)
print(train_predicted)
#计算正确率,训练集中预测正确样本占比
score = knn.score(data,train_Y)
print(score)
步骤5:测试预测
# 对测试集特征执行标准化
data_test = pd.DataFrame()
data_test['萼片长标准化'] = scale(test_X['萼片长(cm)'])
data_test['萼片宽标准化'] = scale(test_X['萼片宽(cm)'])
data_test['花瓣长标准化'] = scale(test_X['花瓣长(cm)'])
data_test['花瓣宽标准化'] = scale(test_X['花瓣宽(cm)'])
#测试集预测
print('测试集预测')
print(knn.predict(data_test))
#测试集得分
print('测试集得分')
print(knn.score(data_test,test_Y))
四、补充知识点:K 值选择
-
K 取值过小:模型容易受到异常数据干扰,发生过拟合。
-
K 取值过大:较远的样本参与投票,容易造成欠拟合。实际应用中通常选择奇数 K 值,避免出现投票持平的情况。
五、KNN 优缺点
✅ 优点
-
原理简单直观,容易理解
-
无需复杂训练过程,小数据集快速上手
-
原生支持多分类任务
❌ 缺点
-
数据量大的时候预测速度很慢,需要逐一计算距离
-
面对超高维数据效果下滑(维度灾难)
-
需要提前对特征做标准化处理
本章小结
-
KNN 核心思路:计算距离,选取最近 k 个邻居投票分类
-
使用欧式距离衡量样本相似度
-
特征标准化是 KNN 必不可少的步骤
-
代码流程:读取数据→分离特征标签→标准化→模型训练→预测评估
更多推荐




所有评论(0)