机器学习(Machine Learning)根据已知数据来不断学习和积累经验,然后总结出规律并尝试预测未知数据的属性,是一门综合性非常强的多领域交叉学科,涉及线性代数、概率论、逼近论、凸分析、算法复杂度理论等多门学科。
目前机器学习已经有了十分广泛的应用,例如数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人运用。
总体上说,机器学习算法和问题可以分为有监督学习和无监督学习两大类。
在有监督学习中,数据带有额外的属性(例如每个样本所属的类别),必须同时包含输入和输出(也就是特征和目标),通过大量已知的数据不断训练和减少错误来提高认知能力,最后根据积累的经验去预测未知数据的属性。分类和回归属于经典的有监督学习算法。在分类算法中,样本属于两个或多个离散的类别之一,我们根据已贴标签的样本来学习如何预测未贴标签样本所属的类别。如果预期的输出是一个或多个连续变量,则分类问题变为回归问题。
在无监督学习算法中,训练数据包含一组输入向量而没有任何相应的目标值。这类算法的目标可能是发现原始数据中相似样本的组合(称作聚类),或者确定数据的分布(称作密度估计),或者把数据从高维空间投影到二维或三维空间(称作降维)以便进行可视化。
一般地,不会把给定的整个数据集都用来训练模型,而是将其分成训练集和测试集两部分,模型使用训练集进行训练(或学习),然后把测试集输入训练好的模型并评估其表现。另外,大多数模型都有若干参数可以设置,例如支持向量机模型的gamma参数,这些参数可以手动设置,也可以使用网格搜索(grid search)和交叉验证(cross validation)寻找合适的值。
接下来,我们一起了解一下机器学习中常见的几个概念。
(1)一维数组
一般用来表示向量,其shape属性的长度为1。例如
>>> import numpy as np
>>> data = np.array([1, 2, 3, 4, 5])
>>> data
array([1, 2, 3, 4, 5])
>>> data.shape
(5,)
>>> len(data.shape)
1
(2)二维数组
一般用来表示矩阵,其shape属性的长度为2。例如
>>> import numpy as np
>>> data = np.array([[1,2,3], [4,5,6]])
>>> data
array([[1, 2, 3],
[4, 5, 6]])
>>> data.shape
(2, 3)
>>> len(data.shape)
2
(3)可调用对象
在Python中,可调用对象主要包括函数(function)、lambda表达式、类(class)、类的方法(method)、实现了特殊方法__call__()的类的对象,这些对象作为内置函数callable()的参数都会使得该函数返回True。
(4)维度
一般指特征的数量,或者二维特征矩阵中列的数量,也是特定问题中每个样本特征向量的长度。
(5)早停法(early stopping)
把数据集分成训练集和测试集,使用训练集对模型进行训练,并周期性地使用测试集对模型进行验证,如果模型在测试集上的表现开始变差就停止训练,避免过拟合问题。
(6)评估度量(evaluation metrics)
评估度量用来测量模型的表现有多好,也常指metrics模块中的函数。
(7)特征(feature)、特征向量(feature vector)
抽象地讲,特征是用来把一个样本对象映射到一个数字或类别的函数,也常用来表示这些数字或类别(即一个样本若干特征组成的特征向量中的每个分量)。在数据矩阵中,特征表示为列,每列包含把一个特征函数应用到一组样本上的结果,每行表示一个样本若干特征组成的特征向量。
(8)拟合(fit)
拟合泛指一类数据处理的方式,包括回归、插值、逼近。简单地说,对于平面上若干已知点,拟合是构造一条光滑曲线,使得该曲线与这些点的分布最接近,曲线在整体上靠近这些点,使得某种意义下的误差最小。插值是拟合的特殊情况,曲线经过所有的已知点。回归一般是先提前假设曲线的形状,然后计算回归系数使得某种意义下误差最小。在scikit-learn库中,评估器的fit()方法用来根据给定的数据对模型进行训练和拟合。
(9)填充算法(imputation algorithms)
大多数机器学习算法要求输入没有缺失值,否则无法正常工作。试图填充缺失值的算法称作填充算法或插补算法。
(10)数据泄露(Data Leakage)
预测器在训练时使用了在实际预测时不可用的数据特征,或者误把预测结果的一部分甚至根据预测结果才能得到的结论当作特征,从而导致模型看起来非常精确但在实际使用中的表现却很差,此时称作存在数据泄露。如果发现建立的模型非常精确,很可能存在数据泄露,应仔细检查与目标target相关的特征。
(11)样本(sample)
通常用来表示单个特征向量,其中每个分量表示样本的一个特征,这些特征组成的特征向量准确地描述了一个样本并区别于其他样本。
(12)半监督学习(semi-supervised learning)
在训练模型时,可能会遇到只有部分训练数据带有标签或理想值,这种情况称作半监督学习。在半监督学习中,一般给没有标签的样本统一设置标签为-1。
(13)稀疏矩阵(sparse matrix)
其中大多数元素为0的二维数值型矩阵,扩展库scipy.sparse中实现了稀疏矩阵的高效表示、存储和相关运算。
(14)有监督学习(supervised learning)
在训练模型时,如果每个样本都有预期的标签或理想值,称作有监督学习。
(15)目标(target)
有监督学习或半监督学习中的因变量,一般作为y传递给评估器的fit()方法,也称作结果变量、理想值或标签。
(16)无监督学习(unsupervised learning)
在训练模型时,如果每个样本都没有预期的标签或理想值,称作无监督学习,例如聚类和离群值检测。在无监督学习算法中,会忽略传递的任何y值。
(17)分类器(classifier)
具有有限个可能的离散值作为结果的有监督(或半监督)预测器。对于特定的输入样本,分类器总能给出有限离散值中的一个作为结果。
(18)聚类器(clusterer)
属于无监督学习算法,具有有限个离散的输出结果。聚类器必须提供的方法有fit()。另外,直推式聚类器应具有fit_predict()方法,归纳式聚类器应具有predict()方法。
(19)评估器(estimator)
表示一个模型以及这个模型被训练和评估的方式,例如分类器、回归器、聚类器。
(20)特征提取器(feature extractor)
把样本映射到固定长度数组形式数据(如numpy数组、Python列表、元组以及只包含数值的pandas.DataFrame和pandas.Series对象)的转换器,至少提供fit()、transform()和get_feature_names()方法。
(21)离群点检测(outlier detector)
区分核心样本和偏远样本的无监督二分预测器。
(22)预测器(predictor)
支持predict()和/或fit_predict()方法的评估器,包括分类器、回归器、离群点检测器和聚类器。
(23)回归器(regressor)
处理连续输出值的有监督(或半监督)预测器。回归器通常继承自base.RegressorMixin,支持fit()、predict()和score()方法,作为is_regressor()函数的参数时使得该函数返回值为True。
(24)转换器(transformer)
支持transform()和/或fit_transform()方法的评估器。类似于manifold.TSNE的纯直推式转换器可能没有实现transform()方法。
(25)交叉验证生成器(cross-validation generator)
用来把数据集分成训练集和测试集部分,提供split()和get_n_splits()方法,不提供fit()、set_params()/get_params()方法,不属于评估器。
(26)交叉验证评估器(cross-validation estimator)
具有内置的交叉验证能力、能够自动选择最佳超参数的评估器,例如ElasticNetCV和LogisticRegressionCV。
(27)评分器(scorer)
可调用对象,不属于评估器,使用给定的测试数据评价评估器,返回一个数值,数值越大表示评估器的性能或表现越好。
(28)损失函数(loss function)
用来计算单个样本的预测结果与实际值之间误差的函数。
(29)代价函数(cost function)
用来计算整个训练集上所有样本的预测结果与实际值之间误差平均值的函数,值越小表示模型的鲁棒性越好,预测结果越准确。
(30)目标函数(objective function)
目标函数=代价函数+正则化项。
(31)风险函数(risk function)
损失函数的期望。
(32)坐标下降法(coordinate descent)
算法在每次迭代中在当前位置沿某个坐标的方向进行一维搜索和优化以求得函数的局部极小值,在整个过程中循环使用不同的坐标方向。如果在某次迭代中函数没有得到优化,说明已经达到一个驻点。
(33)梯度下降法(gradient descent)
对于可微函数,其在每个方向上的偏导数组成的向量称作梯度,梯度的方向表示变化的方向,梯度的模长或幅度表示变化的快慢。在求解机器学习算法的模型参数时,梯度下降是经常使用的方法之一。在求解损失函数的最小值时,可以通过梯度下降法进行迭代求解,沿梯度的反方向进行搜索,当梯度向量的幅度接近0时终止迭代,最终得到最小化的损失函数和模型参数值。