这个是scikit-learn的一个翻译,主要了方便自己记忆和学习,如果对您有用是我的幸运。
版本:0.17

机器学习:the problem setting

一般来说,机器学习问题考虑一组n的样本数据,然后试图预测未知数据的属性。如果数据不仅仅是简单的数字,它可能有多个属性或者维度;例如,aka的多维数据(aka multivariate data)

我们可以将机器学习分以下几个大类:

  • 监督学习:这些数据的属性有我们想预测的属性。这个机器学习可再分类为:
    • 分类算法:数据属于两个或多个分类,我们希望通过标记的数据来预测未标记的数据,分类问题的一个例子是手写数字识别的例子,目标是将每个输入向量分配给一个有限数目的离散的类别。分类的另一个理解是作为一个离散形式的监督学习在一个有限数量的类别和n的提供样品,试图用正确的类或类标签标记数据。
    • 回归算法:如果期望输出值由一个或多个连续的变量,那么这个任务称为回归,回归问题的一个例子是鲑鱼的长度的预测其年龄和体重的函数
  • 非监督学习:训练数据集是一组没有目标值的X值集合。以发现数据中相似数据的方法叫做聚类;确定空间分步的叫做密度分步;使数据形象化(visualization)把高级数据降成低维数据.

    训练数据集和测试数据集
    机器学习是从一些有属性的数据集中训练,并且将这个规律应用在新的数据集中。这是为什么在一个常见的机器中会把数据分成两分,一个叫做训练数据集,我们可以用它来进行学习;别外一个叫测试集合,我们可以用它来测试学习是否正确。

加载测试数据集

scikit-learn有一些标准的数据集,例如用于分类的鸢尾花数据和手指数据,用于回归的波士顿房价数据集。我们用$表示shell的命令行,用>>>表示Python的命令行。

1
2
3
4
$ python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()

一个数据集就是一个保存数据的对象,并且存有一定的元数据信息。数据存储在.data,which is a n_samples,n_featuresarray。在监督学习问题上,更多的结果变量存储在.target中。数据集间的不同可以点这里
例如在手指的数据集中,digits.data给出了手指的属性数据,可能用于对指手进行分类

1
2
3
4
5
6
7
8
>>> 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给出了手指分组后的数据,它代表了每个图形所学习的结果

1
2
>>> digits.target
array([0, 1, 2, ..., 8, 9, 8])

一组形状数据

这些数据一般是二维的数组,原始的数据可能有很不好的形状。这种手指的数据

1
2
3
4
5
6
7
8
9
>>> 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.]])

学习和预测

In the case of the digits dataset, the task is to predict, given an image, which digit it represents. We are given samples of each of the 10 possible classes (the digits zero through nine) on which we fit an estimator to be able to predict the classes to which unseen samples belong.
在scikit-learn中,评估分类的是一个实现了fit(X,y)和predict(T)方法的Python对象.**sklean.svm.SVC是一个实现上了 support vector classification的评估例子。评估的构造函数带有参数和模型,我们把这个评估当成一个黑合子

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

关闭模型参数

例子中我们手动设定了gamma参数。可以使用grid searchchross validation工具找到最优参建
我们使用一个clf的例子当一个分类器。我们必须安装这个模型,进行模型的训练。我们把训练数据集传入fit方法。我们使用训练数据集中的所有数据,除最后一个。我们使用[:-1]来获得训练数据集digits.data中除最后一个的数据:

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)

这样我们就可以使用digits数据集训练出来的数据进行预测了:

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

模型保存

可以使用Pythond的 built-in persistence model来保存模型

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

在scikit的某些情况,你可以使用joblib的方法(joblib.dump & joblib.load)来保存模型,它对大的数据是比较有效的,但是必须保存在磁盘上,不能生成一个字符串

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

稍后你可以加载模型

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

注:在pickle 保存模型时会有一些安全问题,请参照

约定

scikit-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方法把它转成float64
回归的结果转成float64,分类器的结果是maintained

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']

在调用fit方法返回itis.target对象,调用predict方法会返回一个整数数组。第二次调用predice返回一个字符串数组

更新参数

模型的参数 Hyper-parameters在构造函数执行完可通过sklearn.pipeline.Pipeline.set_params更新。调用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]

Here, the default kernel rbf is first changed to linear after the estimator has been constructed via SVC(), and changed back to rbf to refit the estimator and to make a second prediction.