2. 机器学习 - KNN算法
2. 机器学习 - KNN算法
1)是什么
KNN(K-Nearest Neighbors,K近邻)是一种简单直观的监督学习算法,主要用于分类和回归任务。其基本思想是:给定一个待预测样本,找到训练集中与其最相似的K个邻居,然后根据这K个邻居的标签或数值来决定该样本的类别或输出值。距离度量通常采用欧氏距离、曼哈顿距离等。
🎯 小结: KNN是一种基于“近邻相似性”的懒惰学习算法,通过查找最近的K个样本进行预测。
2)为什么
KNN之所以有效,是因为它基于一个合理的假设:相似的输入往往对应相似的输出。在数据分布较为均匀或局部结构明显时,这种“就近原则”能很好地捕捉模式。此外,KNN无需训练过程,直接利用原始数据进行预测,实现简单且易于理解。
💡 小结: KNN依赖“相似性假设”,适用于局部规律明显的场景,且无需复杂模型训练。
3)什么时候用
KNN适合以下情况:
- 数据集较小或中等规模;
- 特征数量不多,维度较低;
- 样本之间存在清晰的局部结构;
- 分类边界不规则或非线性;
- 需要快速原型验证或解释性强的模型。
📈 小结: 当数据维度低、样本分布局部聚集且需要快速部署时,KNN是一个理想选择。
4)什么时候不用
KNN存在一些局限性,不适合以下场景:
- 数据维度高(维数灾难);
- 训练集非常大(查询效率低);
- 特征之间量纲差异大(需标准化);
- 实时性要求高(每次预测都要遍历所有训练样本);
- 类别不平衡严重(可能偏向多数类)。
🚫 小结: 高维、大数据量或实时性要求高的场景下,KNN效率低下,应避免使用。
5)总结
KNN是一种简单但强大的基础算法,具有无需训练、易于理解和实现的优点。它特别适合小规模、低维的数据集,尤其在分类任务中表现良好。然而,其计算开销随数据量增长而上升,且对噪声和异常值敏感。因此,在实际应用中需结合数据特点合理选用,并配合特征缩放、降维等预处理手段优化性能。
📌 小结: KNN是“懒人算法”的代表——简单实用但需权衡效率与精度,适合作为入门和对比基准模型。
概念
2.1 距离计算方式
💡 在聚类、分类、回归等任务中,衡量样本间“相似度”或“差异度”的关键手段是距离度量。不同的距离公式适用于不同场景。
2.1.1 曼哈顿距离
- 特点:也称“城市街区距离”,只允许沿坐标轴移动。
- 适用场景:高维稀疏数据、特征具有明显边界结构。
- 优点:对异常值不敏感;计算简单。
- 缺点:忽略变量间的几何关系。
📌 小结:曼哈顿距离适合网格状空间或带约束的数据,尤其在L1正则化中常见应用。
2.1.2 欧式距离
- 特点:最直观的距离定义,基于勾股定理。
- 适用场景:连续型数值特征、低维空间。
- 优点:符合人类直觉;广泛用于KNN、K-Means等算法。
- 缺点:受尺度影响大;在高维空间易出现“维度灾难”。
📌 小结: 欧式距离是标准的几何距离,但需配合归一化使用以避免偏差。
2.1.3 切比雪夫距离
- 特点:取各维度差值的最大值。
- 适用场景:棋盘上国王移动路径、最大误差控制。
- 优点:关注最坏情况下的偏差。
-缺点:忽略其他维度的信息。
📌 小结:切比雪夫距离强调“最远方向”,适合对极端值敏感的任务。
2.1.4 闵可斯基距离
- 当 p=1 → 曼哈顿距离
- 当 p=2 → 欧式距离
- 当 p→∞ → 切比雪夫距离
- 灵活性强:可通过调整 p 控制距离行为。
- 应用场景:通用距离函数,常用于聚类和相似度分析。
📌 小结:闵可夫斯基距离是多种距离的统一形式,可根据需求灵活调节参数 p。
2.2 分类与回归问题解决步骤
通用流程:
- 明确任务类型:分类 vs 回归
- 数据收集与清洗
- 特征工程(选择/构造/转换)
- 模型选择
- 训练模型
- 验证与调参
- 评估与部署
2.3 归一化与标准化(特征预处理)
🧹 特征缩放是提升模型性能的重要步骤,防止某些特征因数值范围过大而主导模型决策。
2.3.1 归一化
- 输出范围:[0, 1]
- 常见方法:Min-Max Scaling
- 适用场景:数据分布已知、无异常值、需要固定区间
📌 小结:归一化将数据压缩到指定区间,适用于神经网络、图像处理等领域。
2.3.2 标准化
- 输出均值为 0,标准差为 1
- 常见方法:Z-score 标准化
- 适用场景:存在异常值、服从正态分布假设、线性模型(如SVM、LR)
📌 小结:标准化消除量纲影响,使数据更接近正态分布,利于统计模型收敛。
2.4 交叉验证和网格搜索(超参数选择)
⚙️ 超参数直接影响模型表现,合理选择至关重要。交叉验证与网格搜索是经典组合策略。
2.4.1 交叉验证
- 目的:评估模型泛化能力,减少过拟合风险
- 常用方法:
- K折交叉验证(K-Fold CV)
- 留一法(Leave-One-Out)
- 时间序列分割(TimeSeriesSplit)
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
📌 小结:交叉验证提供稳定可靠的模型评估,避免单次划分带来的偶然性。
2.4.2 网格搜索
- 目的:自动寻找最优超参数组合
- 实现方式:遍历所有可能参数组合,结合CV选出最佳模型
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
grid_search = GridSearchCV(SVC(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
📌 小结:网格搜索虽耗时,但能系统探索参数空间,适合小规模参数集。
2.5 模型评分
📊 模型性能需要用量化指标来衡量,不同任务对应不同评价标准。
2.5.1 model.score()
- 作用:返回模型在给定数据上的得分
- 分类任务:默认返回准确率(accuracy)
- 回归任务:默认返回 R² 分数
score = model.score(X_test, y_test)
print(f"R² Score: {score}")
📌 小结: model.score() 是快速评估的便捷工具,但需注意其默认指标是否合适。
2.5.2 accuracy_score()
- 作用:专门计算分类任务中的准确率
- 公式:正确预测样本数 / 总样本数
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_true, y_pred)
- 注意事项:在类别不平衡时不可靠,建议搭配 F1、AUC 等指标
📌 小结: accuracy_score() 是最直观的分类指标,但在非平衡数据中需谨慎使用。
2.6 总结
| 主题 | 关键点 | 推荐使用场景 |
|---|---|---|
| 距离计算 | 曼哈顿、欧式、切比雪夫、闵可夫斯基 | 聚类、相似度匹配 |
| 特征预处理 | 归一化 vs 标准化 | 数据缩放前必做步骤 |
| 交叉验证 | K折CV、时间序列划分 | 防止过拟合,提高稳定性 |
| 网格搜索 | 参数自动化调优 | 小参数空间,追求最优解 |
| 模型评分 | .score() 和 accuracy_score() | 快速评估模型效果 |
🎯 最终建议:始终先进行特征预处理,再用交叉验证+网格搜索优化模型,最后多角度评估性能。
更多推荐
所有评论(0)