Scikit-learn学习笔记(一)
这段时间在学习机器学习相关的知识,一方面要学习理论知识,另一方面还要不断的练习和实践,只有不断的实践才能真正地掌握和理解这些理论知识。在众多编程语言中,python具有独特的优势,也是机器学习领域使用最多的语言之一,因为其语法简洁、可移植性好以及快速迭代的优势,使其成为机器学习各种算法实现的最佳载体之一,scikit-learn是python版的机器学习库,其内部实现了众多常用的机器学习算法,受到许多机器学习爱好者的青睐。
1. scikit-learn简介
自2007年发布以来,scikit-learn已经成为最给力的Python机器学习库(library)了。scikit-learn支持的机器学习算法包括分类,回归,降维和聚类。还有一些特征提取(extracting features)、数据处理(processing data)和模型评估(evaluating models)的模块。作为Scipy库的扩展,scikit-learn也是建立在Python的NumPy和matplotlib库基础之上。NumPy可以让Python支持大量多维矩阵数据的高效操作,matplotlib提供了可视化工具,SciPy带有许多科学计算的模型。
scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。开发者用scikit-learn实验不同的算法,只要几行代码就可以搞定。scikit-learn包括许多知名的机器学习算法的实现,包括LIBSVM和LIBLINEAR。还封装了其他的Python库,如自然语言处理的NLTK库。另外,scikit-learn内置了大量数据集,允许开发者集中于算法设计,节省获取和整理数据集的时间。
scikit-learn可以不受任何限制,遵从*的BSD授权。许多scikit-learn的算法都可以快速执行而且可扩展,除了海量数据集以外。最后,scikit-learn稳定性很好,大部分代码都可以通过Python的自动化测试(mock,nose等)。
2. 安装scikit-learn
目前scikit-learn的稳定版本是0.17.1。用这个版本可以保证本书的代码可以正常运行,如果你之前装过,可以检查一下版本:
In [3]:
import sklearn
sklearn.__version__
Out[3]:
'0.17.1'
如果你还没安装,你可以通过pip安装,也可以从源代码安装。下面我们简单介绍一下Windows,Linux和Mac OS系统分别安装的过程,具体内容可以从官方网站 (http://scikitlearn.org/dev/install.html)找到。Python版本需要是Python (>= 2.6 or >= 3.3),NumPy (>= 1.6.1),SciPy (>= 0.9)。
2.1 Windows系统安装
强烈建议使用miniconda (http://conda.pydata.org/miniconda.html)安装,可以根据Windows系统版
本和想要的Python版本选择下载安装。
miniconda会自动安装scikit-learn的依赖包,如NumPy和SciPy等。双击安装文件安装miniconda,之后在命令行工具输入下列指令:
conda install scikit-learn
确实之后一会儿就安装完了,如果要更新版本,直接输入:
conda update scikit-learn
如果已经装好了Python,Numpy和Scipy,可以用pip安装(Python 2.7.9和Python3.4自带):
pip install -U scikit-learn
如果想从源代码编译scikit-learn,请参阅官方最新文档,可以从GitHub下载最新代码
(https://github.com/scikit-learn/ scikit-learn)。
2.2 Linux系统安装
Linux系统安装由你的发行版决定。最好的方法是用pip安装,也可以通过源代码编译安装。下面以Ubuntu 14.10为例:
pip安装很简单:
sudo pip install -U scikit-learn
源代码安装需要一堆依赖:
sudo apt-get install python-dev python-numpy python-numpy-dev pyth
onsetuptools python-numpy-dev python-scipy libatlas-dev g++
然后执行命令:
python setup.py install
2.3 Mac OS系统安装
直接用pip很简单:
pip install -U numpy scipy scikit-learn
安装版本检验装完之后,就可以像前面那样检验一下版本:
In [3]:
import sklearn
sklearn.__version__
Out[3]:
'0.17.1'
要执行scikit-learn的单元测试,首先要安装nose库,然后运行:
nosetests -v sklearn
这样scikit-learn就安装好了。
安装pandas和matplotlib库本书还会用到pandas (http://pandas.pydata.org/pandas-docs/stable/index.html)库,是一个开源Python数据分析工具。Windows,Linux和Mac OS系统都可以用pip安装:
pip install pandas
如果安装了miniconda,也可以用conda命令安装。
在Debian-和Ubuntu-系统上也可以通过apt-get命令安装:
apt-get install python-pandas
matplotlib (http://matplotlib.org/)是一个图形库,可以很容易的创建点图,直方图,曲线图等不同样式的图形。matplotlib的依赖关系和pandas一样,都需要Numpy。前面已经装过了,一样可以通过pip或conda安装,在Debian-和Ubuntu-系统上也可以通过apt-get命令安装:
apt-get install python-matplotlib
Windows和Mac OS系统系统上也有可执行文件可以安装。
4. 机器学习简介(scikit-learn )
4.1 机器学习:问题的设定
通常,一个机器学习问题是给定样本数据集,然后尝试预测未知数据的属性,如果每个样本超过单个数值,例如,一组多维的输入值,就称其有多个属性或特征。
我们可以将学习问题分为几大类:
监督学习:监督学习是对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。这里,所有的标记(分类)是已知的。
其还可以在分:
–分类:样本数据属于两类或者多类,我们想要从带类别标记的数据中学习,并预测未知数据的类别。一个分类问题的例子就是手写数字识别的例子。
–回归:如果输出数据时由一系列连续的变量组成,我们称这个任务为回归。回归问题的一个例子是根据鲑鱼的年龄和重量来预测鲑鱼的长度。
非监督学习:对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。这里,所有的标记(分类)是未知的。这种问题的目标是发现数据样本聚集的相似性,那就称其为聚类;或在输入空间内决定数据的分布,其就是密度估计;或是将高维的数据降维到二维或者三维,以便进行数据可视化。
*训练集、测试集、验证集*
训练集:训练集是用来学习的样本集,通过匹配一些参数来建立一个模型(如:分类器)
测试集:测试集纯粹是为了测试已经训练好的模型的分类能力的样本集。
验证集:验证集是用来调整分类器的参数的样本集,比如在神经网络中选择隐藏单元数。验证集还用来确定网络结构或者控制模型复杂程度的参数。
4.2 加载样本数据集
scikit-learn本身内置了一些标准的数据集,例如:鸢尾花和数字数据集用于分类,还有波士顿房屋价格数据集用来做回归。
接下来用Python 语言来实现加载这些数据集(iris和digits)
$ python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()
样本数据存储在.data的成员中,其是一个二维数组,行代表某个样本,列代表特征。.target成员存储的是与之相对应的类别。
>>> 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
array([0, 1, 2, ..., 8, 9, 8])
每个数字的例子中,每个样本是将数字的图片先转化为灰度图片,然后存储为8x8的数组。
>>> 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.]])
4.3 学习和预测
在数字数据集中,我们的任务是给定一张数字图片,然后预测对应的数字。
在scikit-learn中,我们通过fit(X, y)来训练模型,predict(T)来预测未知样本的类别。
>>> from sklearn import svm
>>> clf = svm.SVC(gamma=0.001, C=100.)
模型参数的选择
在这个示例中,我们设置了gamma参数的值,一个可能的更好的方法是自动选择参数,通过使用例如交叉验证来实现。
4.4 训练模型的保存
当然,训练好模型,我们希望保存模型,可以使用Python的一个模块叫做 pickle:
>>> clf.fit(digits.data[:-1], digits.target[:-1])
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.001, kernel='rbf', max_iter=-1, probability=False,
random_state=None, shrinking=True, tol=0.001, verbose=False)
>>> clf.predict(digits.data[-1])
array([8])
>>> 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, degree=3, gamma=0.0,
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])
array([0])
>>> y[0]
0
在scikit的特定例子中,使用joblib来取代pickle,前者在大数据下更高效。
>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'filename.pkl')
>>> clf = joblib.load('filename.pkl')
5. 总结
通过对scikit-learn的简单了解、安装以及简单示例的练习,算是入门了。后面一方面要学习机器学习的理论知识,一方面通过scikit-learn来不断的练习和实践机器学习的理论,总之,理论+实践+持之以恒的学习就可以掌握机器学习相关的知识。希望与大家共同进步!