KNN算法-学习笔记

KNN算法-学习笔记
KNNK-Nearest NeighborsK近邻算法近朱者赤近墨者黑对于一个待预测样本在特征空间里找出距离它最近的 K 个邻居通过这 K 个邻居的类别 / 取值来决定该样本的结果分类任务K 个邻居投票少数服从多数票数最多的类别作为预测结果回归任务取 K 个邻居标签的平均值作为预测值。K 值选取K 太小容易受噪声、异常点干扰过拟合例K1完全跟着最近一个样本走容错极差。K 太大会把距离很远、无关样本纳入欠拟合极端 K 全部样本预测结果永远是训练集最多类别的常量。常用选择取奇数避免平票一般用网格搜索 / 交叉验证遍历 1~30 左右选最优 K。距离度量方式衡量样本相似度:距离度量方式衡量样本相似度设两个样本 (x(x_1,x_2…x_n))(y(y_1,y_2…y_n))欧式距离最常用KNN分类任务标签不连续投票代码 KNN(分类)代码实现思路 1.导包 2.准备数据集测试集和训练集 3.创建模型对象KNN分类模型 4.模型训练 5.模型测试 # 1.导包KNN分类模型包fromsklearn.neighborsimportKNeighborsClassifier# 准备数据集x_train[[0],[1],[2],[3]]# 训练集特征y_train[0,0,1,1]# 训练集标签x_test[[4]]# 测试集特征数据# 2.创建模型(KNN分类模型)# estimator 评估器estimatorKNeighborsClassifier(n_neighbors3)#取k值# 3.模型训练# 填充训练集特征和标签数据estimator.fit(x_train,y_train)# 4.模型预测# 给测试集特征数据给出测试标签预测结果y_preestimator.predict(x_test)print(fy_test的预测结果{y_pre})数据计算过程KNN回归任务标签连续平均值代码# 1.导包fromsklearn.neighborsimportKNeighborsRegressor# 2.准备数据集训练集和测试集# 4个训练样本每个样本3个特征x_train[[2,4,1],[5,1,3],[3,3,2],[1,5,4]]# 对应训练标签 y_train 4个分类标签y_train[0.2,0.3,0,0.5]# 测试样本 1个3列特征x_test[[4,2,2]]# 3.创建模型对象KNN回归类型estimatorKNeighborsRegressor(n_neighbors3)# 4.模型训练estimator.fit(x_train,y_train)# 5.模型预测y_preestimator.predict(x_test)print(fy_test的预测结果{y_pre})数据计算过程常用距离度量方式欧式距离欧式距离 对应维度差值平方和开平方根曼哈顿距离曼哈顿距离城市街区距离 对应维度的差值的绝对值求和切比雪夫距离切比雪夫距离 对应维度的差值的绝对值找最大值闵可夫斯基距离统一封装了三种经典距离欧式距离、曼哈顿距离、切比雪夫距离参数可调通用性极强。或者p1时曼哈顿距离一次根号可省略p2时欧氏距离二次根号p∞时切比雪夫距离特征预处理归一化数据归一化通过对原始数据进行变化把数据映射到【 minmax】默认为 0 到 1可以设置最小值和最大值的范围公式x’公式mi和mx可以设置范围比如 3 到 5 之间代码例子# 导包fromsklearn.preprocessingimportMinMaxScaler# 数据集x_train[[90,2,10,40],[60,4,15,45],[75,3,13,46]]# 创建归一化transformerMinMaxScaler(feature_range(0,1))# feature_range的默认范围是0到1# 对原数据集进行归一化处理new_x_traintransformer.fit_transform(x_train)# 打印结果print(new_x_train)标准化数据标准化通过对原始数据进行标准化转换为均值为0标准差为1的标准正态分布的数据公式σ标准差σ2sigma 方差μmu平均值代码# 导包fromsklearn.preprocessingimportStandardScaler# 数据集x_train[[90,2,10,40],[60,4,15,45],[75,3,13,46]]# 创建标准化transformerStandardScaler()# 对原数据集进行归一化处理new_x_traintransformer.fit_transform(x_train)print(new_x_train)归一化和标准化区别数据归一化如果出现异常点影响了最大值和最小值那么结果就会显然发生改变。数据标准化如果出现异常点由于具有一定数据量少量的异常点对于平均值的影响不大。交叉验证和网格搜索交叉验证CV多次拆分数据集轮流训练、验证取平均效果避免单次划分数据带来的偶然误差更真实衡量模型泛化能力常用 5 折 / 10 折。网格搜索提前列出多组超参数组合暴力遍历所有参数搭配筛选效果最好的一组超参数。二者关系网格搜索选参数时依靠交叉验证评判每组参数好坏二者搭档用于自动调参 靠谱评估模型。fromsklearn.datasetsimportload_iris# 加载鸢尾花测试集的.fromsklearn.model_selectionimporttrain_test_split,GridSearchCV# 分割训练集和测试集的, 网格搜索的fromsklearn.preprocessingimportStandardScaler# 数据标准化的fromsklearn.neighborsimportKNeighborsClassifier# KNN算法 分类对象# 1. 获取数据集.iris_dataload_iris()# 2. 数据基本处理-划分数据集.x_train,x_test,y_train,y_testtrain_test_split(iris_data.data,iris_data.target,test_size0.2,random_state22)# 3. 数据集预处理-数据标准化.transferStandardScaler()x_traintransfer.fit_transform(x_train)x_testtransfer.transform(x_test)# 4.模型训练# 4.1.创建估计器对象estimatorKNeighborsClassifier()# 4.2.使用校验验证网格搜索指定参数范围param_grid{n_neighbors:range(1,10)}# 4.3. 具体的网格搜索过程和交叉验证# 参数1估计器对象参数2参数范围参数3交叉验证的折数estimatorGridSearchCV(estimatorestimator,param_gridparam_grid,cv5)# 模型训练estimator.fit(x_train,y_train)# 4.4交叉验证网格搜索结果查看print(estimator.best_score_)# 模型在交叉验证中, 所有参数组合中的最高平均测试得分print(estimator.best_estimator_)# 最优的估计器对象.print(estimator.cv_results_)# 模型在交叉验证中的结果.print(estimator.best_params_)# 模型在交叉验证中的结果.# 5. 得到最优模型后, 对模型重新预测.estimatorKNeighborsClassifier(n_neighbors6)estimator.fit(x_train,y_train)print(f模型评估:{estimator.score(x_test,y_test)})# 因为数据量和特征的问题, 该值可能小于上述的平均测试得分.