当前位置:文档之家› 第二章 k近邻算法

第二章 k近邻算法


sklearn是python著 名的机器学习库,它 其中封装了大量的机 器学习算法,内置了 大量的公开数据集, 并且拥有完善的文档, 因此成为目前最受欢 迎的机器学习学习与 实践的工具。 scikit-learn估计器 由两大函数组成: fit()和predict()。 用fit方法在训练集上 完成模型的创建,用 predict方法在测试 集上评估效果。
为了直观表示,我们通过图表来表示 %matplotlib inline from matplotlib import pyplot as plt #以近邻数和平均正确率作为坐标轴画图 plt.plot(parameter_values,avg_scores, '-o') 结果如图:
交叉验证及探究近邻数影响
结果为82.3%
较之前稍微差点,但考虑到我们还没有尝试 调整参数,这个结果还是相当不错的。
调整参数
之前构造的k近邻分类器默认近邻数(n_neighbors)=3。 我们测试一系列n_neighbors的值,比如从1到20,可以重复进行多次实验,观察不同的参数 值所带来的结果之间的差异。 avg_scores = [] all_scores = [] parameter_values = list(range(1, 21)) for n_neighbors in parameter_values: estimator = KNeighborsClassifier(n_neighbors=n_neighbors) #多次对不同近邻数的模型进行交叉验证,并将结果保存起来 scores = cross_val_score(estimator, X, y, cv=3,scoring='accuracy') avg_scores.append(np.mean(scores)) all_scores.append(scores)
cvs,即逗号分隔值(也 称字符分隔值,因为分隔 符可以不是逗号),是一 种常用的文本格式,用以 存储表格数据,包括数字 或者字符。很多程序在处 理数据时都会碰到csv这 种格式的文件。Python 内置了cvs模块。
from sklearn.model_selection import train_test_split
实验t csv Import os #如果不使用添加文件路径可不导入该模块 dataFolder=……#自己本地的data文件路径 data_filename = os.path.join(dataFolder, "Ionosphere","ionosphere.data"); #添加文件路径,也可以不使用该语句,自己直接输入该data文件路径 #创建Numpy数组X和y存放数据集。数据集大小已知,共有351行34列。 X = np.zeros((351, 34), dtype='float') y = np.zeros((351,), dtype='bool')
遍历文件中的每一行数据。每行数据代表一组测量结果,我们可以将其称作数据集 中的一个个体。 用枚举函数来获得每行的索引号,在下面更新数据集X中的某一个体时会用到行号 获取每一个个体的前34个值,将其强制转化为浮点型,保存到X中。 最后,获取每个个体最后一个表示类别的值,把字母转化为数字,如果类别为 “g”,值为1,否则值为0。 到此,我们就把数据集读到了数组X中,类别读入了数组y中。
scores = cross_val_score(estimator, X, y, scoring='accuracy‘,cv=6) #可参考官方文档/stable/modules/model_evaluation.html #验证并打印结果 average_accuracy = np.mean(scores) * 100 print("The average accuracy is {0:.1f}%".format(average_accuracy))
找出最接近未知样本的K个训练样本。这K个训练样本是未知样本的K个“近邻”。“临近性”又称 为相异度(Dissimilarity),由欧几里德距离定义。未知样本被分配到k个最邻近者中最公共的类。 当k=1时,未知样本被指定到模式空间中与之最临近的训练样本的类。 ——《数据挖掘》7.7.1 k-最临近分类 简而言之,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到 与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输 入实例分类到这个类中。
# 最后使用测试集进行测试算法 y_predicted = estimator.predict(X_test) accuracy = np.mean(y_test == y_predicted) * 100 print("The accuracy is {0:.1f}%".format(accuracy))
结果正确率为86.4%
K最近邻(k-Nearest Neighbor,KNN)分类算法
交叉验证
scikit-learn提供了几种交叉检验方法。 from sklearn.model_selection import cross_val_score #把完整的数据集和类别值传给这个函数。cv为数字时,指的是将原数据分为多少份 #当cv为数字时,默认使用K-fold交叉检验。默认cv=3,但不填cv会警告
# 原使用的模块 sklearn.cross_validation 已经被sklearn.model_selection 代替
#首先,需要创建训练集和测试集。 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=14) #X_train, X_test, y_train, y_test = train_test_split(X, y) #train_test_split该函数可以将数据集进行随机划分(根据随机数种子划分,对于同一数 据集随机数种子一样,划分的结果一样),同时可以设置测试集占比例等,详细可参考 官方文档。 #random_state是指随机数种子,如果种子相同,则结果相同。也可省略。 from sklearn.neighbors import KNeighborsClassifier #导入K近邻分类器这个类,并为其初始化一个实例,创建一个kNN分类器,默认近邻数 为5 estimator = KNeighborsClassifier() # 使用训练集进行训练 estimator.fit(X_train, y_train)
使用 Scikit-learn中的 k最近 邻算法进行分类
理论前提
K最近邻(k-Nearest Neighbor,KNN)分类算法,
是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。 K-最临近分类基于类比学习,其训练样本由N维数值属性描述,每个样本代表N维空间的一个点。 这样,所有训练样本都存放在N维模式空间中。给定一个未知样本,k-最临近分类法搜索模式空间,
Numpy是Python的一 个科学计算的库,提供 了矩阵运算的功能,其 一般与Scipy、 matplotlib一起使用。
#读取数据。 #我们用csv模块来导入数据集文件,并创建csv阅读器对象。 with open(data_filename, 'r') as input_file: reader = csv.reader(input_file); #注意这里必须让reader保持未关闭,否则enumerate()报错 for i, row in enumerate(reader): data = [float(datum) for datum in row[:-1]] X[i] = data y[i] = row[-1] == 'g'
实验准备
软件:Anaconda 中自带Jupyter Notebook(原名: IPython Notebook ) 或 其他 python IDLE 语言:python 实验数据说明: 即将用到的数据集叫作电离层(Ionosphere),这些数据是由高频天线收集的。 这些天线的目的是侦测在电离层和高层大气中存不存在由自由电子组成的特殊结 构。如果一条数据能给出特殊结构存在的证据,这条数据就属于好的那一类(在 数据集中用“g”表示),否则就是坏的(用“b”表示)。我们要做的就是建立 分类器,自动判断这些数据的好坏。 该数据集每行有35个值,前34个为17座天线采集的数据(每座天线采集两个 数据)。最后一个值不是“g”就是“b”,表示数据的好坏,即是否提供了有价 值的信息。 我们假设把这两个文件保存到用户主目录下的Data文件夹中。
举例
举例来说,我们要根据三角形更像什 么(跟哪种图形离得更近),预测三角 形的类别。我们找到三个离它最近的邻 居:两个菱形和一个圆。 菱形的数量多于圆,因此我们预测三 角形的类别为菱形。
近邻算法几乎可以对任何数据集进行分类,但是,要计算数据集中每两个个体之间的距离,计算量 很大。
例如,数据集中个体数量为10时,需要计算45对不同个体之间的距离。然而,当个体数量为1000时, 要计算大约50万对个体之间的距离!
相关主题