machine learning - webdancer's Blog
机器学习入门
机器学习主要是设计和分析使计算机能够“学习”的算法,这些算法能从经验数据集中发现规律,并根据规律对未知数据做预测。
- 那么到底什么是学习呢?我的理解是:广义上来说, 学习就是程序能够根据经验提高自己性能,狭义上来说,从概率图模型的角度,一个完整的建模过程包括:表示,推断,学习,这里的学习就是确定模型中的参数。
- 经验数据:那么这些经验数据又从拿来呢?一般来说,可以是人手工整理的数据或是从网络中整理收集的数据。这些数据,或多或少都会混杂着人类的经验。例如:在图像分类的数据集中,可能图片已经由人类手工标注过了。
机器学习已经有了十分广泛的应用,例如:数据挖掘(CV)、计算机视觉(CV)、自然语言处理(NLP)、生物特征识别、搜索引擎(IR)、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人运用等。
Tom Mitchell 对机器学习经典的定义[1]:
A computer program is said to learn from experience E with respect to some class of tasks T and performace measure P, if its performance at tasks T, as measured by P, improves with experience E.
Herbert Simon认为:
Learning is any change in a system that produces a more or less permanent change in its capacity for adapting to its environment.
看以看出,机器学习描述中,涉及到三个基本方面:
- 任务T。我们要处理的是一个什么样的任务,是无人汽车设计问题,语言识别,还是人脸识别等等。我们必须对我们要处理的任务有一个清晰的认识。
- 性能标准P。我们使用什么样的标准来说明我们模型的好坏,这对我们后面设计学习的目标函数时候有指导作用,我们根据标准P来设计和调整模型,满足我们的任务要求。
- 训练经验E。从那里获取训练经验可能对我们系统学习的好坏有非常直接的影响,必须自己选择。
模式识别是通过计算机算法来研究模式的自动处理和判读,也就是从数据中发现规律,并采取相应的动作。模式是指环境和客体,对人类来说,两类很重要的模式是光学和声学信号。现在模式识别的一个常用的手段就是机器学习。在AI领域的两个常见的问题是图像识别和语音识别。举例,一个经典的例子就是“手写字符识别“。我们设计一个learner从一个巨大的手写字符图片库中进行学习,当有新的手写字符图片时,我们希望我们的learner能够做出正确的判断。
两类问题-分类和回归
对于一般的机器学习问题,可以认为去估计一个函数f:X→Y.
两个基本问题是分类和回归问题:
- 分类问题输出Y是离散的,例如在二类问题中,输出值通常为:{−1,+1};
- 回归问题输出Y则是连续的,例如:在曲线拟合问题中,输出为:R。
分类问题关心的是类别是否匹配,代表每个类别的数字只是一个符号而已,可以换成任意其他符号,并且这些符号之间一般没有什么关系,例如,原本是数字 8 ,把它分类成 7 或者 2 都同样是错误的,并不会因为 7 (从数值上)更接近 8 就是一个更好的结果。在这种情况下,0-1 loss 是最自然的损失函数。而回归问题不一样,比如,今天的气温是 28 度,预测为 25 度很自然地比预测为 2 度要好。说白了就是分类问题中输出是离散的,用了离散度量来衡量相似度,而回归问题中则用了R上的欧氏度量。对于很多现实问题我们都可以转化为这两类问题。比如:在很多的Email系统中都可以判断一封邮件是否是垃圾邮件,这里涉及到了二类问题。如果我们希望根据以前的二手房成交数据来预测未来的交易价格,则是一个回归问题,我们希望得到的一个具体的价格。
模式识别问题的过程
学习过程中涉及到的名词:feature vector, target vector, data set, training set, test set,performance measure.
- feature vector: xi=(x1,x2,…,xm);
- target vector: yi=(y1,y2,….yk);
- data set: X=(x1,x2,…,xn);Y=(y1,y2,…,yn);
在上面的表示中,xi,yi分别表示一个实例的输入和输出;而xi则表示输入的某个特征。m表示输入变量的特征空间;k表示是一个多标签问题,k代表着标签的数目;n则是data set的数目。
- 首先,通常是特征提取和选择。特征提取就是将输入的数据转化为特征集合,从而得到特征向量。特征提取就是选择特征的一个子集。特征提取和选择是维度下降(dimension reduction)的主要方法;
- 然后,我们就要设计算法,实现一个学习器以满足不同的任务。通常要根据实际应用看是什么问题,从而选择不同的算法类型;
- 最后,在不同的数据集上评价我们的模型。
机器学习的不同类型
大多数的机器学习和模式识别识别算法在本质上是基于概率的,使用统计推断的方式给实例加标签。根据算法的不同,我们通常可以做一下的分类[2]:
- 监督学习。在监督学习中,训练集合(training set)中的实例是输入值和期望的输出值(通常是人们手工标注的标签或其他值)的二元组。在监督学习中,有训练集合得到一个分类器(分类问题)和回归函数(回归问题),能够对任何的有效输入值做出预测。
- 非监督学习。在非监督学习中,训练集合中的实例是由输入值构成的,没有输出值(标注的标签)。在半监督学习中,学习的目标是发现训练数据的结构特征。通常用到的算法有聚类等。
- 半监督学习。在半监督学习中,我们使用有标签数据(即上面所说的二元组形式)和无标签的数据一起来构建分类器。
- 增强式学习。在增强式学习中,关注在给出的环境中,采取恰当的措施,以取得最大的回报。它最重要的一个特征就是平衡exploration和exploitation的关系,取得一个最优的解。
- 其他
评价标准
- Accuracy. 指正确分类的数目占总的数目的比例,写成数学公式
Accuracy=righttotal
- Weighted Accuracy. 针对不同类型的错误,加上权值。根据不同的情况赋予不同的值,这样我们就能区别不同的错误。
- Precision and Recall。 这个衡量指标常用到文档检索中,查准率(Precision)表示了我们检索出的相关信息占我们检索出信息的比例;而查全率(Recall)则表示了我们检索出的相关信息在整个系统相关文档中的比例。
- F1. 把Precision 和 Recall 这两个指标结合起来的指标是F1 ,定义如下:
F1=2Precison+RecallPrecisiontimesRecall
- ROC(Receiver Operating Characteristic). ROC是最近很流行的一个评价指标,通过作ROC曲线,计算ROC面积,可以衡量模型作出的预测好坏。
泛化(generation)是指我们的学习器对新的输入的预测能力,如果能很好的处理新输入,则泛化能力好。我们之所以很注重泛化,是因为现实中输入空间是非常大的,我们的训练集只占其中的一小部分。所以在我们考虑实现ML算法的过程中,算法的泛化能力是我们必须考虑的,所以我们要把数据集划分出测试集,在测试集上测试模型的好坏。
实例:多项式曲线拟合
曲线的拟合问题,并不陌生,不管是高中还是大学的课堂中都有接触。在曲线拟合中,我们接触到了一个评价拟合好坏的标准:误差函数(Error Function)。误差函数主要是描述的是训练集中我们的预测值与实际值的差距。常用的误差函数就是平方差的和,如下:
E(w)=12N∑n=1{y(xn,w)−tn}2
求解的过程一般就是对函数求导,得到关于w的线性函数,从而可以得到一个解析解w∗。
为了考虑模型的泛化能力,我们需要在测试集上计算E(w)的值。在这里会出现一个问题:over-fitting。解决这个问题,经常使用的方法就是regularization,公式如下。
E(w)=12N∑n=1{y(xn,w)−tn}2+λ2‖
正则化的作用就是惩罚系数,可以使参数变得稀疏。
机器学习软件
现在有很多的机器学习的软件包,帮助我们快速解决问题,比如:
- python scikit-learn
- shogun toolbox
- mlpy
- pylearn2
- weka
- R
- others
当然,我们可能也要实现一些基本的算法,可能会使用具体的矩阵工具和优化工具,比如:
- matlab/octave
- numpy,scipy
- R
在我的笔记中,使用matlab和scikit-learn来演示实现和使用学习算法。
scikit-learn简介
1.数据(Data):在scikit-learn中,有一些自带的数据集,我们通常关注的是数据的特征和目标值。比如数字集合,获取特征和目标值,可以使用下面的代码:
1 2 3 4 | >>> from sklearn import datasets >>> digits = datasets.load_digits() >>> digits_data = digits.data >>> digits_target = digits.target |
如果使用‘type’查看一下digits_data和digits_target的类型,可以知道它们是numpy.ndarray类型,这样如果我们自己需要提取特征的时候,只需要保存为这种数据类型,就可以使用scikit-learn 中的方法了。
2.学习和预测:这时机器学习中最核心的部分,使用什么样的模型,确定了这种模型后,如何更快更准确的进行学习,如何改进模型,提高泛化的能力。在scikit-learn 中,进行分类(或是其他任物)的估算器(estimator)是实现了fit(X,Y)和predict(X)的python对象。
1 2 3 4 5 6 7 | >>> from sklearn import svm >>> clf = svm.SVC(gamma = 1e - 4 ,C = 100 ) >>> clf.fit(digits_data[: - 1 ],digits_target[: - 1 ]) SVC(C = 100 , cache_size = 200 , class_weight = None , coef0 = 0.0 , degree = 3 , gamma = 0.0001 , kernel = 'rbf' , max_iter = - 1 , probability = False , random_state = None , shrinking = True , tol = 0.001 , verbose = False ) >>> clf.predict(digits_data[ - 1 ],digits_target[ - 1 ]) |
如果想要保存我们训练的模型,可以使用python库中的pickle模块。
1 2 3 | >>> import pickle >>> model = pickle.dumps(clf) >>> clf2 = pickle.loads(model) |
引用
1.机器学习,<http://www.cs.cmu.edu/~tom/mlbook.html>
2.http://en.wikipedia.org/wiki/Machine_learning