1.1K-近邻算法简介
(1)K-近邻算法(KNN)概念
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中大多数属于某一个类别,则该样本也属于这个类别。
距离公式:两个样本的距离可以通过如下公式计算,又叫欧式距离。
二维平面点a(x1,y1)与b(x2,y2)之间的欧式距离:
三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧式距离:
n维空间点a(x11,x12,...x1n)与b(x21,x22...x2n)间的欧式距离(两个n维向量):
(2)K-近邻算法原理
<1>. 从训练集合中获取K个离待预测样本距离最近的样本数据;
<2>. 根据获取得到的K个样本数据来预测当前待预测样本的目标属性值。
(3)KNN三要素
<1>.K值的选择:对于K值的选择,一般根据样本分布选择一个较小的值,然后通过交叉
验证来选择一个比较合适的最终值;当选择比较小的K值的时候,表示使用较小领域
中的样本进行预测,训练误差会减小,但是会导致模型变得复杂,容易过拟合;当
选择较大的K值的时候,表示使用较大领域中的样本进行预测,训练误差会增大,同
时会使模型变得简单,容易导致欠拟合;
<2>.距离的度量:一般使用欧氏距离(欧几里得距离);
<3>.决策规则:在分类模型中,主要使用多数表决法或者加权多数表决法;在回归模型
中,主要使用平均值法或者加权平均值法。
1.2KNN算法实现方式
KNN算法的重点在于找出K个最邻近的点,主要方式有以下几种:
<1>.蛮力实现(brute):计算预测样本到所有训练集样本的距离,然后选择最小的k个距
离即可得到K个最邻近点。缺点在于当特征数比较多、样本数比较多的时候,算法的
执行效率比较低;
<2>.KD树(kd_tree):KD树算法中,首先是对训练数据进行建模,构建KD树,然后再
根据建好的模型来获取邻近样本数据。
除此之外,还有一些从KD_Tree修改后的求解最邻近点的算法,比如:Ball Tree、
BBF Tree、MVP Tree等。
1.3案例:鸢尾花种类预测-流程实现
iris.csv_免费高速下载|百度网盘-分享无限制 (baidu.com)数据集
(1).K-近邻算法API
(2).案例:鸢尾花种类预测
数据集介绍
实例数量:150(三类各有50个)
属性数量:4(数值型,数值型,帮助预测的属性和类)
代码过程
第一步:引入所需库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
第二步:划分测试集占20%
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)
第三步:n_neighbors=5
KNeighborsClassifier(n_neighbors=5)
第四步:评价模型的准确率
KNN.fit(x_train, y_train)
# 训练集准确率
train_score = KNN.score(x_train, y_train)
# 测试集准确率
test_score = KNN.score(x_test, y_test)
第五步:使用模型预测未知种类的鸢尾花
#待预测数据:X1=[[1.5 , 3 , 5.8 , 2.2], [6.2 , 2.9 , 4.3 , 1.3]]
X1 = np.array([[1.5, 3, 5.8, 2.2], [6.2, 2.9, 4.3, 1.3]])
# 进行预测
prediction = KNN.predict(X1)
# 种类名称
k = iris.get("target_names")[prediction]
完整代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
if __name__ == '__main__':
iris = load_iris()
data = iris.get("data")
target = iris.get("target")
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)
KNN = KNeighborsClassifier(n_neighbors=5)
KNN.fit(x_train, y_train)
train_score = KNN.score(x_train, y_train)
test_score = KNN.score(x_test, y_test)
print("模型的准确率:", test_score)
X1 = np.array([[1.5, 3, 5.8, 2.2], [6.2, 2.9, 4.3, 1.3]])
prediction = KNN.predict(X1)
k = iris.get("target_names")[prediction]
print("第一朵花的种类为:", k[0])
print("第二朵花的种类为:", k[1])
结果