在这部分,我们引入利用scikit-learn进行机器学习的常用单词,并给出一些简单的学习例子。
一般而言,一个学习问题处理一组包含n个样本的数据集,然后预测未知数据的属性。如果每个样本不止有一个数据,例如多维条目(又叫做多维数据),这种情况被称为拥有多组属性或特征。
我们可以将学习问题氛围几个大类:
监督学习:这类学习中数据包含我们想要预测的附加属性,这个问题可以被分为分类和回归。
分类问题:样本属于两个或者更多的类,我们通过学习已经加过标签的数据来预测未加标签的数据所属的类。手写体数字识别问题是一个分类问题的实例,其目的是将有限个输入向量分配到有限数目、离散的种类中。另外一种分类的理解方式可以认为分类是一种离散的监督学习。
回归:如果所希望的输出有一个或多个连续的随机变量组成,这种学习任务被称为回归。
一个回归的简单例子就是通过鲑鱼的年龄和体重的函数来预测鲑鱼的长度。
无监督学习:训练数据是由输入向量x组成的集合,该训练数据没有任何相关的目标值。在这类问题中,目标是发现数据集中相似样本族,这时该学习问题被称为聚类。或者判断在输入空间里数据分布情况,这时称为密度估计。或者将数据从高维空间映射到二维或三维空间中,称之为数据可视化问题。
训练集和测试集:机器学习是通过一组数据集学习一些属性,然后将他们应用到新的数据中。这是为什么在评价机器学习算法时,常见做法是将数据集分为两部分,一部分称之为训练数据,用于学习数据属性,一个称之为测试集合用来测试学习到的属性。
scikit-learn带有一些标准数据集,例如用于分类的iris和digits数据集,用于回归的bostonhouse prices数据集。
接下来我们从shell启动一个Python解释器,然后载入iris和digits数据集。我们的符号约定$表示shell提示,>>>表示Python解释器提示。
[python]view plaincopyprint?
$ python
>>>fromsklearnimportdatasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()
数据集是一个类似字典的对象,包含的所有数据和一些关于数据的元数据。数据存储在.data中,是个n_samples, n_features的数组。在监督问题的情况下,一个活多个相关变量存储在.target成员中。更多有关不同数据集合的细节可以在专门部分查找。
例如,在digits数据集情况下,digits.data提供了可用于分类数字样本的特征。
[python]view plaincopyprint?
>>>print(digits.data)
[[0.0.5....,0.0.0.]
[0.0.0....,10.0.0.]
[0.0.0....,16.9.0.]
...,
[0.0.1....,6.0.0.]
[0.0.2....,12.0.0.]
[0.0.10....,12.1.0.]]
并且digits.target给定了digit数据集的真实结果,每个数字对应于每个我们正在学习的图像。
[python]view plaincopyprint?
>>> digits.target
array([0,1,2, ...,8,9,8])
可以通过网址访问手写体数字样本集。
在digits数据集中,给定一幅手写数字的数字图像,任务是预测结果。我们被给定的样本有10类(是数字0到9),基于此我们建立一个估计方法能够预测我们没有见过的样本属于哪一类。
在scikit-learn中,分类的估计模型是一个实现了fit(x,y)函数和predict(T)函数的python对象。
估计模型的例子是在实现了支持向量机的类sklearn.svm.SVC。估计模型的构造函数带有模型参数,但是目前,我们将估计模型当做一个黑盒。
[python]view plaincopyprint?
>>>fromsklearnimportsvm
>>> clf = svm.SVC(gamma=0.001, C=100.)
我们将我们的估计模型实例clf成为一个分类器。它现在必定十分适合这个模型。我们通过将数据集传递给fit函数完成。作为训练集,除了最后一个样本,我们选择其余所有样本。我们通过python语句[:-1]选择样本,这条语句将从digits.data中产生一个除了最后一个样本的新数组。
[python]view plaincopyprint?
clf.fit(digits.data[:-1], digits.target[:-1])
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.001, kernel='rbf', max_iter=-1, probability=False,
random_state=None, shrinking=True, tol=0.001, verbose=False)
接下来我们可以预测新的输入值,特别是我们可以问分类器在digits数据集中最后一个我们在训练分类器是我们没有使用的图像是数字几.
图像相应的图像如下所示:
正如你所看到的,这是一个具有挑战性的任务:图像的分辨率都很低。你是否同意这个分类器呢?
有个完整的分类问题例子-手写数字识别-您可以运行和研究。