大家好,我是你们的技术伙伴。👋

在2026年的今天,虽然AutoML和大模型风头正劲,但作为技术人员,我们不能只做“API调用者”。要想真正成为一名合格的数据科学家,必须掌握机器学习的三大核心能力

  1. 数据清洗与预处理(把数据喂给模型前的准备工作);
  2. 算法原理与选择(理解模型背后的数学逻辑);
  3. 模型评估与调优(让模型从“能用”变成“好用”)。

今天,我们就以经典的KNN(K近邻)算法为载体,通过几个简单的案例,带你打通这任督二脉。

准备好了吗?让我们开始吧!🚀


🧹 第一章:数据预处理——磨刀不误砍柴工

很多新手在建模时会发现,模型跑出来的结果极差。其实,问题往往不出在算法上,而出在数据上。

1. 为什么要进行预处理?

场景还原:
假设我们有一个数据集,其中一列是“年龄”(单位:岁,方差小),另一列是“年收入”(单位:元,方差大)。
如果不做处理,模型在计算距离时,会被“年收入”这个巨大的数值完全主导,“年龄”的影响几乎可以忽略不计。这就是量纲问题

2. 归一化 (Normalization) vs 标准化 (Standardization)

这是最容易混淆的两个概念,我用一张表帮你总结:

特性 归一化 (Min-Max Scaling) 标准化 (Standardization)
核心公式 ​​
目标区间 映射到 [0, 1] 区间 映射到 均值为0,标准差为1 的正态分布
适用场景 小数据集,数据分布比较稳定 大数据集,数据可能存在异常值或分布不均匀
抗干扰性 (受最大值/最小值影响大) (受均值和标准差影响,对异常值相对不敏感)
3. 代码实战

归一化代码:

from sklearn.preprocessing import MinMaxScaler

# 原始数据: [[年龄, 收入, ...]]
x_train = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, embed]]

# 1. 创建归一化对象 (默认范围0-1)
transfer = MinMaxScaler()
# transfer = MinMaxScaler(feature_range=(3, 5)) # 自定义范围

# 2. 拟合并转换数据
x_train_new = transfer.fit_transform(x_train)

print('归一化后的数据集为: \n', x_train_new)

标准化代码:

from sklearn.preprocessing import StandardScaler

# 1. 创建标准化对象
transfer = StandardScaler()

# 2. 拟合并转换数据
x_train_new = transfer.fit_transform(x_train)

print('标准化后的数据集为: \n', x_train_new)
# 输出均值和标准差,验证是否生效
print(f'数据集的均值为: {transfer.mean_}') 
print(f'数据集的标准差为: {transfer.scale_}')

💡 避坑指南: 在实际工作中,标准化的使用频率远高于归一化,尤其是在配合KNN、K-Means、神经网络等基于距离的算法时。


🧠 第二章:KNN算法——机器学习的“懒惰大侠”

KNN(K-Nearest Neighbors)是机器学习中最简单、最直观的算法之一,被称为“懒惰学习者”(因为它在训练阶段几乎不做任何事,全在预测阶段算距离)。

1. 核心原理
  • 分类任务(离散标签): “物以类聚,人以群分”。看测试点周围最近的K个邻居,哪个类别最多,测试点就属于哪个类别(投票法)。
  • 回归任务(连续标签): 看测试点周围最近的K个邻居,取它们的平均值作为预测值。
2. K值的选择(决定生死的关键)
  • K值过小: 容易受到异常值的干扰,模型太复杂,导致过拟合
  • K值过大: 模型变得太简单,忽略了数据本身的规律,导致欠拟合
3. 分类与回归实战

分类任务代码:

from sklearn.neighbors import KNeighborsClassifier

# 准备数据: 特征[[数值]] -> 标签[0或1]
x_train = [[0], [1], [2], [3]]
y_train = [0, 0, 1, 1]
x_test = [[5]]

# 创建模型 (K=3)
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train, y_train) # 训练(其实只是把数据存进去了)

# 预测
y_pre = estimator.predict(x_test)
print(f'预测类别为: {y_pre}') # 输出预测的标签

回归任务代码:

from sklearn.neighbors import KNeighborsRegressor

# 准备数据: 标签是连续的数值
x_train = [[0, 0, 1], [1, 1, 0], [3, 10, 10], [4, 11, 12]]
y_train = [0.1, 0.2, 0.3, 0.4] # 连续值
x_test = [[3, 11, 10]]

# 创建回归模型
estimator = KNeighborsRegressor(n_neighbors=2)
estimator.fit(x_train, y_train)

# 预测
y_pre = estimator.predict(x_test)
print(f'预测数值为: {y_pre}') # 输出一个具体的数值

🏆 第三章:模型调优

在第二章中,我们手动设置了 n_neighbors=3。但如果我告诉你,选错K值,准确率可能暴跌。难道我们要像“猜盲盒”一样一个个试吗?当然不,我们要用网格搜索交叉验证

1. 核心概念
  • 交叉验证 (Cross Validation): 把数据分成N份(比如4份,即4折)。轮流用其中1份做测试,其余做训练。这样能算出4个准确率,取平均值。目的: 防止模型在某一次特定的划分下“运气好”才准,让评估结果更稳健。
  • 网格搜索 (GridSearchCV): 给它一堆参数(比如K从1试到10),它会自动帮你跑完所有组合,并告诉你哪个K值效果最好。

📝 总结与福利

通过这篇文章,我们完成了一个机器学习项目的标准流程:

  1. 数据预处理:学会了用 StandardScaler 解决量纲问题。
  2. 算法实战:理解了 KNN 的分类与回归区别。
  3. 模型调优:利用 GridSearchCV 找到了最优的 K 值。

独家建议:
在2026年的今天,虽然算法越来越复杂,但KNN依然是理解机器学习距离度量和惰性学习的绝佳工具。而网格搜索则是你面试时展示专业度的加分项。

希望这篇硬核实战指南能为你打下坚实的基础。

如果你觉得这篇文章对你有帮助,请务必点赞、收藏,并关注我。有任何关于机器学习的问题,欢迎在评论区留言,我会一一解答。💬

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐