Scikit-Learn(基于Python的工具包)javascript
1.是一个基于Numpy,Scipy,Matplotlib的开源机器学习工具包。css
2.该包于2007年发起,基本功能包涵了6个方面:分类、回归、聚类、数据降维、模型选择、预处理html
包括了大量经常使用的算法::SVM,逻辑回归,朴素贝叶斯,k-meanshtml5
3.网站为:http://scikit-learn.org鸢尾花数据集是由杰出的统计学家java
R.A.Fisher在20世纪30年代中期创建的,它被公认为用于数据挖掘的最著名的数据集。它包含3种植物种python
类(Iris setosa、Iris versicolor和Iris virginica),每种各有50个样本。jquery
表1-4摘录了这个数据集。linux
它由4个属性组成:sepal length(花萼长度)、sepal width(花萼宽度)、petal length(花瓣长度)和petal width(花瓣宽度)(单位是cm)。android
与前面数据集不一样的是,鸢尾花的全部属性都是数值属性。css3
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 只运行当前行
官方网站:http://scikit-learn.org/stable/
对Python语言有所了解的科研人员可能都知道SciPy——一个开源的基于Python的科学计算工具包。基于SciPy,目前开发者们针对不一样的应用领域已经发展出了为数众多的分支版本,它们被统一称为Scikits,即SciPy工具包的意思。而在这些分支版本中,最有名,也是专门面向机器学习的一个就是Scikit-learn。
Scikit-learn项目最先由数据科学家 David Cournapeau 在 2007 年发起,须要NumPy和SciPy等其余包的支持,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。
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加速。
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) #正确率