一. KNN简介
KNN思想
K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别
KNN算法思想:如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别
K值根据网格和交叉验证来确定
样本相似性:样本都是属于一个任务数据集的。样本距离越近则越相似。
利用K近邻算法预测电影类型
K值的选择
KNN的应用方式
解决问题:分类问题、回归问题
算法思想
若一个样本在特征空间中的 k 个最相似的样本大多数属于某一个类别,则该样本也属于这个类别
相似性:欧氏距离
分类问题的处理流程

-
计算未知样本到每一个训练样本的距离
-
将训练样本根据距离大小升序排列
-
取出距离最近的 K 个训练样本
-
进行多数表决,统计 K 个样本中哪个类别的样本个数最多
-
将未知的样本归属到出现次数最多的类别
回归问题的处理流程

-
计算未知样本到每一个训练样本的距离
-
将训练样本根据距离大小升序排列
-
取出距离最近的 K 个训练样本
-
把这个 K 个样本的目标值计算其平均值
-
作为将未知的样本预测的值
总结
KNN概念: K Nearest Neighbor
一个样本最相似的k个样本中的大多数属于某一个类别, 则该样本也属于这个类别
KNN分类流程
-
计算未知样本到每个训练样本的距离
-
将训练样本根据距离大小升序排列
-
取出距离最近的K个训练样本
-
进行多数表决,
统计k个样本中哪个类别的样本个数最多 -
将未知的样本归属到出现次数最多的类别
KNN回归流程
-
计算未知样本到每个训练样本的距离
-
将训练样本根据距离大小升序排列
-
取出距离最近的k个样本
-
把这k个样本的目标值计算平均值 -
平均值就是这个未知样本的预测值
K值的选择
K值过小, 模型过于复杂, 造成过拟合(训练集表现很好, 测试集表现不好)
K值过大, 模型过于简单, 造成欠拟合(训练集和测试集的表现都不好)

二. KNN算法API
KNN算法介绍
概述
类似于: 近朱者赤近墨者黑
流程
-
导包.
-
创建 (分类)算法对象.
-
准备 训练集数据, 即: x_train, y_train
-
训练模型 => 机器学习.
-
模型预测(评估)
-
打印模型预测的结果.
前提
环境中已经安装了 scikit-learn 包
分类问题演示
原理
先计算样本数据 到 训练集每个记录的 欧式距离, 然后根据欧式距离升序排列, 取出最近的 K个 样本值. 然后进行 投票, 哪个分类多, 则该分类的标签, 就是: 预测值的标签.
代码演示
模块: KNeighborsClassifier
# 1. 导包.
from sklearn.neighbors import KNeighborsClassifier
# 2. 创建 (分类)算法对象.
# estimator 单词的意思是 => 估量值, 评估值...
# Neighbors 单词的意思是 => 近邻(邻居)...
# estimator = KNeighborsClassifier(n_neighbors=1) # 即: k=1, 找最近的哪个样本.
estimator = KNeighborsClassifier(n_neighbors=3) # 即: k=1, 找最近的哪个样本.
# 3. 准备 训练集数据, 即: x_train, y_train
x_train = [[0], [1], [2], [3]]
y_train = [0, 0, 1, 1] # 分类 => 2分类
# 4. 训练模型 => 机器学习.
estimator.fit(x_train, y_train) # fitting => 拟合
# 5. 模型预测(评估)
my_result = estimator.predict([[4]])
# 6. 打印模型预测的结果.
print(f'预估值: {my_result}')
注:
上述代码中的y_train= [0, 0, 0, 1]时: 输出评估结果为0
上述代码中的estimator = KNeighborsClassifier(n_neighbors=2),
y_train= [0, 0, 0, 1] 时:
输出评估结果为0(选择较为简单的模型, 此案例中类似于排序后的第一个)
回归问题演示
原理
先计算样本数据 到 训练集每个记录的 欧式距离, 然后根据欧式距离升序排列, 取出最近的 K个样本值. 然后 计算这些样本值的平均值, 将平均值作为该分类的标签, 即: 预测值的标签.
代码演示
模块: KNeighborsRegressor
# 1. 导包. # from sklearn.neighbors import KNeighborsRegressor # from sklearn.neighbors import KNeighborsClassifier # from sklearn.neighbors import KNeighborsRegressor, KNeighborsClassifier from sklearn.neighbors import KNeighborsRegressor # 2. 创建 (回归)算法对象. # 细节: 因为k值是手动传入的, 所有手动传入的值都称之为: 超参数. estimato






1万+

被折叠的 条评论
为什么被折叠?



