返回 导航

Python

hangge.com

Python - 机器学习算法库Scikit-Leran使用详解4(KNN最邻近分类算法)

作者:hangge | 2022-08-29 08:10

五、KNN 最邻近分类算法

1,什么是 KNN 算法?

(1)K 最近邻分类算法,简称 KNNK-Nearest-Neighbor),它是有监督学习算法的一种。该算法的思路就是如果一个未知样本最近的 K 个样本中的大多数属于某一个类别,则该样本也属于这个类别。

(2)由于考虑的数据点数量由 K 值确定。因此 K 值是算法的核心,选择最优 K 值是建立一个合理、精确的 knn 模型的必要条件:
  • 如果 k 值太低,则模型会变得过于具体,不能很好地泛化。它对噪音也很敏感。该模型在训练组上实现了很高的精度,但对于新的、以前看不到的数据点,该模型的预测能力较差。因此,我们很可能最终得到一个过拟合的模型。
  • 如果 k 选择得太大,模型就会变得过于泛化,无法准确预测训练和测试集中的数据点。这种情况被称为欠拟合。

2,一个简单的 KNN 算法样例

(1)下面对 Sklearn 自带的葡萄酒数据集进行 KNN 算法分类预测,通过调用 Sklearn 库提供的 KNeighborsClassifier 实现 KNN 分类算法。
#导入 sklearn 提供的葡萄酒数据
from sklearn.datasets import load_wine
#导入 sklearn 提供的KNN分类算法
from sklearn.neighbors import KNeighborsClassifier
#导入skleran 提供的分割数据集的方法
from sklearn.model_selection import train_test_split
#导入pandas
import pandas as pd
 
#加载数据集
wine = load_wine()
#分割数据集训练集,测试集
x_train,x_test,y_train,y_test=train_test_split(wine['data'],wine['target'],random_state=0)
#构建knn分类模型,并指定 k 值
model=KNeighborsClassifier(n_neighbors=10)
#训练模型
model.fit(x_train,y_train)
#训练后用测试集对模型进行评分
print("模型评分:",model.score(x_test,y_test))
print('-----------------------------------------------------')
 
print('测试集前5条数据特征值:')
print(pd.DataFrame(x_test).head(5))
print('-----------------------------------------------------')
print('测试集前5条数据目标值:')
print(pd.DataFrame(y_test).head(5))
print('-----------------------------------------------------')
#使用模型预测
y_predict=model.predict(x_test)
print('使用模型预测测试集前5条数据的目标值:')
print(pd.DataFrame(y_predict).head(5))

(2)运行结果如下:

3,权重设置

(1)最普遍的 KNN 算法无论距离如何,权重都一样。KNeighborsClassifier 方法还有个 weights 参数可以设置如何分配权重,下面样例让距离更近的点更加重要。
weights 参数说明:
  • uniform:不管远近权重都一样,就是最普通的 KNN 算法的形式。
  • distance:权重和距离成反比,距离预测目标越近具有越高的权重。
  • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。
#导入 sklearn 提供的葡萄酒数据
from sklearn.datasets import load_wine
#导入 sklearn 提供的KNN分类算法
from sklearn.neighbors import KNeighborsClassifier
#导入skleran 提供的分割数据集的方法
from sklearn.model_selection import train_test_split
#导入pandas
import pandas as pd
  
#加载数据集
wine = load_wine()
#分割数据集训练集,测试集
x_train,x_test,y_train,y_test=train_test_split(wine['data'],wine['target'],random_state=0)
#构建knn分类模型,并指定 k 值
model=KNeighborsClassifier(n_neighbors=10, weights='distance')
#训练模型
model.fit(x_train,y_train)
#训练后用测试集对模型进行评分
print("模型评分:",model.score(x_test,y_test))
print('-----------------------------------------------------')
  
print('测试集前5条数据特征值:')
print(pd.DataFrame(x_test).head(5))
print('-----------------------------------------------------')
print('测试集前5条数据目标值:')
print(pd.DataFrame(y_test).head(5))
print('-----------------------------------------------------')
#使用模型预测
y_predict=model.predict(x_test)
print('使用模型预测测试集前5条数据的目标值:')
print(pd.DataFrame(y_predict).head(5))

(2)运行结果如下:
评论

全部评论(0)

回到顶部