ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

【机器学习入门】K 近邻 (KNN) 算法超详细教程 —— 从原理到 sklearn 双案例教学

【机器学习入门】K 近邻 (KNN) 算法超详细教程 —— 从原理到 sklearn 双案例教学 文章目录前言一、KNN 算法核心原理1.1 算法思想1.2 关键要素1.3 算法步骤二、案例一个人性格配对效果预测2.1 数据集介绍2.2 数据可视化3D 散点图2.3 KNN 建模与预测三、案例二鸢尾花分类识别3.1 数据集介绍3.2 数据预处理Z-Score 标准化3.3 完整代码实现总结前言K 近邻K-Nearest Neighbors简称 KNN算法是机器学习中最经典、最易理解的分类算法之一核心思想就是 “近朱者赤近墨者黑”—— 一个样本的类别由它周围最近的 K 个邻居投票决定。本文从原理出发带你用 Python scikit-learn 完整实现案例鸢尾花分类识别。一、KNN 算法核心原理1.1 算法思想KNN 属于有监督学习的分类算法逻辑非常直观给定一个待预测的新样本在训练集中找到与它距离最近的 K 个样本这 K 个样本中出现次数最多的类别就是新样本的预测类别。1.2 关键要素K 值选择K 太小容易受噪声影响过拟合K 太大容易忽略样本差异欠拟合通常通过交叉验证选择最优 K 值。距离度量常用欧氏距离计算样本间相似度公式如下d ( x , y ) ∑ i 1 n ( x i − y i ) 2 d(x,y) \sqrt{\sum_{i1}^{n}(x_i - y_i)^2}d(x,y)i1∑n​(xi​−yi​)2​特征标准化不同特征量纲差异大时必须先做标准化否则数值大的特征会主导距离计算。1.3 算法步骤计算待预测样本与所有训练样本的距离按距离从小到大排序选取距离最小的前 K 个样本统计 K 个样本中各类别的出现次数出现次数最多的类别即为预测结果二、案例一个人性格配对效果预测2.1 数据集介绍使用数据集datingTestSet2.txt共 1000 条样本包含 3 个特征和 1 个标签第 1 列 : 每年旅行里程数第 2 列 : 玩游戏所耗时间百分比第 3 列 : 每周零食消耗数量第 4 列标签人物类型 1 好、2 中、3 差2.2 数据可视化3D 散点图先对数据做三维可视化直观观察三类人群的分布importmatplotlib.pyplotaspltimportnumpyasnp# 加载数据datanp.loadtxt(datingTestSet2.txt)data_1data[data[:,-1]1]adata[:,-1]bdata[a1]data_2data[data[:,-1]2]data_3data[data[:,-1]3]# 绘制3D散点图figplt.figure()axplt.axes(projection3d)ax.scatter(data_1[:,0],data_1[:,1],zsdata_1[:,2],c#00DDAA,markero)ax.scatter(data_2[:,0],data_2[:,1],zsdata_2[:,2],c#FF5511,marker^)ax.scatter(data_3[:,0],data_3[:,1],zsdata_3[:,2],c#000011,marker)ax.set(xlabelXaxes,ylabelYaxes,zlabelZaxes)plt.show()从图中可以清晰看到三类人群在特征空间中呈现明显的聚类分布非常适合用 KNN 做分类。2.3 KNN 建模与预测使用 scikit-learn 的KNeighborsClassifier快速搭建模型importnumpyasnpfromsklearn.neighborsimportKNeighborsClassifier# 加载数据datanp.loadtxt(datingTestSet2.txt)Xdata[:,:-1]# 特征前三列ydata[:,-1]# 标签最后一列# 创建KNN模型K25knnKNeighborsClassifier(n_neighbors25)knn.fit(X,y)# 单样本预测resultknn.predict([[14459,4.458902,0.268444]])print(单样本预测类别,result)# 批量预测predict_datas[[14254,5.946014,1.614244],[22220,5.297865,0.638306],[0,5.757140,1.062373],[16721,0.000000,0.242778]]print(批量预测结果,knn.predict(predict_datas))三、案例二鸢尾花分类识别3.1 数据集介绍使用鸢尾花数据集包含花的四个形态特征和对应的类别标签萼片长 (cm) 花萼的长度萼片宽 (cm) 花萼的宽度花瓣长 (cm) 花瓣的长度花瓣宽 (cm) 花瓣的宽度类型_num 类别标签0 / 1 二分类训练集66 条样本测试集9 条样本3.2 数据预处理Z-Score 标准化由于四个特征的数值范围不同需要先做标准化处理让每个特征均值为 0、方差为 1避免数值大的特征主导距离计算。Z-Score 标准化公式x ′ x − μ σ x \frac{x - \mu}{\sigma}x′σx−μ​其中μ \muμ是均值σ \sigmaσ是标准差。3.3 完整代码实现importpandasaspd# 1. 加载数据 train_datapd.read_excel(鸢尾花训练数据.xlsx)test_datapd.read_excel(鸢尾花测试数据.xlsx)train_Xtrain_data[[萼片长(cm),萼片宽(cm),花瓣长(cm),花瓣宽(cm)]]train_ytrain_data[类型_num]# 2. Z-Score标准化 fromsklearn.preprocessingimportscale datapd.DataFrame()data[萼片长标准化]scale(train_X[萼片长(cm)])data[萼片宽标准化]scale(train_X[萼片宽(cm)])data[花瓣长标准化]scale(train_X[花瓣长(cm)])data[花瓣宽标准化]scale(train_X[花瓣宽(cm)])test_Xtest_data[[萼片长(cm),萼片宽(cm),花瓣长(cm),花瓣宽(cm)]]test_ytest_data[类型_num]data_testpd.DataFrame()data_test[萼片长标准化]scale(test_X[萼片长(cm)])data_test[萼片宽标准化]scale(test_X[萼片宽(cm)])data_test[花瓣长标准化]scale(test_X[花瓣长(cm)])data_test[花瓣宽标准化]scale(test_X[花瓣宽(cm)])# 3. 构建KNN模型 fromsklearn.neighborsimportKNeighborsClassifier knnKNeighborsClassifier(n_neighbors3)knn.fit(data,train_y)train_predictedknn.predict(data)score_trainknn.score(data,train_y)# 4. 模型评估 test_predictedknn.predict(data_test)score_testknn.score(data_test,test_y)print(score_test)# 0.8888888888888888代码说明数据加载用pandas.read_excel()读取 Excel 训练集和测试集特征提取选取四个花的形态特征作为输入类型标签作为输出标准化使用sklearn.preprocessing.scale()做 Z-Score 标准化模型训练KNeighborsClassifier(n_neighbors3)创建 K3 的 KNN 分类器模型评估score()方法直接计算准确率对比训练集和测试集效果总结KNN 核心是 “近朱者赤”通过 K 个最近邻居投票决定类别距离计算 K 值选择 特征标准化 是 KNN 的三大关键特征量纲差异大时标准化是必不可少的预处理步骤scikit-learn 的KNeighborsClassifier可以快速搭建 KNN 模型KNN 适合小数据集、低维特征的分类场景大数据集下效率较低
返回列表