机器学习实战——KNN算法

k近邻算法的原理

k 近邻算法的工作机制非常简单:对给定的测试样本,基于某种距离度量找出训练集中与其最靠近的 k 个训练样本,然后基于这 k 个"邻居"的信息来进行预测。通常, 在分类任务中可使用"投票法" ,即选择这 k 个样本中出现最多的类别标记作为预测结果;在回归任务中时使用"平均法" ,即将这k 个样本的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。k 的取值不同,其分类结果会发生变化。为了提高运算的效率,常利用 kd 树对其进行优化。

Python代码的遇到的问题

《机器学习实战》中的代码是基于py2编写的,py3中有部分变化,全书的py3代码链接为:机器学习实战python3的GitHub地址,代码中有几个包和函数没有使用过,因此对其用法进行记录。

  1. operator:内置的操作符函数,其中的 itemgetter(获取指定位置的阈)
  2. tile:numpy包中的函数,函数格式tile(A,reps),A和reps都是array_like,A的类型众多,几乎所有类型都可以:array, list, tuple, dict, matrix以及基本数据类型int,string, float以及bool类型。reps的类型也很多,可以是tuple,list, dict, array, int, bool.但不可以是float, string, matrix类型。
np.tile([1,2],2)
Out[2]: array([1, 2, 1, 2])

np.tile([1,2],(2,1))
Out[3]:
array([[1, 2],
       [1, 2]])
  1. sorted:sorted(iterable,cmp,key,reverse),参数:iterable可以是list或者iterator;cmp是带两个参数的比较函数;key 是带一个参数的函数;reverse为False或者True;
classCount
Out[59]: {'B': 2, 'A': 1}

# 按字典中values的大小排序,并返回元素为元组的列表
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), 
reverse=True)

sortedClassCount
Out[61]: [('B', 2), ('A', 1)]

调用Python中的机器学习包实现KNN算法

scikit-learn(简称sklearn,英文官方文档链接:(http://scikit-learn.org/stable/),中文文档链接:(http://sklearn.apachecn.org/))是目前Python中比较受欢迎的一个机器学习包,Sklearn 包含了如下几种比较常用的机器学习方式:

  • Classification 分类
  • Regression 回归
  • Clustering 聚类
  • Dimensionality reduction 数据降维
  • Model selection 模型选择
  • Preprocessing 数据预处理

本文主要介绍KNN算法的实现

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=1, **kwargs)
n_neighbors:默认为5,就是k-NN的k的值,选取最近的k个点。
weights:默认是uniform,参数可以是uniform(均等权重)、distance(非均等权重,距离近的点比距离远的点的影响大)。
algorithm:快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。也可以自己指定搜索算法 ball_tree 、kd_tree 、brute 方法进行搜索,brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。kd_tree :构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树,以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。ball tree :是为了克服kd树高纬失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。
leaf_size:默认是30,这个是构造的kd树和ball树的大小。这个值的设置会影响树构建的速度和搜索速度,同样也影响着存储树所需的内存大小。需要根据问题的性质选择最优的大小。
metric:用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度量)。
p:距离度量公式。参数默认为2,即使用欧式距离公式进行距离度量。1 表示使用曼哈顿距离公式进行距离度量。
metric_params:距离公式的其他关键参数,这个可以不管,使用默认的None即可。
n_jobs:并行处理设置。默认为1,临近点搜索并行工作数。

以sklearn中的 iris 数据集为例说明其调用过程

# 引入sklearn机器学习包中的KNN算法
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载iris数据集,其是一个150*4的数据集,代表150个样本,每个样本有4个属性
iris = load_iris()
iris_data = iris.data # 数据集
iris_labels = iris.target # 对应的分类标签

# 使用train_test_split对数据集按比例进行随机抽取,本文按37开进行抽取
X_train, X_test, Y_train, Y_test = train_test_split(iris_data, iris_labels, test_size=0.3, random_state=0)

# 定义knn分类器对象
Knn = KNeighborsClassifier(n_neighbors=6, weights='uniform')

# 调用所定义的分类器的训练方法,主要接收两个参数:训练数据集及训练标签
Knn.fit(X_train,Y_train)

#调用该对象的测试方法,主要接收一个参数:测试数据集
Y_predict = Knn.predict(X_test)

#计算各测试样本属于不同类的概率预测值,本文中为数组的大小为45*3,3代表数据集可以分成的类别,在每一行中按照从小到大的类别顺序排列
probility=Knn.predict_proba(X_test) 

# 调用打分方法,计算模型在测试集上的准确率
score = Knn.score(X_test,Y_test)

猜你喜欢

转载自blog.csdn.net/wxw_csdn/article/details/83349910