KNN算法导入

KNN(K-Nearest Neighbors,K最近邻)算法是机器学习中常用的分类和回归算法之一。在Python中,我们可以通过scikit-learn(简称sklearn)库来使用KNN算法。

安装步骤:

  1. 使用pip安装scikit-learn库:pip install scikit-learn
  2. 建议安装最新稳定版本,如scikit-learn 1.3+,以确保API兼容性
  3. 同时安装必要的依赖库:numpy和pandas

导入方式:

在代码中通过from sklearn.neighbors import KNeighborsClassifier导入KNN分类器,或使用KNeighborsRegressor进行回归任务。建议查阅官方API文档了解完整的参数设置和用法示例。

KNN算法选择

KNN算法是一种基于实例的学习方法,适用于以下场景:

  • 分类问题:如图像识别、文本分类、用户行为预测等
  • 回归问题:如房价预测、销量预测等连续值预测任务
  • 数据量适中:KNN在训练时计算量小,但预测时需要计算所有样本距离

算法优缺点:

  • 优点:原理简单直观、无需训练过程(惰性学习)、对异常值不敏感
  • 缺点:计算复杂度高(尤其在大数据集上)、需要合理选择k值和距离度量、对特征尺度敏感

选择KNN前,建议先评估数据特征和业务需求,确保算法适用性。

KNN算法参数详解

KNN算法的核心参数及其含义如下:

  1. n_neighbors:k值,表示要考虑的最近邻数量。较小的k值(如3-5)对噪声敏感,较大的k值(如10-20)可能过度平滑决策边界。
  2. weights:权重分配方式,可选'uniform'(所有邻居权重相等)或'distance'(距离越近权重越大)。后者能减少噪声影响,提升模型鲁棒性。
  3. algorithm:用于加速最近邻搜索的算法,包括:
    • 'brute':暴力搜索,适用于小数据集
    • 'kd_tree':KD树算法,适用于低维数据(维度<20)
    • 'ball_tree':球树算法,适用于高维数据或任意距离度量
    • 'auto':自动选择最优算法(默认)
  4. metric:距离度量方式,常见选项包括:
    • 'euclidean':欧式距离(默认),适用于连续特征
    • 'manhattan':曼哈顿距离,适用于网格状数据或特征尺度差异大时
    • 'chebyshev':切比雪夫距离,适用于棋盘距离计算
    • 'minkowski':闵可夫斯基距离,可调节参数p

数据读取与预处理

数据质量直接影响KNN模型性能,以下是关键预处理步骤:

  1. 数据读取:使用pandas的read_csv()、read_excel()等方法读取数据,确保编码正确、缺失值已处理。
  2. 特征与标签分离:将数据集分为特征矩阵X(通常为前n-1列)和标签向量y(最后一列)。例如:X = data.iloc[:, :-1],y = data.iloc[:, -1]。
  3. 数据清洗:处理缺失值(填充或删除)、异常值检测与处理、重复值去重。
  4. 特征标准化:KNN对特征尺度敏感,建议使用StandardScaler或MinMaxScaler进行标准化,使所有特征处于相近尺度。
  5. 数据集划分:使用train_test_split将数据划分为训练集和测试集(通常7:3或8:2比例),确保模型评估的客观性。

模型训练与预测

KNN模型的训练和预测流程如下:

  1. 模型初始化:创建KNeighborsClassifier实例,设置关键参数。例如:knn = KNeighborsClassifier(n_neighbors=10, weights='distance', algorithm='auto')。
  2. 模型训练:调用fit(X_train, y_train)方法,传入训练集特征和标签。KNN的"训练"实质上是存储训练数据,计算复杂度为O(1)。
  3. 预测执行:
    • 单样本预测:knn.predict([sample_features])
    • 批量预测:knn.predict(X_test)
    • 概率预测:knn.predict_proba(X_test)(返回各类别概率)
  4. 结果解释:预测结果为样本所属的类别标签,可用于分类决策、推荐系统等应用场景。

模型调优与评估

提升KNN模型性能的关键调优策略:

  1. k值调优:通过交叉验证寻找最优k值。通常k取3-20之间的奇数(避免平票),可使用网格搜索(GridSearchCV)系统测试不同k值。
  2. 距离度量选择:根据数据特性选择合适距离度量。连续特征多用欧式距离,分类特征可考虑汉明距离,混合类型特征需自定义距离函数。
  3. 特征工程:通过特征选择(如方差阈值、互信息)减少冗余特征,提升计算效率和模型性能。
  4. 评估指标:
    • 分类任务:准确率、精确率、召回率、F1分数、混淆矩阵
    • 回归任务:均方误差(MSE)、平均绝对误差(MAE)、R²分数
  5. 高级调优技术:
    • 交叉验证:k折交叉验证评估模型稳定性
    • 学习曲线:分析训练集大小对性能的影响
    • 特征缩放:测试不同标准化方法的效果
    • 集成方法:结合多个KNN模型(如通过投票机制)

通过系统化的调优流程,可以显著提升KNN模型在实际应用中的性能和鲁棒性。

练习

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

data = np.loadtxt("datingTestSet2.txt")    #读取datingTestSet2.txt文件内容,使用numpy读取
x = data[:,:-1]  #取所有行,所有列除了最后一列 

y = data[:,-1]   #取所有行,最后一列
neigh = KNeighborsClassifier(n_neighbors=1)  #尝试发现取一的正确率最高
neigh.fit(x,y)  #训练

print(neigh.predict([[50242,3.723498,0.831917]]))   #1

predict_data = [
[26052,1.441871,0.805124],    #1
[75136,13.147394,0.428964],  #1
[38344,1.669788,0.134296],   #1
[42666,13.276369,0.543880],  #3
[19739,2.816760,1.686209]   #2
]

print("多人同时预测")
print(neigh.predict(predict_data))

输出为:

[1.]
多人同时预测
[1. 1. 1. 3. 2.]

更多推荐