机器学习-KNN算法的训练
KNN算法导入
KNN(K-Nearest Neighbors,K最近邻)算法是机器学习中常用的分类和回归算法之一。在Python中,我们可以通过scikit-learn(简称sklearn)库来使用KNN算法。
安装步骤:
- 使用pip安装scikit-learn库:
pip install scikit-learn - 建议安装最新稳定版本,如scikit-learn 1.3+,以确保API兼容性
- 同时安装必要的依赖库:numpy和pandas
导入方式:
在代码中通过from sklearn.neighbors import KNeighborsClassifier导入KNN分类器,或使用KNeighborsRegressor进行回归任务。建议查阅官方API文档了解完整的参数设置和用法示例。
KNN算法选择
KNN算法是一种基于实例的学习方法,适用于以下场景:
- 分类问题:如图像识别、文本分类、用户行为预测等
- 回归问题:如房价预测、销量预测等连续值预测任务
- 数据量适中:KNN在训练时计算量小,但预测时需要计算所有样本距离
算法优缺点:
- 优点:原理简单直观、无需训练过程(惰性学习)、对异常值不敏感
- 缺点:计算复杂度高(尤其在大数据集上)、需要合理选择k值和距离度量、对特征尺度敏感
选择KNN前,建议先评估数据特征和业务需求,确保算法适用性。
KNN算法参数详解
KNN算法的核心参数及其含义如下:
- n_neighbors:k值,表示要考虑的最近邻数量。较小的k值(如3-5)对噪声敏感,较大的k值(如10-20)可能过度平滑决策边界。
- weights:权重分配方式,可选'uniform'(所有邻居权重相等)或'distance'(距离越近权重越大)。后者能减少噪声影响,提升模型鲁棒性。
- algorithm:用于加速最近邻搜索的算法,包括:
- 'brute':暴力搜索,适用于小数据集
- 'kd_tree':KD树算法,适用于低维数据(维度<20)
- 'ball_tree':球树算法,适用于高维数据或任意距离度量
- 'auto':自动选择最优算法(默认)
- metric:距离度量方式,常见选项包括:
- 'euclidean':欧式距离(默认),适用于连续特征
- 'manhattan':曼哈顿距离,适用于网格状数据或特征尺度差异大时
- 'chebyshev':切比雪夫距离,适用于棋盘距离计算
- 'minkowski':闵可夫斯基距离,可调节参数p
数据读取与预处理
数据质量直接影响KNN模型性能,以下是关键预处理步骤:
- 数据读取:使用pandas的
read_csv()、read_excel()等方法读取数据,确保编码正确、缺失值已处理。 - 特征与标签分离:将数据集分为特征矩阵X(通常为前n-1列)和标签向量y(最后一列)。例如:
X = data.iloc[:, :-1],y = data.iloc[:, -1]。 - 数据清洗:处理缺失值(填充或删除)、异常值检测与处理、重复值去重。
- 特征标准化:KNN对特征尺度敏感,建议使用StandardScaler或MinMaxScaler进行标准化,使所有特征处于相近尺度。
- 数据集划分:使用train_test_split将数据划分为训练集和测试集(通常7:3或8:2比例),确保模型评估的客观性。
模型训练与预测
KNN模型的训练和预测流程如下:
- 模型初始化:创建KNeighborsClassifier实例,设置关键参数。例如:
knn = KNeighborsClassifier(n_neighbors=10, weights='distance', algorithm='auto')。 - 模型训练:调用
fit(X_train, y_train)方法,传入训练集特征和标签。KNN的"训练"实质上是存储训练数据,计算复杂度为O(1)。 - 预测执行:
- 单样本预测:
knn.predict([sample_features]) - 批量预测:
knn.predict(X_test) - 概率预测:
knn.predict_proba(X_test)(返回各类别概率)
- 单样本预测:
- 结果解释:预测结果为样本所属的类别标签,可用于分类决策、推荐系统等应用场景。
模型调优与评估
提升KNN模型性能的关键调优策略:
- k值调优:通过交叉验证寻找最优k值。通常k取3-20之间的奇数(避免平票),可使用网格搜索(GridSearchCV)系统测试不同k值。
- 距离度量选择:根据数据特性选择合适距离度量。连续特征多用欧式距离,分类特征可考虑汉明距离,混合类型特征需自定义距离函数。
- 特征工程:通过特征选择(如方差阈值、互信息)减少冗余特征,提升计算效率和模型性能。
- 评估指标:
- 分类任务:准确率、精确率、召回率、F1分数、混淆矩阵
- 回归任务:均方误差(MSE)、平均绝对误差(MAE)、R²分数
- 高级调优技术:
- 交叉验证: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.]
更多推荐

所有评论(0)