python 机器学习

您所在的位置:网站首页 水仙花所属类别 python 机器学习

python 机器学习

2024-07-17 09:44| 来源: 网络整理| 查看: 265

K 近邻分类理论及鸢尾( Iris )数据集实例操作 一、K 近邻分类理论二、K 近邻分类实例操作(1)导入数据划分训练集测试集(3)数据标准化(4)用 K 近邻法建立模型(5)性能评估参考文献:

一、K 近邻分类理论

K 近邻算法简称 KNN 算法,由 Cover 和 Hart 在 1968 年提出,是一种基本分类与回归方法。K 近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。K 近邻的一个常用的实现方法是 kd 树( KD-Tree ),可以做到以空间换时间的效果。

思路:如果一个样本在特征空间中的 K 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

因此,给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 K 个实例,这 K 个实例的多数属于某个类,就把该输入实例分类到这个类中。

一个例子:下图中,要决定绿色圆是被分成红色三角形一类还是蓝色四方形一类?

在这里插入图片描述 如果 K=3(黑色实线圆圈中),由于红色三角形所占比例为 2/3 ,绿色圆将被归为红色三角形类,如果 K=5(黑色虚线圆圈中),由于蓝色四方形比例为 3/5 ,因此绿色圆被归为蓝色四方形类。

注意:

① 在 KNN 算法中,所选择的邻居都是已经正确分类的对象,该方法在分类决策上只依据最邻近的一个或者K个样本的类别来决定待分样本所属的类别。(而分类问题K一般取奇数)

② KNN 算法简单有效,分类器不需要使用训练集进行训练。

③ KNN 方法从原理上依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。

④ K 近邻算法的三个基本要素:距离的度量、K 值的选择和分类决策规则。

⑤ KNN 算法不仅可以用于分类,还可以用于回归。通过找出一个样本的 K 个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值( weight ),如权值与距离成正比。

⑥数据的所有特征都要做可比较的量化。若是数据特征中存在非数值的类型,必须采取手段将其量化为数值。举个例子,若样本特征中包含颜色(红黑蓝)一项,颜色之间是没有距离可言的,可通过将颜色转换为灰度值来实现距离计算。另外,样本有多个参数,每一个参数都有自己的定义域和取值范围,他们对 distance 计算的影响也就不一样,如取值较大的影响力会盖过取值较小的参数。为了公平,样本参数必须做一些 scale 处理,最简单的方式就是所有特征的数值都采取归一化处置。

适用范围:该算法适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法容易产生误差。

不足:

① 该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的 K 个邻居中大容量类的样本占多数(可以采用权值的方法来改进,即和该样本距离小的邻居权值大)。

② 该算法的计算量较大,因为对每一个待分类的样本都要计算它到全体已知样本的距离,才能求得它的 K 个最近邻点(目前常用的解决方法是:事先对已知样本点进行剪辑,去除对分类作用不大的样本)。

算法描述:

① 计算测试数据与各个训练数据之间的距离;

② 按照距离的递增关系进行排序;

③ 选取距离最小的 K 个点;

④ 确定前 K 个点所在类别的出现频率;

⑤ 返回前 K 个点中出现频率最高的类别作为测试数据的预测分类。

二、K 近邻分类实例操作

下面我们以“鸢尾( Iris )数据集”为例使用K近邻模型对其进行分类,Iris 的数据集曾经被著名统计学家 Fisher 用在他的论文当中。

(1)导入数据 # 从 sklearn.datasets 导入 iris 数据加载器 from sklearn.datasets import load_iris # 使用加载器读取数据并且存入变量 iris iris = load_iris() # 查验数据规模 iris.data.shape

在这里插入图片描述 可见,该数据集共有 150 条数据,4 个特征。

# 通过 DESCR 查看数据说明 print(iris.DESCR)

在这里插入图片描述 通过上面的输出结果可以知道该数据集的信息资料,数据集中鸢尾花分为三个亚种( Setosa、Versicolour、Virginica ),每个样本数据被四个特征描述,分别为花萼长度( sepal length )、花萼宽度( sepal width )、花瓣长度( petal length )和花瓣宽度( petal width )。

划分训练集测试集 # 从 sklearn.cross_validation 里选择导入 train_test_split 用于数据分割 from sklearn.model_selection import train_test_split # 从使用 train_test_split ,利用随机种子 random_state 采样 25% 的数据作为测试集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.25, random_state=33) (3)数据标准化 # 从 sklearn.preprocessing 里选择导入数据标准化模块 from sklearn.preprocessing import StandardScaler # 对训练和测试的特征数据进行标准化 ss = StandardScaler() X_train = ss.fit_transform(X_train) X_test = ss.transform(X_test) (4)用 K 近邻法建立模型 # 从 sklearn.neighbors 里选择导入 KNeighborsClassifier ,即 K 近邻分类器 from sklearn.neighbors import KNeighborsClassifier # 使用 K 近邻分类器对测试数据进行类别预测,预测结果储存在变量 y_predict 中 knc = KNeighborsClassifier() knc.fit(X_train, y_train) y_predict = knc.predict(X_test) (5)性能评估 # 使用模型自带的评估函数进行准确性测评 print('The accuracy of K-Nearest Neighbor Classifier is', knc.score(X_test, y_test)) # 依然使用 sklearn.metrics 里面的 classification_report 模块对预测结果做更加详细的分析 from sklearn.metrics import classification_report print(classification_report(y_test, y_predict, target_names=iris.target_names))

在这里插入图片描述 由上面的结果可知,K 近邻分类器对 38 条鸢尾花测试样本分类的准确性为 89.4736842105% ,共有 3 个类别,它们的平均精确率、召回率和 F1 指标分别为 0.92,0.89 和 0.90 。

由此可见,K 近邻分类器虽然简单,不需要进行参数训练,但是使用的计算量大、内存消耗大。只要优质数据量足够大,KNN在理论上能保证取得较好的效果。

参考文献:

[1] 范淼,李超.Python 机器学习及实践[M].清华大学出版社, 北京, 2016.



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3