文章目录
1. 机器学习方法是什么?
机器学习方法是基于数据构建概率统计模型,从而对数据进行预测与分析。
官方一点的机器学习方法可以概括如下:
从给定的、有限的、用于学习的训练数据(training data)出发,假设数据是独立同分布产生的;并且假设要学习的模型属于某个函数集合,称为假设空间(hypothesis space);应用于某个评价准则(evaluation criterion),从假设空间中选取一个最优模型,使它对已知的训练数据及未知的测试数据(test data)在给定评价准则下有最优的预测;最优模型的选取由算法实现。
这样,机器学习方法包括:模型的假设空间,模型的选择准则以及模型的学习算法。称其为机器学习方法的三要素,简称为模型(model)、策略(stratery)、和算法(algorithm)。
机器学习方法之间的不同,主要就是来自于模型、策略、算法的不同,确定了模型、策略、算法,那么机器学习的方法也就确定了。
1.1 举个例子说明
举一个简单的例子来理解一下。给定一个训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},简单起见假设x、y均为实数,总共N个样本, x i ∈ X ⊆ R x_i\in\mathcal{X}\sube R xi∈X⊆R为实例的特征, y i ∈ Y ⊆ R y_i\in\mathcal{Y}\sube R yi∈Y⊆R为实例的标签, i=1,2,…,N。
- 模型:那么首先得确定选取什么样的模型去拟合x与y的关系?y为一个实数,那么应该选取一个回归模型,但是选择线性模型还是非线性模型?这就要通过分析数据集的特点,根据经验判断选择初步适合的模型。比如假设用线性模型 y = θ 0 + θ 1 x y=\theta_0+\theta_1x y=θ0+θ1x来拟合x与y之间的关系,那么模型的假设空间就是 θ 0 与 θ 1 取 任 何 值 下 模 型 的 集 合 \theta_0与\theta_1取任何值下模型的集合 θ0与θ1取任何值下模型的集合,也就是说现在假设的模型是 y = θ 0 + θ 1 x y=\theta_0+\theta_1x y=θ0+θ1x这种形式,但是还没开始学习,所以任何 θ 0 、 θ 1 \theta_0、 \theta_1 θ0、θ1的取值都是有可能是最优的。
- 学习策略:那么确定了模型的大概形式,下面就要找到假设空间里面最优的那个模型,不过假设空间里可能有无数个模型,如何判断哪个才是最优的呢?所以得先确定学习策略,就是学习的方向是什么。比如这里,回归可以用均方误差MSE作为学习策略。这么多个模型,谁拟合训练集时产生的MSE最小,那么就是最优秀的模型,最终输出的模型就是它。
- 优化算法:现在我们已经知道了什么样的模型是最优的,比如上面策略为MSE最小为最优。那么如何计算MSE最小时模型的参数值,也就是如何计算MSE最小时 θ 0 、 θ 1 \theta_0、 \theta_1 θ0、θ1的值?这就是最优化问题,我们需要通过优化算法来求解。比如常见的优化算法——梯度下降法,让 θ 0 、 θ 1 \theta_0、 \theta_1 θ0、θ1往使MSE变小的方向逐步更新,当MSE不再减小时会停止参数 θ 0 、 θ 1 \theta_0、 \theta_1 θ0、θ1的更新,最终输出最优模型 y = θ 0 ∗ + θ 1 ∗ x y=\theta_0^*+\theta_1^*x y=θ0∗+θ1∗x
1.2 为什么要假设数据是独立同分布的?
首先同分布,这个分布就是总体的分布,所有的数据都是从这个总体分布中独立产生的,包括未来的数据。
我们知道,机器学习就是利用当前获取到的信息(或数据)进行训练学习,用以对未来的数据进行预测、模拟。所以学习都是建立在历史数据之上,采用从历史数据上学习到的模型去拟合未来的数据。因此需要我们使用的历史数据具有总体的代表性。也就是说历史数据能代表总体,未来数据也是从总体中抽取的,所以学习到的模型适用于未来的数据。
为什么要有总体代表性?我们要从已有的数据(经验) 中总结出规律来对未知数据做决策,如果获取训练数据是不具有总体代表性的,就是特例的情况,那规律就会总结得不好或是错误,因为这些规律是由个例推算的,不具有推广的效果。不具有总体代表性的样本说明没有学习到总体的一般特征,那么学到的模型就不能适用于新的数据,因为新数据是从总体中产生的。
至于独立的假设,是因为后续我们预测也不会考虑输入样本之间的联系,都是独立输入进行预测的。所以假设学习的时候也是独立学习,没有学习到样本之间的联系。
2. 机器学习方法的三要素:模型、策略和算法
2.1 模型
机器学习首先要考虑的问题是学习什么样(形式)的模型。是监督学习还是无监督学习,是分类还是回归,是聚类还是降维等等,主要根据当前的任务以及数据的特征先初步确定要学习的模型。
2.1.1 常见的回归模型:
- Linear Regression(线性回归)
- Decision Tree Regressor(决策树回归)
- SVM Regressor(支持向量机回归)
- K Neighbors Regressor(K近邻回归)
- Random Forest Regressor(随机森林回归)
- Adaboost Regressor(Adaboost 回归)
- Gradient Boosting Random Forest Regressor(梯度增强随机森林回归)
- bagging Regressor(bagging 回归)
- ExtraTree Regressor(ExtraTree 回归)
2.1.2常见的二分类(一般只能用于二分类)模型:
- 逻辑回归(Logistic Regression)
- 感知机(Perceptron)
- 支持向量机(Support Vector Machine)
2.1.3常见的多分类(也可用于二分类)模型:
-
k最近邻(k-Nearest Neighbors)
-
决策树(Decision Trees)
-
朴素贝叶斯(Naive Bayes)
-
随机森林(Random Forest)
-
梯度Boosting(Gradient Boosting)
2.2 策略
2.2.1 损失函数、期望风险函数、经验风险函数、结构风险函数
学习策略就是从假设空间选取最优模型的依据,是用来衡量这个模型对训练集学的好不好的指标。首先引入损失函数和风险函数(也叫成本函数、代价函数)的概念。损失函数是度量模型一次预测的好坏,即度量一个样本产生的误差,但有时也用来指模型的整体误差。而风险函数度量的是所有样本产生的平均误差。
模型的目的是用来预测未知的新数据,那么一个模型好不好应该由在新数据上的表现好坏决定,即期望风险函数(新数据上的风险函数)的大小。然而对于新数据我们是未知的,无法计算期望风险函数,那么转而用经验风险函数(训练集上的风险函数)来代替,所以最终的目标就是经验风险函数最小化,这就是模型的学习策略。
但是用训练数据上的风险函数去代替新数据上的风险也会存在一定的问题,就是模型在训练集上学的太好了,导致学到了训练集上很多特质,产生了过拟合问题。所以一般需要对经验风险函数做一定的矫正,叫做正则化。带有正则化项的经验风险函数又称为结构风险函数,所以这时的学习策略为最小化结构风险函数。
2.2.2常见的损失函数
分类任务常用损失函数
- 0-1 Loss
- Cross Entropy Loss
- Hinge Loss
- Exponential Loss
- Modified Huber Loss
回归任务常用损失函数
- 均方误差MSE
- 平均绝对误差MAE
- Huber损失
- Log-Cosh损失
2.3 算法
现在知道了模型的形式以及模型的学习策略,即知道了模型具体长什么样,也知道了什么样的模型才是我们想要的,那么如何计算出想要的模型呢?或者说如何求解出最优模型的参数值。这就是优化问题,一般通过最小化经验风险函数或者结构风险函数求解。这时,机器学习问题可以归结为最优化问题,机器学习的算法称为求解最优化问题的算法。常见的优化算法有以下所示。
- 梯度下降法(Gradient Descent)
- 牛顿法和拟牛顿法(Newton’s method & Quasi-Newton Methods)
- 共轭梯度法(Conjugate Gradient)
- 启发式优化方法
- 解决约束优化问题——拉格朗日乘数法
3. 模型的评估与选择
3.1 测试集:衡量最终模型的泛化能力
通过前面的三个基本要素,我们可以得到一个在训练集上经验风险函数最小的模型。这个模型在训练集上,在经验风险函数的评价指标下是最优的,那么我们是否就直接用这个模型来进行预测,投入使用呢?虽然这个模型对于一直数据的预测效果是最佳的,可是对于新数据的预测能力是未知的,而在新数据上的预测才是最重要的。所以为了衡量通过以上三要素得到的具体模型的泛化能力如何,一般在进行模型训练时,会分离一部分数据作为测试集,目的就是在得到最终的模型之后,评估该模型对于未知的新数据的预测能力如何。
值得一提的是,测试集是最后的底线,除非我们认为已经得到的最优的模型,不再需要修改任何东西了,才回去动用它。而且在测试集上得到的评价反馈也不能用来对模型进行修改了。
3.2 验证集:模型调参,得到最终的模型
前面有了测试集,用于衡量最终得到的模型的泛化能力。那么为什么验证集是干嘛的呢?有什么用?
验证集主要是用来选择模型的,或者说用来选择模型的一些超参数的。在得到最终的模型之前,我们是不能动用测试集的。如果训练集全部用来学习、训练模型,那么就没办法衡量学到的模型在训练集之外的数据上表现如何,那得到的模型只能说是在训练集上最优,没有证据能表明它的泛化能力,也就没法被称为“最优”模型。
举个例子,上面有讲到用x去预测y,模型形式为 y = θ 0 + θ 1 x y=\theta_0+\theta_1x y=θ0+θ1x,那么x与y之间一定是这种线性关系吗?有没有可能是 y = θ 0 + θ 1 x + θ 2 x 2 y=\theta_0+\theta_1x+\theta_2x^ 2 y=θ0+θ1x+θ2x2,或者是 y = θ 0 + θ 1 x + θ 2 x 2 + . . . + θ 1 00 x 100 y=\theta_0+\theta_1x+\theta_2x^ 2+...+\theta_100x^ {100} y=θ0+θ1x+θ2x2+...+θ100x100。如果我们不用验证集,直接在训练集上训练,那么得到的最优的模型一定是 y = θ 0 + θ 1 x + θ 2 x 2 + . . . + θ 1 00 x 100 y=\theta_0+\theta_1x+\theta_2x^ 2+...+\theta_100x^ {100} y=θ0+θ1x+θ2x2+...+θ100x100,然后自然而然地用这个模型作为最终得到的模型。越复杂的模型对训练集的拟合越好。但是这个最优只是针对训练集来说,并不是泛化能力最优,而我们需要的是泛化能力最优的模型。所以在进行训练前,需要把训练集划分成两部分,一部分用于训练,另一部分叫验证集,用于“监控模型”。在上面的回归中,虽然 y = θ 0 + θ 1 x + θ 2 x 2 + . . . + θ 1 00 x 100 y=\theta_0+\theta_1x+\theta_2x^ 2+...+\theta_100x^ {100} y=θ0+θ1x+θ2x2+...+θ100x100得到的经验损失是最小的,但是由于模型过于复杂,学到了很多训练数据的特质,导致模型出现了验证的过拟合,那么在验证集上的表现就会很差,而适当复杂的模型,在验证集上表现最好的那个,将会成为最终模型输出。所以通过验证集,可以有效防止模型过拟合。
再举个例子,一个深度学习模型,假设为一个卷积神经网络模型CNN。有训练轮数epochs,每层的神经元个数等超参数。如何确定这些超参数呢?也是通过监控各种超参的模型在验证集上的表现,在验证集上表现最优的超参数组合将会称为最终的模型。
所以总结一下,验证集一般用于进一步确定模型中的超参数(例如正则项系数、神经网络中隐层的节点个数,k值等),而调这些超参数的目的主要是为了选择泛化性能强的模型,防止模型过拟合。而测试集只是用于评估模型的精确度(即泛化能力)。
3.3 验证集VS测试集
验证集先于测试集使用,比如在实际项目中,对于一个二分类任务。可以选择用逻辑回归去做,也可以用神经网络去做。这两个模型都有超参,通过两者在验证集上的表现,选择合适的超参数,然后我们分别得出了一个最好的逻辑回归模型,也得出了一个最好的神经网络模型。这时候验证集就完成任务了,下一步比较这两个模型就是在测试集上进行最终的PK,看谁的泛化能力强就选择用哪个模型。
这和参加一些机器学习比赛是像的。一般机器学习竞赛会给出训练集,但是测试集的标签是完全隐藏的,你需要提交最终的模型对测试集的预测结果。所以在打比赛时你也不知道自己的模型泛化能力如何。那么如果你只用训练集训练,能训练出一个很完美的模型,这样注定是失败的,因为泛化能力必然差。所以在打比赛时一般会先将训练集划分成用于训练的训练集,以及用于调参的验证集,最后用于衡量泛化能力的测试集。最终在调完参的候选模型中,选择在测试集表现最好的模型用来提交。
3.4 模型的评价指标
值的注意的是,模型学习时的策略与学成的模型的评价指标可以是不一样的。举个例子,在进行二分类任务时,一般选取二元交叉熵作为损失函数,所以学习策略就是最小化训练集上的二元交叉熵。然而训练完之后,用该模型预测,如何评价预测的准不准呢?这时候大多数情况下用准确率accuracy来衡量,而不是用二元交叉熵来衡量模型的性能了。主要是因为,模型的学习厕率一般是要求可微的,因为很多时候最优化问题都涉及对损失函数求导,如果损失函数不可微的话就没法进行最优化求解了。所以像准确率这种指标是不适合用来作为学习策略的,因为不可微,但是因为作为评价指标很直观,所以会作为衡量得到模型的性能的评价指标。