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/