[Machine Learning step by step] 1 统计学习:scikit-learn机器学习简介

来源:互联网 发布:网络消费者权益保护 编辑:程序博客网 时间:2024/05/18 13:48

译自scikit-learn官方文档,原文地址:http://scikit-learn.org/stable/tutorial/basic/tutorial.html

译者:李景鑫,微博:http://weibo.com/u/3322686494

非周期性更新,转载请注明出处。

本节内容

本节介绍机器学习术语并给出了简单的示例。

1.1 机器学习:

总体而言,所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质。如果每一个样本数量大于一,比如,多维数据(又名,多元变量数据),这个样本则称为包含多个属性或特征

我们可以将学习问题分为如下几类:

一、有监督学习

这种情况下,数据是带有标注的(点此进入scikit-learn有监督学习页面)。有监督学习可分为两类:

 其一、分类:样本属于两个或者更多的类,我们希望学习已经标注的数据,从而将未标注的数据分类。例如,手写数字识别,我们将每个输入向量分到某个类别。从另外一个角度,也可以把分类问题看作是一种离散式(相对于连续)的有监督学习。在此,分类的数量是有限的,对于每一个样本,我们都试着给他们标注正确的类别。

其二、回归:如果我们想要的结果是由一个或者多个连续变量组成时,我们则称其为回归。例如,通过三文鱼的年龄和重量来推测它的长度。

二、无监督学习

这种情况下,训练数据是一个集合,该集合由未标注目标值的向量X组成。此类问题的目标有几种。要么是要将数据划分为相似的几组,这种叫做聚类;要么是确定数据的分布,这种叫做密度估计;要么是将数据从高维度空间投射到二、三维空间里,这种叫做可视化。(点此进入Scikit-Learn无监督学习页面)

训练集和测试集

机器学习会学习数据集的某些属性,并运用于新数据。这就是为什么习惯上会把数据分为两个集合,由此来评价算法的优劣。这两个集合,一个叫做训练集,我们从中获得数据的性质;一个叫做测试集,我们在此测试这些性质。

1.2. 载入数据集

scikit-learn自带了一些标准数据集,比如,分类问题有鸢尾花数据集和数字数据集,回归问题有波士顿房价数据集。

[python] view plaincopyprint?
  1. >>> from sklearn import datasets  
  2. >>> iris = datasets.load_iris()  
  3. >>> digits =datasets.load_digits()  

数据集是类似于字典的对象,其中存有全部数据以及关于这些数据的元数据。数据储存在.data成员中,该成员是一个含有n_samplesn_features的数列。对于有监督学习,解释性的变量存于.target成员中。不同数据集的更多细节请参阅相关章节。

例如,对于数字数据集,digits.data给出了可以用来分类数字数据样本的特征。

[python] view plaincopyprint?
  1. >>> print digits.data   
  2. [[ 0.   0.   5. ...,  0.   0.   0.]  
  3.  [ 0.   0.   0. ..., 10.   0.   0.]  
  4.  [ 0.   0.   0. ..., 16.   9.   0.]  
  5.  ...,  
  6.  [ 0.   0.   1. ...,  6.   0.   0.]  
  7.  [ 0.   0.   2. ..., 12.   0.   0.]  
  8.  [ 0.   0.  10. ..., 12.   1.   0.]]  

digits.target则给出数字数据集的基本情况,也就是每张数字图像对应的编号。

[python] view plaincopyprint?
  1. >>> digits.target  
  2. array([012, ..., 898])  

数据数列的形状

尽管源数据形式各异,sklearn中的数据总是二维数列,有n_samplesn_features。在数字这个例子中,每一个样本都是8X8的规格。可由如下命令获取:

[python] view plaincopyprint?
  1. >>> digits.images[0]  
  2. array([[ 0.,   0.,   5.13.,   9.,   1.,  0.,   0.],  
  3.       [  0.,   0.13.,  15.,  10.15.,   5.,   0.],  
  4.       [  0.,   3.15.,   2.,   0.11.,   8.,   0.],  
  5.       [  0.,   4.12.,   0.,   0.,  8.,   8.,   0.],  
  6.       [  0.,   5.,  8.,   0.,   0.,  9.,   8.,   0.],  
  7.       [  0.,   4.11.,   0.,   1.12.,   7.,   0.],  
  8.       [  0.,   2.14.,   5.,  10.12.,   0.,   0.],  
  9.       [  0.,   0.,  6.,  13.,  10.,  0.,   0.,   0.]])  

这个简单的例子演示了如何将源数据转换为scikit-learn可以使用的数据。

1.3. 学习和预测

在数字数据集的例子中,给定一张图像,我们要去预测这个图像上的数字。已知有10个类别(从0到9),我们拟合估计器,让它去预测这个未知图像的类别。

在scikit-learn中,分类问题的估计器是一个Python对象。这个对象有两个方法,fit(X,y)以及predict(T)

以下是估计器的例子,sklearn.svm.SVC类实现了支持向量机分类。估计器的构造函数把模型的参量作为参数,不过目前为止,我们可以把估计器看作是一个黑匣子:

[python] view plaincopyprint?
  1. >>> from sklearn import svm  
  2. >>> clf = svm.SVC(gamma=0.001,C=100.)  

选择模型参数

在本例中,我们人为设置好gamma参数。当然自动为参数赋值也是有可能的,比如用网格搜索和交叉检验。

我们将估计器的实例命名为clf。现在它必须和模型拟合,也就是说,要从模型中将它学习出来。要做到这一点,可以将训练集数据传递给fit方法。以下我们将使用训练集中除了最后一张外所有的图像。

[python] view plaincopyprint?
  1. >>> clf.fit(digits.data[:-1],digits.target[:-1])   
  2. SVC(C=100.0, cache_size=200,class_weight=None, coef0=0.0, degree=3,  
  3.  gamma=0.001, kernel='rbf', max_iter=-1, probability=False,shrinking=True,  
  4.  tol=0.001, verbose=False)  
现在你可以预测新的值了,也就是说我们可以让分类器告诉我们该数据集最后一张图像的数字是什么(也就是没用来训练分类器的那张)。

[python] view plaincopyprint?
  1. >>> clf.predict(digits.data[-1])  
  2. array([8])  

图像如下:


如你所见,任务颇具挑战性:图像分辨度很低。你同意分类器的结论吗?

你可以运行并学习这个分类问题的完整例子:手写数字识别

 1.4. 模型持久化

可以用Python内建的持久化模型pickle将scikit的模型保存。

[python] view plaincopyprint?
  1. >>> from sklearn import svm  
  2. >>> from sklearn import datasets  
  3. >>> clf = svm.SVC()  
  4. >>> iris = datasets.load_iris()  
  5. >>> X, y = iris.data, iris.target  
  6. >>> clf.fit(X, y)   
  7. SVC(C=1.0, cache_size=200,class_weight=None, coef0=0.0, degree=3, gamma=0.0,  
  8.  kernel='rbf', max_iter=-1, probability=False, shrinking=True, tol=0.001,  
  9.  verbose=False)  
  10.    
  11. >>> import pickle  
  12. >>> s = pickle.dumps(clf)  
  13. >>> clf2 = pickle.loads(s)  
  14. >>> clf2.predict(X[0])  
  15. array([0])  
  16. >>> y[0]  
  17. 0  

在某些情况下,用joblib代替pickle可能更有意思(joblib.dump &joblib.load),因为对于大数据它效率更高,但只能保存在硬盘上,不能保存为字符串。

[python] view plaincopyprint?
  1. >>> from sklearn.externals importjoblib  
  2. >>> joblib.dump(clf,'filename.pkl')  
原创粉丝点击