Documentation of scikit-learn 0.17

准备学习一下Machinelearning,看到Python中sk-learn这个库挺不错的,准备用它试试手。
顺便翻译一下文档


学习及预测

在数字数据集的情况下,给定一个数字图片用于预测。样本分为十个等级(即数字零到数字九),我们通过匹配一个规则来预测未出现的样本属于哪个等级。
在sk-learn,归类规则为一个Python对象,使用fit(X,y)predict(T)方法来实现。

一个规则的例子就是sklearn.svm.SVC支持向量机。规则的组成即模型的参数,但仅目前来说,我们把此规则视为一个黑箱。

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

挑选模型参数
在本例中我们手动设置gamma值。也可以使用一些如grid search和cross validation的工具自动寻找合适的参数值。

定义我们的规则为clf,它必须符合我们的模型,从模型中进行学习。训练集数据为除了最后一个外的所有数据。Python语法为[:-1]

1
2
3
4
5
>>> clf.fit(digits.data[:-1], digits.target[:-1])
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma=0.001, kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

现在我们可以预测新值,测试询问我们的分类器测试集为哪个数字。

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

图片为:

如你所见,这是一个很有挑战性的工作,此图十分棘手,你同意分类器的结果吗?

持久模型

你可以使用Python内建持久化模块pickle来对scikit中的模型进行保存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> 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,
decision_function_shape=None, degree=3, gamma='auto', 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

在某些特殊情况下,使用joblib(joblib.dump & joblib.load)来替代pickle对大数据集更有效率:

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

之后你可以载入pickled模型(在另一Python进程中)通过:

1
>>> clf = joblib.load('filename.pkl')

NOTE:joblib.dump返回一个文件名列表。在clf对象中每个独立的numpy数组在文件系统中被序列化为独立的文件。所有在同一目录下的文件在被joblib.load读取模型时都被用到。

需注意的是,pickle有一些安全及可维护性的问题。请参照 持久模型 一节了解sk-learn中关于此类的更多信息。

常用惯例

sk-learn 估计量遵循一些确定的规则使其预测。

  • 类型转换
    除其他特殊情况,输入类型为 float64
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> 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')

在此例中,X是float32,之后通过fit_transform(X)转化为float64

回归分析目标被转化为float64,归类目标则使用如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> from sklearn import datasets
>>> from sklearn.svm import SVC
>>> iris = datasets.load_iris()
>>> clf = SVC()
>>> clf.fit(iris.data, iris.target)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> list(clf.predict(iris.data[:3]))
[0, 0, 0]
>>> clf.fit(iris.data, iris.target_names[iris.target])
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> list(clf.predict(iris.data[:3]))
['setosa', 'setosa', 'setosa']

在这里,第一个predict()返回一个整型队列,因为iris.target(一个整型队列)被用在fit中。第二个predict返回一个字符串队列,因为iris.target_names被用于匹配。

  • 改装和升级参数

模拟器的超参数可以在通过使用 sklearn.pipeline.Pipeline.set_params 方法建成后进行升级。多次使用fit()将覆盖之前fit()学习到的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> import numpy as np
>>> from sklearn.svm import SVC
>>> rng = np.random.RandomState(0)
>>> X = rng.rand(100, 10)
>>> y = rng.binomial(1, 0.5, 100)
>>> X_test = rng.rand(5, 10)
>>> clf = SVC()
>>> clf.set_params(kernel='linear').fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='linear',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> clf.predict(X_test)
array([1, 0, 1, 1, 0])
>>> clf.set_params(kernel='rbf').fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> clf.predict(X_test)
array([0, 0, 0, 1, 0])

在这里,默认kernal rbf 在模拟器通过SVC()建立之后一开始被改为 linear,之后被改回rbf以重新训练模拟器并做下次预测。

未完待续,有空再更。

Yumin Huang wechat
快来订阅我的公众号吧-,-
坚持原创分享,来支持一下作者吧~