K-近邻算法(K Nearest Neighbor
,简称KNN)。比如:根据你的“邻居”来推断出你的类别
KNN算法思想:如果一个样本在特征空间中的k 个最相似的样本
中的大多数属于某一个类别,则该样本也属于这个类别
K值
根据网格
和交叉验证
来确定
样本相似性:样本都是属于一个任务数据集的。样本距离越近则越相似。
利用K近邻算法预测电影类型
解决问题:分类问题、回归问题
若一个样本在特征空间中的 k 个最相似的样本大多数属于某一个类别,则该样本也属于这个类别
相似性:欧氏距离
计算未知样本到每一个训练样本的距离
将训练样本根据距离大小升序排列
取出距离最近的 K 个训练样本
进行多数表决,统计 K 个样本中哪个类别的样本个数最多
将未知的样本归属到出现次数最多的类别
计算未知样本到每一个训练样本的距离
将训练样本根据距离大小升序排列
取出距离最近的 K 个训练样本
把这个 K 个样本的目标值计算其平均值
作为将未知的样本预测的值
一个样本最相似的k个样本中的大多数属于某一个类别, 则该样本也属于这个类别
计算未知样本到每个训练样本的距离
将训练样本根据距离大小升序排列
取出距离最近的K个训练样本
进行多数表决, 统计k个样本中哪个类别的样本个数最多
将未知的样本归属到出现次数最多的类别
计算未知样本到每个训练样本的距离
将训练样本根据距离大小升序排列
取出距离最近的k个样本
把这k个样本的目标值计算平均值
平均值就是这个未知样本的预测值
K值过小, 模型过于复杂, 造成过拟合(训练集表现很好, 测试集表现不好)
K值过大, 模型过于简单, 造成欠拟合(训练集和测试集的表现都不好)
类似于: 近朱者赤近墨者黑
导包.
创建 (分类)算法对象.
准备 训练集数据, 即: 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