近期学着用python机器学习库Scikit-learn做一些小项目,翻文档时豁然发现,这篇用户手册它不仅仅是一篇用户手册,还集成了很多贴心的机器人生小感悟啊。于是便有了翻译她这个很小冒的念头。当然作为一名有追求的机器学习者,是不能做逐字逐句的翻译这种一下子就被识破的事情,所以决定。。几句并一句的翻,机智如我。
一: 当我们遇到一个机器学习问题
就解决问题而言,机器学习的思想与小学时候做的应用题并无两样,首先,需要清楚想要求解什么,其次,理清你的已知条件是什么,然后想方设法利用你的已知条件去得到结果。
So,根据机器学习想要的结果。可以把问题分为:分类/聚类问题,或者是回归问题。
分类和聚类:如给成绩分个A/B/C,数学语言为离散。
回归:不给分等,但是要求有具体成绩,是69.0、还是80.9. 数学语言为连续。
当然分类和聚类又有区别,如果事先告诉电脑80以上就是A,70-80就是B,它只用老老实实照着这个给定标准来,这就是分类。但是如果这次考试很难,老师也不知道大家考的怎么样啊,然后就说电脑你随便分吧,只要把成绩相近的放一起,然后分出三个等级出来,这就是聚类了。用机器学习的语言就是,分类模型给电脑的学习数据是有标签的,俗称label。而聚类的没有。
二:那就加载一个数据集看看吧
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.]]
datasets是一个字典格式的数据集,包含了数据的信息以及他们的元数据信息,比如:
load_iris(): 那朵著名的鸾尾花的数据
load_digits(): 可用于训练的数字图片数据集
digits.data: 数据集的特征,也就是矩阵X
digits.target: 数据集的标签,也就是矩阵y
data始终会是个二维矩阵,每一行是个样本,每一列是特征。每个样本的其它具体数据可以通过其它的方式得到。如:
digits.image[0]:第一张图片的数据信息,print一下可发现是个8*8维的数据
三:我们的目标是--争当最强算命师(学习与预测)
有了一堆X,还有了y,现在要做的就是找到一个适当的模型,输入X, 然后输出y。再给一个没见过的X,猜出y。sklearn里这两步基本就是通过fit()和predict()来做了,对于每个模型都如此。相信他们是为了更人性,绝对不是因为偷懒。举例:
<span style="font-size:14px;">from sklearn import svm
</span>
<span style="font-size:14px;">#建立一个新模型
clf = svm.SVC(gamma=0.001, C=100.)</span>
<span style="font-size:14px;">#喂入数据,为了验证模型的有效性,把最后一个样本去掉,以便在下一步用于预测
clf.fit(digits.data[:-1], digits.target[:-1])</span>
<span style="font-size:14px;">#clf已经是个训练好的模型了,将最后一个数据放入其预测函数
clf.predict(digits.data[-1])</span>
这个模型你已经满意了,现在当然是希望能把它保存起来,否则每次都要重新训练,想想就很累啊。
import pickle
from sklearn.externals import joblib
#存入变量
s = pickle.dumps(clf)
#load回来
clf2 = pickle.loads(s)
#存入文件
joblib.dump(clf, 'whatever.pkl')
#load回来
clf = joblib.load('whatever.pkl')
使用joblib时,存下的是一系列的文件,包括每个变量。load的时候也要保证这堆东西还在一起。