Sklearn实战KNN:快速实现分类任务的入门指南

在机器学习的入门算法里,KNN(k近邻)绝对是最友好的那一个。它没有复杂的训练过程,核心思想用一句话就能讲明白:"物以类聚,人以群分"。最近我跟着兰智数加学院的课程,从理论到代码完整走了一遍KNN的实践,今天就把这个过程和大家分享一下。

一、KNN算法:简单到"不讲道理"的惰性学习

KNN的全称是k-Nearest Neighbors,翻译过来就是"k个最近的邻居"。它的核心逻辑非常朴素:

• 对于一个待分类的数据点,我们先在数据集中找到离它最近的k个邻居。

• 然后看这k个邻居里,哪个类别占比最多,就把这个类别作为当前点的分类结果。

正因为它不需要提前训练模型,而是在预测时才进行计算,所以也被称为"惰性学习算法"。

优点与缺点并存

• 优点:原理简单、代码实现容易,对异常值不敏感,很适合处理稀有事件的分类问题。

• 缺点:当数据量很大时,计算每个点与所有点的距离会非常耗时;如果样本类别不平衡,少数类别的数据很容易被"淹没"。

二、距离计算:KNN的"度量衡"

要找到"最近的邻居",首先要定义"距离"。常见的距离计算方式有两种:

  1. 欧式距离:这是我们最熟悉的直线距离,公式为
  1. 曼哈顿距离:想象在城市里沿着街道行走的距离,公式为

在本次室友匹配的案例中,我们使用的是欧式距离,因为它更符合我们对"相似性"的直观感受。

三、sklear安装

Sklearn (Scikit-Learn) 是基于 Python 语言的第三方机器学习库。它建立在 NumPy, SciPy, Pandas 和 Matplotlib库 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。

通过命令指令符:

复制代码
pip3.11 install scikit-learn==1.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

四、实战:用KNN帮你找到合拍的室友

我们的目标是根据学生的每年旅行里程、玩游戏时间占比、每周消耗冰淇淋量这三个特征,把学生分为"爱学习""一般""爱玩"三类,从而把相似的学生分配到同一个宿舍。

  1. 数据准备与可视化

首先,我们用Numpy加载数据集datingTestSet1.txt,并用Matplotlib绘制3D散点图,直观地看到不同类别学生的特征分布。

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

data = np.loadtxt('datingTestSet1.txt')
data_1 = data[data[:,-1] == 1]
data_2 = data[data[:,-1] == 2]
data_3 = data[data[:,-1] == 3]

fig = plt.figure()
ax = plt.axes(projection = "3d")
ax.scatter(data_1[:,0],data_1[:,1],zs=data_1[:,2],c="#00DDAA",marker="o")
ax.scatter(data_2[:,0],data_2[:,1], zs=data_2[:,2],c="#FF5511",marker="^")
ax.scatter(data_3[:,0], data_3[:,1], zs=data_3[:,2],c="#000011",marker="+")
ax.set(xlabel="Xaxes",ylabel="Yaxes",zlabel="Zaxes")
plt.show()


2. 模型训练与评估

接下来,我们使用Sklearn工具包来实现KNN模型。这里有一个关键步骤:特征标准化。因为不同特征的量纲差异很大(比如"旅行里程"是几千公里,而"冰淇淋消耗量"是升),直接计算距离会导致量纲大的特征主导结果。

python 复制代码
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import scale
train_data = np.loadtxt('datingTestSet2.txt')
test_data = np.loadtxt('datingTestSet3.txt')

train_x = train_data[ :, :-1]
train_y = train_data[ :,-1]

train_x_scaled = scale(train_x)

knn = KNeighborsClassifier(n_neighbors = 5)
knn.fit(train_x_scaled,train_y)

train_predicted = knn.predict(train_x_scaled)
train_score=knn.score(train_x_scaled,train_y)
print(train_score)

test_x = test_data[ :, :-1]
test_y = test_data[ :,-1]

test_x_scaled = scale(test_x)
test_predicted = knn.predict(test_x)
test_score=knn.score(test_x_scaled,test_y)
print(test_score)


3. 结果与思考

运行代码后,我们可以得到模型在训练集和测试集上的准确率。在这个案例中,k值选择了5,这是一个经验值,你也可以通过交叉验证来找到最优的k值。

整个过程下来,你会发现KNN虽然简单,但在处理这类小样本的分类问题时非常有效。它不需要复杂的数学推导,却能帮我们解决实际问题,非常适合作为机器学习的入门算法。

相关推荐
艾莉丝努力练剑35 分钟前
图像处理全栈加速:ops-cv算子库在CV领域的应用
图像处理·人工智能
tq108637 分钟前
AI 时代的3类程序员
人工智能
island131437 分钟前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络
骥龙1 小时前
第六篇:AI平台篇 - 从Jupyter Notebook到生产级模型服务
ide·人工智能·jupyter
TOPGUS1 小时前
谷歌SEO第三季度点击率趋势:榜首统治力的衰退与流量的去中心化趋势
大数据·人工智能·搜索引擎·去中心化·区块链·seo·数字营销
松☆1 小时前
CANN深度解析:构建高效AI推理引擎的软件基
人工智能
ujainu1 小时前
CANN仓库中的AIGC可持续演进工程:昇腾AI软件栈如何构建“活”的开源生态
人工智能·开源·aigc
光锥智能1 小时前
从连接机器到激活知识:探寻工业互联网深水区的山钢范式
人工智能
GHL2842710901 小时前
分析式AI学习
人工智能·学习·ai编程
ujainu2 小时前
CANN仓库中的AIGC性能极限挑战:昇腾软件栈如何榨干每一瓦算力
人工智能·开源