sklearn学习(一)

(第一次写自己的博客,第一次用markdown,很多基本操作和排版还不太会,大家多多见谅~)

机器学习:问题场景

一般来说,learning problems可以分为以下几类:

  • 监督学习(数据包含一些我们想要预测的属性),又分为以下几类:
    1.classification:样本数据有两个或是更多的分类,我们想从已标记的数据学习如何给没有分类的数据做标记。一个应用是手写数据识别。
    2.regression:我们所期望的输出包含一个或多个连续的变量。一个应用是根据三文鱼的年龄和重量预测其长度。
  • 无监督学习(数据包含一系列没有对应目标值的输入向量),其中包括clustering(探索一些有相似特征的数据),density estimation(决定数据在输入空间内的分布),以及数据降维(为了可视化将数据降为二维或三维)。

一般将数据集分为训练集和测试集。

装载一个样本数据集

sklearn有一些标准数据集,如iris和数字的分类数据集,还有波士顿房价的回归数据集。

接下来,演示装载iris和digits数据集:

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

一个数据集是一个类似于字典的对象,里面有一些数据和元数据。这些数据被存在.data中,这是一个有n个样本,n个特征的阵列。在监督学习的情形中,一个或多个响应向量被存储在.target中。

例如:
在这里插入图片描述
在这里插入图片描述

数据阵列的形状:
数据总是一个2D阵列,形状是(n_samples, n_features),尽管原始的数据可能会有不同的形状。在数字的例子中,每一个原来的样本都是一个(8,8)的图像,可以用下面的方式访问:
在这里插入图片描述
(也可以装载外部数据集进行相关操作)

学习和预测

在数字数据集的例子中,任务是预测给定图像所代表的数字。在scikit-learn中,分类的估计器是一个可以实现方法 fit(X, y)和predict(T)的Python对象。

一个估计器的例子是sklearn.svm.SVC,它实现了支持向量分类。估计器的构造函数需要一些模型参数。

现在,我们把估计器比作一个黑盒:

from sklearn import svm
clf = svm.SVC(gamma=0.001, C=100.)

clf这个分类估计器必须要与模型相适应,也就是说它必须从模型中学习,这步可以通过fit传递我们的训练集来完成。对于训练集,我们将使用数据集中的所有图像,除了最后一张是给预测结果保留而不被使用的。我们用python语法[:-1]挑选训练集,这样会产生一个包含所有digits.data中的除了最后一项的数据:

>>> clf.fit(digits.data[:-1], digits.target[:-1]) 

现在,我可以通过预测找到训练集中对应最后一个图像的最佳匹配。

>>> clf.predict(digits.data[-1:])
array([8])

对应的图像为:
在这里插入图片描述
显而易见的是这个图象的分辨率很低。

模型持久化

用python自带的pickle库可以将sklearn中的模型保存下来:

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC(gamma='scale')
>>> 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,
  decision_function_shape='ovr', degree=3, gamma='scale', 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:1])
array([0])
>>> y[0]
0

在sklearn中,用joblib替换pickle是一种对于大数据而言更高效的方法。

约定

sklearn中的估计器会遵循一些规则使得他们的行为更有预测性。

类型转换

除非有特殊的说明,否则输入会转换为float64.

重新fit和更新参数

一个估计器的超参数可以在被 set_params()构造后更新;
多次调用fit()会覆盖掉之前通过fit()学习得到的结果。

多类别vs多重标签 fitting(没太理解什么意思…)

使用multiclass分类器时,是依赖于fit时的目标数据类型的。如:

>>> from sklearn.svm import SVC
>>> from sklearn.multiclass import OneVsRestClassifier
>>> from sklearn.preprocessing import LabelBinarizer

>>> X = [[1, 2], [2, 4], [4, 5], [3, 2], [3, 1]]
>>> y = [0, 0, 1, 1, 2]

>>> classif = OneVsRestClassifier(estimator=SVC(gamma='scale',
...                                             random_state=0))
>>> classif.fit(X, y).predict(X)
array([0, 0, 1, 1, 2])

在上面的例子中,分类器适合于多类标签的一维数组,因此predict()方法提供了相应的多类预测。它也可以适合于二进制标签的二维数组指示器:

>>> y = LabelBinarizer().fit_transform(y)
>>> classif.fit(X, y).predict(X)
array([[1, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [0, 0, 0],
       [0, 0, 0]])

这里返回一个二维阵列来表示对应的多标签预测。

对于多标签输出:

>> from sklearn.preprocessing import MultiLabelBinarizer
>> y = [[0, 1], [0, 2], [1, 3], [0, 2, 3], [2, 4]]
>> y = MultiLabelBinarizer().fit_transform(y)
>> classif.fit(X, y).predict(X)
array([[1, 1, 0, 0, 0],
       [1, 0, 1, 0, 0],
       [0, 1, 0, 1, 0],
       [1, 0, 1, 1, 0],
       [0, 0, 1, 0, 1]])

在这种情况下,分类器根据每个实例的多个标签进行fit。MultiLabelBinarizer用于将二维多标签数组进行二进制化来进行fit。因此,predict()返回一个2d数组,每个实例都有多个预测标签。
(后半部分关于fit和predict的部分并没有看太懂,感觉如果有一些实例的话会比较好理解,然而要期中考试了…)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值