准备学习一下Machinelearning,看到Python中sk-learn这个库挺不错的,准备用它试试手。
顺便翻译一下文档。
学习及预测
在数字数据集的情况下,给定一个数字图片用于预测。样本分为十个等级(即数字零到数字九),我们通过匹配一个规则来预测未出现的样本属于哪个等级。
在sk-learn,归类规则为一个Python对象,使用fit(X,y)和predict(T)方法来实现。
一个规则的例子就是sklearn.svm.SVC即支持向量机。规则的组成即模型的参数,但仅目前来说,我们把此规则视为一个黑箱。
挑选模型参数
在本例中我们手动设置gamma值。也可以使用一些如grid search和cross validation的工具自动寻找合适的参数值。
定义我们的规则为clf,它必须符合我们的模型,从模型中进行学习。训练集数据为除了最后一个外的所有数据。Python语法为[:-1]。
现在我们可以预测新值,测试询问我们的分类器测试集为哪个数字。
图片为:
如你所见,这是一个很有挑战性的工作,此图十分棘手,你同意分类器的结果吗?
持久模型
你可以使用Python内建持久化模块pickle来对scikit中的模型进行保存:
在某些特殊情况下,使用joblib(joblib.dump & joblib.load)来替代pickle对大数据集更有效率:
之后你可以载入pickled模型(在另一Python进程中)通过:
NOTE:joblib.dump返回一个文件名列表。在clf对象中每个独立的numpy数组在文件系统中被序列化为独立的文件。所有在同一目录下的文件在被joblib.load读取模型时都被用到。
需注意的是,pickle有一些安全及可维护性的问题。请参照 持久模型 一节了解sk-learn中关于此类的更多信息。
常用惯例
sk-learn 估计量遵循一些确定的规则使其预测。
- 类型转换
除其他特殊情况,输入类型为 float64:12345678910111213import numpy as npfrom sklearn import random_projection0)rng = np.random.RandomState(10, 2000)X = rng.rand('float32')X = np.array(X, dtype=X.dtypedtype('float32')transformer = random_projection.GaussianRandomProjection()X_new = transformer.fit_transform(X)X_new.dtypedtype('float64')
在此例中,X是float32,之后通过fit_transform(X)转化为float64。
回归分析目标被转化为float64,归类目标则使用如下方法:
在这里,第一个predict()返回一个整型队列,因为iris.target(一个整型队列)被用在fit中。第二个predict返回一个字符串队列,因为iris.target_names被用于匹配。
- 改装和升级参数
模拟器的超参数可以在通过使用 sklearn.pipeline.Pipeline.set_params 方法建成后进行升级。多次使用fit()将覆盖之前fit()学习到的内容:
在这里,默认kernal rbf 在模拟器通过SVC()建立之后一开始被改为 linear,之后被改回rbf以重新训练模拟器并做下次预测。