基于scikit-learn包实现机器学习之KNN(K近邻)html
scikit-learn(简称sklearn)是目前最受欢迎,也是功能最强大的一个用于机器学习的Python库件。它普遍地支持各类分类、聚类以及回归分析方法好比支持向量机、随机森林、DBSCAN等等,因为其强大的功能、优异的拓展性以及易用性,目前受到了不少数据科学从业者的欢迎,也是业界至关著名的一个开源项目之一。算法
基于上一篇的k近邻原理讲解,咱们这一片主要是利用相应的工具包实现机器学习,为了逐步掌握这样成功的工具包,咱们从简单的KNN开始入手,其中scikit-learn就是一个不错的选择。数组
首先咱们须要安装sklearn这个库(因为您能够在咱们的网页上进行全部的实验,因此您能够在以后再尝试在您的电脑上安装sklearn)。sklearn是Python的扩展库,所以咱们必须首先设置好Python运行环境。同时,因为sklearn基于Numpy和Scipy这两个库,咱们也要首先安装好它们。而后,咱们即可以使用pip
或conda
来自动安装sklearn,具体方法以下:数据结构
# 安装sklearn以前必须先安装较新版本的Scipy与Numpy
# 使用pip安装sklearn:
pip install -U scikit-learn
# 使用conda安装sklearn:
conda install scikit-learn多线程
安装好sklearn以后,咱们即可以在Python脚本中使用来自sklearn中的各类数据、功能函数等等。dom
数据是机器学习的关键,在机器学习工做中咱们须要花费大量的时间来采集和整理数据,合理且科学的数据是获得良好机器学习效果的关键。通常而言,一个分类问题的机器学习过程须要用到四块数据内容,分别是:机器学习
train
来表示target
来表示test
来表示expected
来表示为了方便学习和测试机器学习中的各类内容,sklearn内置了各类有用的数据集,文本处理、图像识别等具备表明性的问题的数据在sklearn中均有收集(对于初学者来讲,不得不说很人性化)。函数
本文中用的鸢尾花数据集一样能够在sklearn中的datasets
模块中找到。工具
很少说,直接先上代码,后面再进行详解。性能
#-*-coding:utf-8 -*-
from sklearn import datasets
#导入内置数据集模块
from sklearn.neighbors import KNeighborsClassifier
#导入sklearn.neighbors模块中KNN类
import numpy as np
np.random.seed(0)
#设置随机种子,不设置的话默认是按系统时间做为参数,所以每次调用随机模块时产生的随机数都不同设置后每次产生的同样
iris=datasets.load_iris()
#导入鸢尾花的数据集,iris是一个相似于结构体的东西,内部有样本数据,若是是监督学习还有标签数据
iris_x=iris.data
#样本数据150*4二维数据,表明150个样本,每一个样本4个属性分别为花瓣和花萼的长、宽
iris_y=iris.target
#长150的觉得数组,样本数据的标签
indices = np.random.permutation(len(iris_x))
#permutation接收一个数做为参数(150),产生一个0-149一维数组,只不过是随机打乱的,固然她也能够接收一个一维数组做为参数,结果是直接对这个数组打乱
iris_x_train = iris_x[indices[:-10]]
#随机选取140个样本做为训练数据集
iris_y_train = iris_y[indices[:-10]]
#而且选取这140个样本的标签做为训练数据集的标签
iris_x_test = iris_x[indices[-10:]]
#剩下的10个样本做为测试数据集
iris_y_test = iris_y[indices[-10:]]
#而且把剩下10个样本对应标签做为测试数据及的标签
knn = KNeighborsClassifier()
#定义一个knn分类器对象
knn.fit(iris_x_train, iris_y_train)
#调用该对象的训练方法,主要接收两个参数:训练数据集及其样本标签
iris_y_predict = knn.predict(iris_x_test)
#调用该对象的测试方法,主要接收一个参数:测试数据集
probility=knn.predict_proba(iris_x_test)
#计算各测试样本基于几率的预测
neighborpoint=knn.kneighbors(iris_x_test[-1],5,False)
#计算与最后一个测试样本距离在最近的5个点,返回的是这些样本的序号组成的数组
score=knn.score(iris_x_test,iris_y_test,sample_weight=None)
#调用该对象的打分方法,计算出准确率
print('iris_y_predict = ')
print(iris_y_predict)
#输出测试的结果
print('iris_y_test = ')
print(iris_y_test)
#输出原始测试数据集的正确标签,以方便对比
print 'Accuracy:',score
#输出准确率计算结果
print 'neighborpoint of last test sample:',neighborpoint
print 'probility:',probility
***********************************
结果输出:
iris_y_predict =
[1 2 1 0 0 0 2 1 2 0]
iris_y_test =
[1 1 1 0 0 0 2 1 2 0]
Accuracy: 0.9
neighborpoint of last test sample: [[ 75 41 96 78 123]]
probility: [[ 0. 1. 0. ]
[ 0. 0.4 0.6]
[ 0. 1. 0. ]
[ 1. 0. 0. ]
[ 1. 0. 0. ]
[ 1. 0. 0. ]
[ 0. 0. 1. ]
[ 0. 1. 0. ]
[ 0. 0. 1. ]
[ 1. 0. 0. ]]
基于此,KNN算法实现已经完全完成了,固然,咱们仍是须要稍微再解读一下,上面所说的主要两个对象的方法,一个是fit()方法,一个是predict()方法,我说的主要接受两个参数,并非说只接受两个参数或者一个参数,而是说其余参数都有默认值,且是内部参数,这里咱们详细解读。KNeighborsClassifier是一个类,它集成了其余的NeighborsBase, KNeighborsMixin,SupervisedIntegerMixin, ClassifierMixin。这里咱们暂时无论它。主要看它的几个主要的方法。固然有的方法是其从父类那里集成过来的。
__init__() 初始化函数(构造函数) 它主要有一下几个参数:
n_neighbors=5
int 型参数 knn算法中指定以最近的几个最近邻样本具备投票权,默认参数为5
weights='uniform'
str参数 即每一个拥有投票权的样本是按什么比重投票,'uniform'表示等比重投票,'distance'表示按距离反比投票,[callable]表示本身定义的一个函数,这个函数接收一个
距离数组,返回一个权值数组。默认参数为‘uniform’
algrithm='auto'
str参数 即内部采用什么算法实现。有如下几种选择参数:'ball_tree':球树、'kd_tree':kd树、'brute':暴力搜索、'auto':自动根据数据的类型和结构选择合适的算法。默认状况下是‘auto’。暴力搜索就不用说了你们都知道。具体前两种树型数据结构哪一种好视状况而定。KD树是对依次对K维坐标轴,以中值切分构造的树,每个节点是一个超矩形,在维数小于20时效率最高--能够参看《统计学习方法》第二章。ball tree 是为了克服KD树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。通常低维数据用kd_tree速度快,用ball_tree相对较慢。超过20维以后的高维数据用kd_tree效果反而不佳,而ball_tree效果要好,具体构造过程及优劣势的理论你们有兴趣能够去具体学习。
leaf_size=30
int参数 基于以上介绍的算法,此参数给出了kd_tree或者ball_tree叶节点规模,叶节点的不一样规模会影响数的构造和搜索速度,一样会影响储树的内存的大小。具体最优规模是多少视状况而定。
matric='minkowski'
str或者距离度量对象 即怎样度量距离。默认是闵氏距离,闵氏距离不是一种具体的距离度量方法,它能够说包括了其余距离度量方式,是其余距离度量的推广,具体各类距离度量只是参数p的取值不一样或者是否去极限的不一样状况,具体你们能够参考这里,讲的很是详细
p=2
int参数 就是以上闵氏距离各类不一样的距离参数,默认为2,即欧氏距离。p=1表明曼哈顿距离等等
metric_params=None
距离度量函数的额外关键字参数,通常不用管,默认为None
n_jobs=1
int参数 指并行计算的线程数量,默认为1表示一个线程,为-1的话表示为CPU的内核数,也能够指定为其余数量的线程,这里不是很追求速度的话不用管,须要用到的话去看看多线程。
fit()
训练函数,它是最主要的函数。接收参数只有1个,就是训练数据集,每一行是一个样本,每一列是一个属性。它返回对象自己,即只是修改对象内部属性,所以直接调用就能够了,后面用该对象的预测函数取预测天然及用到了这个训练的结果。其实该函数并非KNeighborsClassifier这个类的方法,而是它的父类SupervisedIntegerMixin继承下来的方法。
predict()
预测函数 接收输入的数组类型测试样本,通常是二维数组,每一行是一个样本,每一列是一个属性返回数组类型的预测结果,若是每一个样本只有一个输出,则输出为一个一维数组。若是每一个样本的输出是多维的,则输出二维数组,每一行是一个样本,每一列是一维输出。
predict_prob()
基于几率的软判决,也是预测函数,只是并非给出某一个样本的输出是哪个值,而是给出该输出是各类可能值的几率各是多少接收参数和上面同样返回参数和上面相似,只是上面该是值的地方所有替换成几率,好比说输出结果又两种选择0或者1,上面的预测函数给出的是长为n的一维数组,表明各样本一次的输出是0仍是1.而若是用几率预测函数的话,返回的是n*2的二维数组,每一行表明一个样本,每一行有两个数,分别是该样本输出为0的几率为多少,输出1的几率为多少。而各类可能的顺序是按字典顺序排列,好比先0后1,或者其余状况等等都是按字典顺序排列。
score()
计算准确率的函数,接受参数有3个。 X:接收输入的数组类型测试样本,通常是二维数组,每一行是一个样本,每一列是一个属性。y:X这些预测样本的真实标签,一维数组或者二维数组。sample_weight=None,是一个和X第一位同样长的各样本对准确率影响的权重,通常默认为None.输出为一个float型数,表示准确率。内部计算是按照predict()函数计算的结果记性计算的。其实该函数并非KNeighborsClassifier这个类的方法,而是它的父类KNeighborsMixin继承下来的方法。
kneighbors()
计算某些测试样本的最近的几个近邻训练样本。接收3个参数。X=None:须要寻找最近邻的目标样本。n_neighbors=None,表示须要寻找目标样本最近的几个最近邻样本,默认为None,须要调用时给出。return_distance=True:是否须要同时返回具体的距离值。返回最近邻的样本在训练样本中的序号。其实该函数并非KNeighborsClassifier这个类的方法,而是它的父类KNeighborsMixin
继承下来的方法。
下面举一个简单例子让你们稍微看看,(其实上面的例子已经很具体形象了):
Examples
--------
>>> X = [[0], [1], [2], [3]]
>>> y = [0, 0, 1, 1]
>>> from sklearn.neighbors import KNeighborsClassifier
>>> neigh = KNeighborsClassifier(n_neighbors=3)
>>> neigh.fit(X, y)
>>> print(neigh.predict([[1.1]]))
[0]
>>> print(neigh.predict_proba([[0.9]]))
[[ 0.66666667 0.33333333]]
以上讲解关于sklearn中的knn算法基本讲解完了,不知道你们是否学会了呢?以上部分除了sklearn背景介绍,后面的部分为原创,但愿你们共同窗习共同进步,后续会继续更新sklearn的其余方法。