Scikit-Learn实战KNN
Scikit-Learn总结
Scikit-Learn(基于Python的工具包)
1.是一个基于Numpy,Scipy,Matplotlib的开源机器学习工具包。
2.该包于2007年发起,基本功能包涵了6个方面:分类、回归、聚类、数据降维、模型选择、预处理
包括了大量常用的算法::SVM,逻辑回归,朴素贝叶斯,k-means
3.网站为:http://scikit-learn.org鸢尾花数据集是由杰出的统计学家
R.A.Fisher在20世纪30年代中期创建的,它被公认为用于数据挖掘的最著名的数据集。它包含3种植物种
类(Iris setosa、Iris versicolor和Iris virginica),每种各有50个样本。
表1-4摘录了这个数据集。
它由4个属性组成:sepal length(花萼长度)、sepal width(花萼宽度)、petal length(花瓣长度)和petal width(花瓣宽度)(单位是cm)。
与前面数据集不同的是,鸢尾花的所有属性都是数值属性。
scikit-learn数据集:
[n_sample,n_feature]二维数据
分别表示样本数量和样本的特征数量
1.读取数据使用datasets.load_+tab键可查看
2.数据被存储在.data成员内是一个n_sample*n_feature的数组
3.在监督问题下一个或多个因变量被存储在.target中。
0.安装好Anaconda
1)Anaconda
这是一个非常齐全的python发行版本,最新的版本提供了多达195个流行的python包,包含了我们常用的numpy、scipy等等科学计算的包。有了它,妈妈再也不用担心我焦头烂额地安装一个又一个依赖包了。Anaconda在手,轻松我有!下载地址如下:http://www.continuum.io/downloads
2)Anaconda快捷键
Alt+Enter 运行当前行并插入新行
Shift+Enter 运行当前行并选择下一行
Ctrl+Enter 只运行当前行
1.Scikit-Learn基本知识的了解
官方网站:http://scikit-learn.org/stable/
对Python语言有所了解的科研人员可能都知道SciPy——一个开源的基于Python的科学计算工具包。基于SciPy,目前开发者们针对不同的应用领域已经发展出了为数众多的分支版本,它们被统一称为Scikits,即SciPy工具包的意思。而在这些分支版本中,最有名,也是专门面向机器学习的一个就是Scikit-learn。
Scikit-learn项目最早由数据科学家 David Cournapeau 在 2007 年发起,需要NumPy和SciPy等其他包的支持,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。
2.Scikit-learn的六大功能
Scikit-learn的基本功能主要被分为六大部分:分类,回归,聚类,数据降维,模型选择和数据预处理。
分类是指识别给定对象的所属类别,属于监督学习的范畴,最常见的应用场景包括垃圾邮件检测和图像识别等。目前Scikit-learn已经实现的算法包括:支持向量机(SVM),最近邻,逻辑回归,随机森林,决策树以及多层感知器(MLP)神经网络等等。
需要指出的是,由于Scikit-learn本身不支持深度学习,也不支持GPU加速,因此这里对于MLP的实现并不适合于处理大规模问题。有相关需求的读者可以查看同样对Python有良好支持的Keras和Theano等框架。
回归是指预测与给定对象相关联的连续值属性,最常见的应用场景包括预测药物反应和预测股票价格等。目前Scikit-learn已经实现的算法包括:支持向量回归(SVR),脊回归,Lasso回归,弹性网络(Elastic Net),最小角回归(LARS ),贝叶斯回归,以及各种不同的鲁棒回归算法等。可以看到,这里实现的回归算法几乎涵盖了所有开发者的需求范围,而且更重要的是,Scikit-learn还针对每种算法都提供了简单明了的用例参考。
聚类是指自动识别具有相似属性的给定对象,并将其分组为集合,属于无监督学习的范畴,最常见的应用场景包括顾客细分和试验结果分组。目前Scikit-learn已经实现的算法包括:K-均值聚类,谱聚类,均值偏移,分层聚类,DBSCAN聚类等。
数据降维是指使用主成分分析(PCA)、非负矩阵分解(NMF)或特征选择等降维技术来减少要考虑的随机变量的个数,其主要应用场景包括可视化处理和效率提升。
模型选择是指对于给定参数和模型的比较、验证和选择,其主要目的是通过参数调整来提升精度。目前Scikit-learn实现的模块包括:格点搜索,交叉验证和各种针对预测误差评估的度量函数。
数据预处理是指数据的特征提取和归一化,是机器学习过程中的第一个也是最重要的一个环节。这里归一化是指将输入数据转换为具有零均值和单位权方差的新变量,但因为大多数时候都做不到精确等于零,因此会设置一个可接受的范围,一般都要求落在0-1之间。而特征提取是指将文本或图像数据转换为可用于机器学习的数字变量。
需要特别注意的是,这里的特征提取与上文在数据降维中提到的特征选择非常不同。特征选择是指通过去除不变、协变或其他统计上不重要的特征量来改进机器学习的一种方法。
总结来说,Scikit-learn实现了一整套用于数据降维,模型选择,特征提取和归一化的完整算法/模块,虽然缺少按步骤操作的参考教程,但Scikit-learn针对每个算法和模块都提供了丰富的参考样例和详细的说明文档。
总体上来说,作为专门面向机器学习的Python开源框架,Scikit-learn可以在一定范围内为开发者提供非常好的帮助。它内部实现了各种各样成熟的算法,容易安装和使用,样例丰富,而且教程和文档也非常详细。
另一方面,Scikit-learn也有缺点。例如它不支持深度学习和强化学习,这在今天已经是应用非常广泛的技术,例如准确的图像分类和可靠的实时语音识别和语义理解等。此外,它也不支持图模型和序列预测,不支持Python之外的语言,不支持PyPy,也不支持GPU加速。
3.Scikit-Learn实战KNNDemo
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors,datasets
iris=datasets.load_iris()
print(iris.data[0:5])#打印数据的前五行
print(iris.target)
#设置iris数据集的前两个属性作为一个变量x
X=iris.data[:,:2]
print(X[0:5])
#取出类别标签所在的列存储在变量y中
Y=iris.target
#训练knn分类器,设置最近邻的个数为15,权重参数为uniform(最近邻的所有点都具备相同的权重)
clf=neighbors.KNeighborsClassifier(n_neighbors=15,weights='uniform').fit(X,Y)
print(clf)
#绘图
h=0.02
#设置网格纵横坐标的最小值和最大值,限定范围
x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
#使用np.arrange(x_min,x_max,h)生成起始值为x_min,终止值为x_max,步长为0.02的等差数列。
#使用meshgrid(np.arrange(x_min,x_max,h),np.arrange(y_min,y_max,h))生成两个矩阵分别进行行填充和列填充
xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))
#使用ravel()将这两个矩阵变为按顺序输出的一维数组,np.c_()将两组的一维数组,两两组队,形成网格中的点#
#使用clf.predict()预测这些点的所属类别
Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
xx
yy
xx.ravel()
yy.ravel()
np.c_[xx.ravel(),yy.ravel()]
Z
#填充颜色绘图
camp_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
camp_bold=ListedColormap(['#FF0000','#00FF00','#0000FF'])
Z=Z.reshape(xx.shape)
plt.pcolormesh(xx,yy,Z,cmap=camp_light)#根据预测结果为网格填充
plt.scatter(X[:,0],X[:,1],c=Y,cmap=camp_bold,marker='o')#根据原始类别为所有的点填充颜色
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
#plt.title("3-Class classfication(k= % i,weights='distance')" % k_neighbors)
plt.show()
correct=0.0
Z1=clf.predict(np.c_[xx.ravel(),yy.ravel()])
for i in range(len(iris.data)):
if Z1[i]== iris.target[i]:
correct+=1
correct/len(iris.data) #正确率