sklearn官方教程01:scikit-learn机器学习简介及baseline

01scikit-learn机器学习简介

1.机器学习:问题设定

机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。
一种经常引用的英文定义是:A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
通常可分为监督学习与无监督学习:

  • 监督学习:训练数据带有我们要预测的其他属性。此类学习问题的目标通常为:分类回归

  • 无监督学习:训练数据由一组输入向量x组成,没有任何对应的目标值。此类学习问题的目标可能是:聚类密度估计降维

2.加载示例数据集

scikit-learn随附一些标准数据集,例如用于分类的iris和digits数据集和用于回归的the boston house prices 数据集。
数据集是一个类似字典的对象,它保存有关数据的所有数据和一些元数据。 该数据存储在 .data 成员中,它是 n_samples, n_features 数组。 在监督问题的情况下,一个或多个响应变量存储在 .target 成员中。

例如在digits数据集中,digits.data 使我们能够得到一些用于分类的样本特征;并且 digits.target 表示了数据集内每个数字的真实类别,也就是我们期望从每个手写数字图像中学得的相应的数字标记;digits数据集中每一张图片的特征矩阵都是shape(8,8)的。

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()
>>>> 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.]]
>>> print(digits.target)
array([0, 1, 2, ..., 8, 9, 8])
>>> print(digits.images[0])
array([[  0.,   0.,   5.,  13.,   9.,   1.,   0.,   0.],
       [  0.,   0.,  13.,  15.,  10.,  15.,   5.,   0.],
       [  0.,   3.,  15.,   2.,   0.,  11.,   8.,   0.],
       [  0.,   4.,  12.,   0.,   0.,   8.,   8.,   0.],
       [  0.,   5.,   8.,   0.,   0.,   9.,   8.,   0.],
       [  0.,   4.,  11.,   0.,   1.,  12.,   7.,   0.],
       [  0.,   2.,  14.,   5.,  10.,  12.,   0.,   0.],
       [  0.,   0.,   6.,  13.,  10.,   0.,   0.,   0.]])

3.学习和预测

对于digits数据集,任务是给出图像来预测其表示的数字。每个图像样本都有0~9这十种可能的分类结果,我们拟合一个估计器(estimator)来预测图像样本属于哪个类别。
在scikit-learn中,分类估计器是一个 Python 对象,它实现了 fit(X, y) 和 predict(T) 等方法。
估计器的一个例子类 sklearn.svm.SVC ,实现了 支持向量分类
在此,我们将估计器视为一个黑盒:

#建立一个估计器
>>> from sklearn import svm
>>> clf = svm.SVC(gamma=0.001, C=100.)

首先将用于分类的clf估计器拟合到模型(通过将训练集传递给估计器的fit方法);也就是说,它必须从模型中学习。
在此,我们将最后一张图片作为测试集,其余图片作为训练集。

#将估计器拟合到模型
>>> clf.fit(digits.data[:-1], digits.target[:-1])
SVC(C=100.0, gamma=0.001)

现在就可以使用估计器预测新的值了。我们可以向分类器询问 digits 数据集中最后一个图像(没有用来训练的一条实例)的数字是什么:

#预测图片结果
>>> clf.predict(digits.data[-1:])
array([8])

步骤小结:创建估计器—拟合模型—预测结果

选择模型参数:在此示例中,我们手动设置gamma值。要为这些参数找到合适的值,我们可以使用诸如网格搜索交叉验证之类的工具。

4.模型持久化(保存模型)

创建一个鸢尾花预测模型:

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> X, y = datasets.load_iris(return_X_y=True)
>>> clf.fit(X, y)
SVC()

持久化方法一(字符串方法):

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0:1])
array([0])
>>> y[0]
0

持久化方法二(硬盘方法):

>>> from joblib import dump, load
>>> dump(clf, 'filename.joblib')
>>> #即便在另一个Pyhon进程中,也可以加载
>>> clf = load('filename.joblib') 

5.规定

5.1数据类型转换

除非另有说明,输入将被转换为float64:

>>> import numpy as np
>>> from sklearn import random_projection

>>> rng = np.random.RandomState(0)
>>> X = rng.rand(10, 2000)
>>> X = np.array(X, dtype='float32')
>>> X.dtype
dtype('float32')

>>> transformer = random_projection.GaussianRandomProjection()
>>> X_new = transformer.fit_transform(X)
>>> X_new.dtype
dtype('float64')

输出:回归目标转为float64,分类目标维持不变:

>>> from sklearn import datasets
>>> from sklearn.svm import SVC
>>> iris = datasets.load_iris()
>>> clf = SVC()
>>> clf.fit(iris.data, iris.target)
SVC()

>>> list(clf.predict(iris.data[:3]))
[0, 0, 0]

>>> clf.fit(iris.data, iris.target_names[iris.target])
SVC()

>>> list(clf.predict(iris.data[:3]))
['setosa', 'setosa', 'setosa']

5.2再次训练与更新参数

估计器构造完成后,可以通过set_params()方法更新超参数。
fit()多次调用将覆盖以前任何学习的内容:

>>> import numpy as np
>>> from sklearn.datasets import load_iris
>>> from sklearn.svm import SVC
>>> X, y = load_iris(return_X_y=True)

>>> clf = SVC()
>>> clf.set_params(kernel='linear').fit(X, y)
SVC(kernel='linear')
>>> clf.predict(X[:5])
array([0, 0, 0, 0, 0])

>>> clf.set_params(kernel='rbf').fit(X, y)
SVC()
>>> clf.predict(X[:5])
array([0, 0, 0, 0, 0])

在此,估计器被SVC()构造之后,默认内核 ‘rbf’ 首先通过SVC.set_params() 改为 ‘linear’ ,然后改回到 ‘rbf’ 重新训练估计器并进行第二次预测。

5.3多分类和多标签拟合

当使用多类分类器时,执行的学习和预测任务 取决于拟合的目标数据的格式:

>>> 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(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]])

在此,分类器使用LabelBinarizer将目标向量 y 转化成二值化后的二维数组。predict()返回一个多标签预测相应 二维数组。
第四个和第五个实例返回全零向量,表明它们不能匹配用来训练中的目标标签中的任意一个。使用多标签输出,类似地可以为一个实例分配多个标签:


>>> 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, 0, 0],
       [1, 0, 1, 0, 0]])

在这种情况下,用来训练分类器的多个向量被赋予多个标记, MultiLabelBinarizer 用来二值化多个标签产生二维数组并用来训练。 predict() 函数返回带有多个标签的二维数组作为每个实例的结果。

翻译有参考: http://doc.codingdict.com/sklearn/68/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值