
摘要KNNK 近邻是一种基于样本相似性的惰性学习算法通过多数表决分类或取平均值回归完成预测。本文系统梳理了 KNN 的核心概念、K 值选择、分类与回归流程、sklearn API、特征预处理归一化与标准化、交叉验证与网格搜索调参、分类评估指标混淆矩阵、精确率、召回率、F1并给出鸢尾花分类的完整案例与核心考点速记。一、KNN 算法简介1.1 基本概念KNNK Nearest NeighborK 近邻算法根据你的“邻居”来推断出你的类别算法思想如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别则该样本也属于这个类别1.2 样本相似性样本都属于一个任务数据集样本距离越近则越相似常用距离度量欧氏距离1.3 K 值选择重点K 值影响风险K 过小用较小邻域中的训练实例进行预测模型变复杂容易过拟合易受异常点影响K 过大用较大邻域中的训练实例进行预测模型变简单容易欠拟合受样本均衡影响K N训练样本数无论输入什么只按训练集中最多的类别预测忽略数据中其他重要信息实际工作中经常使用交叉验证来选取最优 K 值二、KNN 算法流程2.1 分类流程计算未知样本到每一个训练样本的距离将训练样本根据距离大小升序排列取出距离最近的K个训练样本进行多数表决统计 K 个样本中哪个类别样本数最多将未知样本归属到出现次数最多的类别2.2 回归流程计算未知样本到每一个训练样本的距离将训练样本根据距离大小升序排列取出距离最近的 K 个训练样本把这 K 个样本的目标值计算平均值将平均值作为未知样本的预测值三、KNN 算法 API3.1 分类 APIfromsklearn.neighborsimportKNeighborsClassifier estimatorKNeighborsClassifier(n_neighbors5)# n_neighbors 即 K 值默认 5estimator.fit(X,y)estimator.predict([[4]])3.2 回归 APIfromsklearn.neighborsimportKNeighborsRegressor estimatorKNeighborsRegressor(n_neighbors5)estimator.fit(X,y)estimator.predict([[3,11,10]])四、特征预处理4.1 为什么需要归一化和标准化特征的单位或大小相差较大或某特征方差比其他特征大出几个数量级容易支配目标结果使模型无法学习到其他特征。4.2 归一化Min-Max Normalization将数据映射到[mi, mx]默认[0, 1]之间公式X (X - min) / (max - min)fromsklearn.preprocessingimportMinMaxScaler transformerMinMaxScaler(feature_range(0,1))datatransformer.fit_transform(X)4.3 标准化Z-Score Standardization将数据转换为均值为 0标准差为 1的标准正态分布公式X (X - mean) / σfromsklearn.preprocessingimportStandardScaler transformerStandardScaler()datatransformer.fit_transform(X)# 属性: transformer.mean_均值 transformer.var_方差4.4 归一化 vs 标准化对比项归一化标准化异常点影响影响最大值最小值鲁棒性差少量异常点对均值影响不大适用场景传统精确小数据场景现代嘈杂大数据场景推荐APIMinMaxScalerStandardScaler4.5 正态分布补充也叫高斯分布、钟形分布记作N(μ, σ)μ 决定位置σ 决定分布幅度当μ0, σ1时为标准正态分布3σ 法则68-95-99.7 法则±1σ 内 68%±2σ 内 95%±3σ 内 99.7%五、交叉验证与网格搜索5.1 交叉验证Cross Validation是什么一种数据集的分割方法将训练集划分为 n 份拿一份做验证集、其他 n-1 份做训练集流程以 cv4 为例将训练集分为 4 份第一次第 1 份做验证集其余做训练集第二次第 2 份做验证集其余做训练集……以此类推总共训练 4 次、评估 4 次取 4 次评估的平均值作为模型得分目的得到更加准确可信的模型评分5.2 网格搜索Grid Search是什么寻找最优超参数的工具将若干参数传递给网格搜索对象自动完成不同超参数的组合、模型训练、模型评估返回最优超参数5.3 交叉验证 网格搜索组合解决的问题交叉验证模型的数据输入问题数据集划分得到更可靠的模型网格搜索超参数的组合问题两者组合形成一个完整的模型参数调优方案。5.4 APIfromsklearn.model_selectionimportGridSearchCV estimatorGridSearchCV(estimator,param_grid{n_neighbors:[1,3,5,7]},cv5)estimator.fit(x_train,y_train)# 结果查看estimator.best_score_# 最佳分数estimator.best_estimator_# 最佳估计器estimator.best_params_# 最佳参数estimator.cv_results_# 交叉验证结果六、分类问题评估6.1 为什么需要更多指标单纯预测准确率不能满足所有场景需求。例如癌症检测场景更关注癌症患者有没有被全部检测出来。6.2 混淆矩阵Confusion Matrix预测为正例预测为反例真实为正例TP真正例FN伪反例真实为反例FP伪正例TN真反例四个指标定义TPTrue Positive真实为正例被预测为正例FNFalse Negative真实为正例被预测为反例FPFalse Positive真实为反例被预测为正例TNTrue Negative真实为反例被预测为反例关系TP FN FP TN 总样本数量6.3 精确率Precision定义预测为正例的样本中实际为正例的比例公式Precision TP / (TP FP)6.4 召回率Recall / 查全率定义实际为正例的样本中被预测为正例的比例公式Recall TP / (TP FN)6.5 F1-Score定义精确率和召回率的调和平均数公式F1 2 × (Precision × Recall) / (Precision Recall)综合反映模型的精确率和召回率6.6 评估 APIfromsklearn.metricsimportconfusion_matrix,precision_score,recall_score,f1_score confusion_matrix(y_true,y_pred,labelslabels)# 混淆矩阵precision_score(y_true,y_pred,pos_label恶性)# 精确率recall_score(y_true,y_pred,pos_label恶性)# 召回率f1_score(y_true,y_pred,pos_label恶性)# F1 值七、鸢尾花分类案例流程1 获取数据集 → 2 数据基本处理划分→ 3 特征工程标准化→ 4 模型训练 → 5 模型评估 → 6 模型预测fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.neighborsimportKNeighborsClassifier# 1 获取数据mydatasetload_iris()# 2 数据划分x_train,x_test,y_train,y_testtrain_test_split(mydataset.data,mydataset.target,test_size0.2,random_state22)# 3 标准化transferStandardScaler()x_traintransfer.fit_transform(x_train)x_testtransfer.transform(x_test)# 4 模型训练estimatorKNeighborsClassifier(n_neighbors3)estimator.fit(x_train,y_train)# 5 模型评估myscoreestimator.score(x_test,y_test)附核心考点速记KNN 思想k 个最相似样本中多数属于某类则该样本也属于该类相似性度量欧氏距离K 值过小→过拟合过大→欠拟合分类流程算距离→排序→取 K 个→多数表决回归流程算距离→排序→取 K 个→取平均值归一化 vs 标准化归一化鲁棒性差小数据标准化抗异常点大数据推荐交叉验证训练集分 n 份轮流做验证得到更可靠评分网格搜索自动搜索最优超参数组合混淆矩阵TP / FN / FP / TN 四个指标精确率TP/(TPFP)预测为正例中真实为正例的比例召回率TP/(TPFN)实际为正例中被预测为正例的比例F1精确率和召回率的调和平均数