KNN算法分类思想代码实现
1 课程概览
本课讲解KNN算法的API实践,重点演示分类问题的代码实现。介绍scikit-learn中KNeighborsClassifier类的使用,通过简单数据集演示KNN分类的完整流程:导包→准备数据集→创建模型对象→模型训练→模型预测→打印结果。
2 核心概念与定义
- KNeighborsClassifier:scikit-learn中KNN分类器类,位于sklearn.neighbors模块。
- KNeighborsRegressor:scikit-learn中KNN回归器类,位于sklearn.neighbors模块。
- n_neighbors:KNN的超参数,指定最近邻居数量,默认值为5。
- estimator:估计器,即模型对象,也可用model变量名接收。
- fit:拟合/训练方法,传入训练集特征和标签。
- predict:预测方法,传入测试集特征,返回预测结果。
3 算法与模型详解
3.1 KNN分类API
from sklearn.neighbors import KNeighborsClassifier
| 类名 | 任务 | 说明 |
|---|---|---|
| KNeighborsClassifier | 分类 | 标签不连续,投票决策 |
| KNeighborsRegressor | 回归 | 标签连续,均值决策 |
3.2 KNN分类实现思路(六步)
- 导包:从sklearn.neighbors导入KNeighborsClassifier
- 准备数据集:x_train(训练集特征,二维)、y_train(训练集标签,一维)、x_test(测试集特征,二维)
- 创建模型对象:estimator = KNeighborsClassifier(n_neighbors=k)
- 模型训练:estimator.fit(x_train, y_train)
- 模型预测:y_predict = estimator.predict(x_test)
- 打印结果:print(y_predict)
3.3 数据格式要求
| 数据 | 维度 | 说明 |
|---|---|---|
| x_train(训练集特征) | 二维 | 特征可有多列,需用嵌套中括号 |
| y_train(训练集标签) | 一维 | 标签只有一列,不需嵌套 |
| x_test(测试集特征) | 二维 | 与训练集格式一致,需嵌套 |
| y_predict(预测结果) | 一维 | 模型返回 |
⚠️即使只有一个特征值,测试集特征也必须写成二维格式:
[[5]],不能写成[5]。
3.4 K值选择与奥卡姆剃刀
- K值较小时,选择最近的K个邻居投票。
- 投票票数相同时,选择预测值较小的结果(模型更简单,奥卡姆剃刀原则)。
4 数学原理与推导
本课重点为代码实现,数学原理参见KNN算法简介。
5 代码示例
# 1. 导包
from sklearn.neighbors import KNeighborsClassifier
# 2. 准备数据集
x_train = [[0], [1], [2], [3]] # 训练集特征(二维)
y_train = [0, 0, 1, 1] # 训练集标签(一维)
x_test = [[5]] # 测试集特征(二维)
# 3. 创建模型对象
estimator = KNeighborsClassifier(n_neighbors=2)
# 4. 模型训练
estimator.fit(x_train, y_train)
# 5. 模型预测
y_predict = estimator.predict(x_test)
# 6. 打印结果
print("预测值为", y_predict)
输出:预测值为 [1]
分析:
- x_test=5到各训练样本距离:|5-0|=5, |5-1|=4, |5-2|=3, |5-3|=2
- K=2时,最近的2个邻居是x=3(标签1)和x=2(标签1)
- 投票结果:1票0,2票1 → 预测为1
6 重难点与易错提醒
- ❗重点:分类API为KNeighborsClassifier,回归API为KNeighborsRegressor。
- ❗重点:n_neighbors默认值为5,需根据样本数调整。
- ⚠️易错:测试集特征必须写成二维格式
[[5]],不能写成一维[5],否则报错。 - ⚠️易错:训练集特征需二维,标签只需一维(标签只有一列)。
- 💡深入理解:投票票数相同时,选择预测值较小的结果(奥卡姆剃刀)。
7 课堂问答精选
Q: predict方法传入的参数是什么?
A: 传入测试集的特征(x_test),且必须是二维格式。因为特征可能有多列,所以需用嵌套中括号包裹,即使只有一个特征值也要写成[[5]]。
Q: K=4时(样本总数为4),预测结果是什么?
A: 所有4个样本都参与投票,标签为0和1。由于0比1小,根据奥卡姆剃刀原则,选择预测值较小的结果0。
8 本课小结
- KNN分类API:KNeighborsClassifier,位于sklearn.neighbors。
- 实现六步:导包→准备数据集→创建模型→训练→预测→打印。
- 数据格式:特征二维,标签一维。
- n_neighbors为超参数,默认5,需根据样本数调整。
9 延伸思考与实践
- 实践:修改n_neighbors值为1、3、4,观察预测结果变化。
- 思考:为什么测试集特征必须写成二维格式?
- 预习:KNN回归问题的代码实现。