20140402

来源:互联网 发布:淘宝云客服能一直做吗 编辑:程序博客网 时间:2024/05/16 08:07

一个关于使用scikit-learn来机器学习的说明

章节内容

在本章节 我们解释一些用scikit-learn的机器学习相关词汇 给一个简单的学习例子


机器学习:问题设置

通常,学习问题要考虑设置很多样本数据,透过这些来试着预测未知数据的属性.如果每个样本不仅仅是个数字 例如 多维属性(多元数据) 就是有多个属性或特征


我们可以把问题分成几个大类别来学习:

督促学习,它的样本数据带着我们想要预测的附加属性:

分类: 样本基于2个或多个类型 我们想要学习从已标记的数据如何预测未标记数据的类型.一个分类问题的例子就是认出手写数字,他的目的是把每一个输入的向量分配给一个有限数目的离散类别之一.另一种理解分类的方法是把他看作是一个被提供样本数据有限定数目类别的监督学习的离散的方式 一种试着用正确的类别活分类去标记他们.

回归:如果期望的输出是由一个或者多个连续变量组成,那么这工作叫做回归.一个回归问题的例子是预测大马哈鱼的长度作为它年龄和重量的一个方法.

无监督学习(自由学习?),他的训练数据由一组没有相应对应值的输入向量x组成,目的是问题可能用数据发现多组相似的例子,这个也被叫做分类归并.或者从输入空间判断数据的分布,比如大家知道的密度估计,或者用来保护数据从高维空间降到2或3纬以达到可视化的目的


训练集和测试集

机器学习就是关于学习一种数据集的内容并将它应用到新数据.这就是为什么机器学习去评估一个算法的一个普遍练习是将手头上的数据分成2个集合,一个用来学习数据的内容叫做训练集,一个用来测试这些内容叫做测试集



加载一个示例数据集

scikit-learn 有一些标准的数据集,例如分类算法的虹膜数据集和数字数据集,还有回归算法的波士顿房价数据集:

>>> from sklearn import datasets>>> iris = datasets.load_iris()>>> digits = datasets.load_digits()

数据集是一个类字典对象包含了所有的数据和相关数据的元数据.数据被存放在.data成员中,是一个若干行,若干列的数组.被监督问题的一个例子,说明变量被存放在.target成员中.关于不同的数据集的更多介绍可以在dedicated section中找到


一个例子,数字数据集的一个例子,digits.data 给出了一访问特性可以分类数字样本

print digits.data

digits.target给数字数据集提供了表面真值,我们尝试学习让每个数字对应数字图片:

digits.target

数据数组的形状

数据总是一个二位数组,若干行,若干列,尽管原始数据可能有不同的形状.比如数字的一个例子,每个原始样品有一个8*8的形状图片,可以被存做这样:

digits.images[0]

学习和预测

在数字数据集的情况下,工作是去预测,给一个代表数字的图片做预测.我们已经得到了从我们可能10个可能类(0-9)中每一个样本,这些类用来作为可能预测未知样本的估计量.

在scikit-learn中,一个分类的估计量 是一个python对象方法去实现fit(x,y) 和predict(T)

图个估计量的例子是类sklearn.svm.SVC 实现支持向量分类.把一个估计量作为参数的函数模型这样的构造函数,但就现在而言,我们将把估计量作为一个黑盒:

>>> from sklearn import svm>>> clf = svm.SVC(gamma=0.001, C=100.)
选择模型的参数

在这个例子中我们手动设置gmama的值.它可能通过工具如frid search 或者cross validation 来自动的为参数找到好的值.


我们叫我们的估计量实例clf是一个类选择器.他现在必须和模型匹配,就是他必须从模型学习,这项工作是通过我们的训练设置去匹配方法.作为一个训练集,我们使用所有的数据集图片除了最后一个

>>> clf.fit(digits.data[:-1], digits.target[:-1])
现在我们可以预测新的值,特别一提,我们可以问分类器在数据集中的最后一张图片是什么数字,就是我们没有用来训练分类器的那张.

clf.predict(digits.data[-1])

类似的图片如下:

../../_images/plot_digits_last_image_11.png

你可以看出来,这是一个有挑战性的工作:图片很难认.你同意分类器吗?

一个分类问题完成的例子你可以运行,学习:xxx网址


模型的持续化

可以在scikit中保存一个模型用python的内建函数模块 叫pickle:

>>> from sklearn import svm>>> from sklearn import datasets>>> clf = svm.SVC()>>> iris = datasets.load_iris()>>> X, y = iris.data, iris.target>>> clf.fit(X, y)  SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='rbf', max_iter=-1, probability=False, random_state=None,  shrinking=True, tol=0.001, verbose=False)>>> import pickle>>> s = pickle.dumps(clf)>>> clf2 = pickle.loads(s)>>> clf2.predict(X[0])array([0])>>> y[0]0
在一些scikit特别的例子中,使用joblib来代替pickle更有趣(joblib.dump&joblib.load),他更使用于大数据,但只能pickle后到磁盘不能是一个字符串.

>>> from sklearn.externals import joblib>>> joblib.dump(clf, 'filename.pkl') 

0 0
原创粉丝点击