在之前的文章中也介绍了KNN的算法原理,并且完成了两个案例进一步的理解了KNN。这都使用的是自己写的kNN分类器,scikit-learn包在机器学习和数据挖掘中是一个强大的包,其中就包含了许多的算法实现以及实用的功能。而在《Python数据挖掘入门与实践》这本书中,并没有像《机器学习》或者《机器学习实战》中的那样介绍原理或者自己实现某个算法,而是直接使用sklearn(scikit-learn)中的分类器,但是除此之外还介绍了一些实用的功能。下面就基于这本书的一个KNN例子,来简单介绍一下如何使用sklearn这个强大的包。
准备数据集。
书中的例子使用的是UCI机器学习数据库中的电离层数据,这些数据是由高频天线收集的。这些天线的目的是侦测在电离层和高层大气中存不存在由自由电子组成的特殊结构。如果一条数据能给出特殊结构存在的证据,这条数据就属于好的那一类(在数据集中用“g”表示),否则就是坏的(用“b”表示)。
下载下来看一下这些数据:
虽然不清楚这些数据代表什么意思,但是不影响我们的后续步骤,只需要知道这是一个351条数据,每条数据有35列,前34列分别代表17座天线采集的数据,每座天线采集两个数据。然后最后一列是代表这个数据是好还是坏,如果是‘g’就是好的,如果是‘b’就是坏的。
我们先将数据读取到矩阵中,设计loadDataSet函数,返回数据集以及对应的标签:
def loadDataSet():
"""
加载数据集
:return:
"""
# 创建一个与数据集相等的矩阵,不包含标签
x = np.zeros((351, 34), dtype=float)
# 用来保存标签
y = np.zeros((351, ), dtype=bool)
# 加载数据集
reader = csv.reader(open('ionosphere.data'))
# 同时获取索引和值
for i, row in enumerate(reader):
# 将数据添加到x中
data = [float(datum) for datum in row[:-1]]
x[i] = data
# 等于g设置为1,否则设置为0
y[i] = row[-1] == 'g'
return x, y
划分测试数据计算分类器准确率。
准备好数据集之后我们就可以直接调用sklearn中的knn分类器进行分类计算。但是为了能够看出这个分类器的准确率,我们还需要将数据集划分为训练集和测试集,使用训练数据集进行训练分类器,然后使用测试集观察正确率。
划分训练集和测试集可以使用sklearn中的train_test_split。
from sklearn.model_selection import train_test_split
该函数可以