介绍
K-Nearest-Neighbor 分类器 (kNN) 的基本概念可以在我们机器学习教程的k-Nearest-Neighbor Classifier一章中找到。在本章中,我们还展示了用 Python 编写的简单函数来演示基本原理。
尽管这些函数显示出令人印象深刻的结果,但我们建议不要使用这些函数,而是建议使用该sklearn
模块的功能。我们sklearn
在前面的章节中已经使用过。
将 sklearn 用于 kNN
邻居是sklearn模块的一个包,它为最近邻分类器提供了无监督和监督学习的功能。
sklearn.neighbors 中的类可以处理 Numpy 数组和 scipy.sparse 矩阵作为输入。对于密集矩阵,支持大量可能的距离度量。对于稀疏矩阵,搜索支持任意 Minkowski 度量。
scikit-learn实现了两种不同的最近邻分类器:
邻居分类器
基于必须分类的样本的 k 个最近邻。数字“k”是用户指定的整数值。这是两种算法中最常用的分类器。
半径邻居分类器
基于每个必须分类的样本在固定半径 r 内的邻居数。'r' 是用户指定的浮点值。这种分类器不太常用。
邻居分类器
我们将人工创建一个包含三个类的数据集,以测试来自“sklearn.neighbors”的 k 最近邻分类器“KNeighborsClassifier”。我们在机器学习的数据集创建一章中对此进行了描述
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
中心 = [[ 2 , 3 ], [ 5 , 5 ], [ 1 , 8 ]]
n_classes = LEN (中心)
的数据, 标签 = make_blobs (N_SAMPLES次= 150 ,
中心= NP 。阵列(中心),
random_state = 1 )
让我们想象一下我们创建的内容:
导入 matplotlib.pyplot 作为 plt
颜色 = ('绿色' , '红色' , '蓝色' )
n_classes = 3
图, ax = plt 。副区()
为 n_class 在 范围(0 , n_classes ):
斧。分散(数据[标签== n_class , 0 ], 数据[标签== n_class , 1 ],
c =颜色[ n_class ], s = 10 , 标签= str (n_class ))
斧头。图例( loc = '右上角' );
我们现在必须在测试和训练集中拆分数据。
from sklearn.model_selection import train_test_split
res = train_test_split ( data , labels ,
train_size = 0.8 ,
test_size = 0.2 ,
random_state = 1 )
train_data , test_data , train_labels , test_labels = res
我们现在准备好使用以下内容执行分类kNeighborsClassifier
:
# 创建并拟合最近邻分类器
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier ()
knn . 适合(train_data , train_labels )
预测 = knn 。预测(test_data )
打印(“来自分类器的预测:” )
打印(预测)
打印(“目标值:” )
打印(test_labels )
输出:
来自分类器的预测:
[2 2 2 0 0 1 1 2 2 1 0 1 0 0 2 0 0 0 1 0 0 1 1 2 0 0 0 1 2 1]
目标值:
[2 2 2 0 0 1 1 2 2 1 0 1 0 0 2 0 0 0 1 0 0 1 1 2 0 0 0 1 2 1]
为了评估结果,我们将使用accuracy_score
来自模块的sklearn.metrics
. 为了了解accuracy_score
工作原理,我们将使用一个带有伪预测和标签的简单示例:
从 sklearn.metrics 导入 accuracy_score
example_predictions = [ 0 , 2 , 1 , 3 , 2 , 0 , 1 ]
example_labels = [ 0 , 1 , 2 , 3 , 2 , 1 , 1 ]
打印(accuracy_score (example_predictions , example_labels ))
输出:
0.5714285714285714
返回值对应于正确分类和预测总数的商。如果您只关心正确分类项目的数量,您可以将参数设置normalize
为False
。默认值为True
。
打印(accuracy_score (example_predictions ,
example_labels ,
normalize = False ))
输出:
4
现在我们准备评估我们之前的分类示例的结果:
打印(accuracy_score (预测, test_labels ))
输出:
1.0
您可能已经注意到,我们在前面的示例中通过不带任何参数调用它来实例化 k 最近邻分类器,即KNeighborsClassifier()
。下面,我们用一些可能的关键字参数实例化它:
knn = KNeighborsClassifier ( algorithm = 'auto' ,
Leaf_size = 30 ,
metric =