机器学习(4)-应用机器学习的建议_Advice for Applying Machine Learning

来源:互联网 发布:glide源码原理 编辑:程序博客网 时间:2024/05/18 02:13

1、评估学习算法

当机器学习算法运行的不尽如人意时,如何优化?有如下选择

  • 获取更多的训练样本
  • 尝试使用更小的特征集
  • 尝试增加特征
  • 添加多项式项
  • 增大正规化的λ
  • 减小正规化的λ

(1)评价假设函数

将训练集分为两个部分(7:3),数据随机选择,分别作为:

  • 常用训练集(7)
  • 测试集(3)

步骤:

  • 首先使用常用训练集训练模型得到参数θ和Jtrain(θ)
  • 在使用测试集计算产生的误差Jtest(Θ)

不同算法中的测试集误差:

  • 线性回归: Jtest(Θ)=12mtestmtesti=1(hΘ(x(i)test)y(i)test)2

  • 逻辑回归:

    err(hΘ(x),y)=10if hΘ(x)0.5 and y=0 or hΘ(x)<0.5 and y=1otherwise

    Test Error=1mtesti=1mtesterr(hΘ(x(i)test),y(i)test)

(2)模型选择和训练集/验证集/测试集

给出了具有不同多项式度的许多模型(比如一个特征值θ,或两个的二次函数型,或三个的三次函数型,四个…),可以使用系统的方法来识别“最佳”函数。为了选择好的假设模型,可以测试不同多项式度的模型并查看误差结果。
将训练集分为三个部分(6:2:2),最好随机选择:

  • 常用训练集(6) Training set: 60%
  • 交叉验证集(2) Cross validation set: 20%
  • 测试集(2) Test set: 20%

我们现在可以使用以下方法计算三个不同集合的三个单独的错误值:

  • 使用每个多项式度的模型,使用训练集训练,并得到最优的时,Θ的值
  • 使用交叉验证集找到具有最小误差的多项式度d
  • 使用测试集估计广义误差Jtest(Θ(d)),其中d表示上一步得到的误差最小的模型多项式的度

2、算法的高偏差与高方差

高偏差(欠拟合)bias-variance
Jtrain(Θ(d))很大
Jcv(Θ(d))(Jtrain(Θ(d))

高方差(过度拟合)variance
Jtrain(Θ(d))很小
Jcv(Θ(d))>>(Jtrain(Θ(d))

(1)算法误差与假设函数多项式的度的关系

以 误差为纵坐标,横坐标为多项式的度 绘制出函数Jtrain(Θ(d))Jcv(Θ(d))。此时的代价函数没有加入正规化项
Jtrain(Θ(d)) 单调递减
Jcv(Θ(d)) 先减后曾

(2)算法误差与正规化参数λ的关系

以 误差为纵坐标,横坐标为正规化参数λ 绘制出函数Jtrain(Θ(d))Jcv(Θ(d))

Jtrain(Θ(d))单调递增
Jcv(Θ(d))先减后曾

诊断法:

  • 创建一个λ列表 (例如 λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24});
  • 创建一个具有不同度或参数的模型的集合
  • 依次训练模型
  • 使用上面训练出的模型,计算(λ = 0,也就是说纯粹看误差)误差JCV(Θ)
  • 选择在交叉验证集上产生误差最小的最佳组合
  • 使用最佳的Θ 和 λ,计算出Jtest(Θ),观察是否能够很好的泛华的决问题

(3)学习曲线

误差作为纵坐标,训练集样本数m作为纵坐标 绘制出函数Jtrain(Θ(d))Jcv(Θ(d))
在计算过程中,Jtrain(Θ(d))的计算是对于部分训练集的,而Jcv(Θ(d))的计算是对于所有交叉集的。
高偏差(欠拟合)
Jcv(Θ(d))单调递减,并趋近于平缓
Jtrain(Θ(d))单调递曾,并趋近于平缓
可知:在高偏差情况下,增加训练样本对训练无益,所以不必花时间收集数据

高方差(过拟合)
Jcv(Θ(d))一直很大,缓慢递减,并趋近于平缓
Jtrain(Θ(d))一直很小,缓慢递增,并趋近于平缓
以上两者相差很大
可知:在高偏差情况下,增加训练样本对训练有益。

(4)决定接下来如何做

当机器学习算法运行的不尽如人意时,如何优化?有如下选择

  • 获取更多的训练样本 ———— 高方差(过拟合)
  • 尝试使用更小的特征集 ———— 高方差(过拟合)
  • 尝试增加特征 ———— 高偏差(欠拟合)
  • 添加多项式项 ———— 高偏差(欠拟合)
  • 增大正规化的λ 高偏差(欠拟合)
  • 减小正规化的λ 高方差(过拟合)

神经网络的规模与拟合度

  • 小规模神经网络,易出现欠拟合,计算量小
  • 大规模神经网络,易出现过拟合,计算量大

如何选择神经网络层数

  • 将训练集分割成三部分测试那个层次效果最优Jcv最优

3、样例——构建一个垃圾邮件分类器

(1)确定先做什么

给定一封电子邮件的数据集,我们可以为每个电子邮件构建一个向量。该向量中的每个条目表示一个单词。矢量通常包含10,000到50,000个条目,通过查找我们的数据集中最常用的单词来收集。如果在电子邮件中找到一个字,我们将分配其相应的条目1,否则如果没有找到该条目,该条目将为0。一旦我们准备好所有的x向量,我们就会训练我们的算法,最后我们可以用它来分类邮件是否是垃圾邮件。

那么,你如何花时间来提高这个分类器的准确性?

  • 收集大量数据(例如“蜜罐”项目,但并不总是工作)
  • 选择更加复杂的特征(例如:在垃圾邮件中使用电子邮件头数据)
  • 开发预处理算法以不同的方式处理您的输入(识别垃圾邮件中的拼写错误)。

(2)误差分析

解决机器学习问题的推荐方法是:

  • 从一个简单的算法开始,快速实现,并在交叉验证数据的早期进行测试。
  • 绘制学习曲线,以决定是否有更多的数据,更多的功能等可能有帮助。
  • 手动检查交叉验证集中的示例错误,并尝试发现大多数错误发生的趋势。

例如,假设我们有500封电子邮件,我们的算法将其中的100个错误分类。我们可以手动分析100封电子邮件,并根据他们的电子邮件类型进行分类。然后,我们可以尝试提出新的线索和功能,以帮助我们正确地分类这100封电子邮件。因此,如果大多数错误分类的电子邮件是尝试窃取密码的邮件,那么我们可以找到这些电子邮件特有的功能,并将其添加到我们的模型中。我们还可以看到,根据根的变化对每个单词进行分类会改变我们的错误率。

将错误结果作为单个数值非常重要。否则很难评估你的算法的性能。例如,如果我们使用词干,这是将不同形式的同一个单词(fail/failing/failed)视为一个单词(fail)的过程,并将错误率从5%降到3%,那么我们应该把它添加到我们的模型中。但是,如果我们尝试区分大写字母和小写字母,最终将错误率从3%提高到3.2%,那么我们应该避免使用这个特征。

4、偏斜类(skewed classes)

(1)定义

对于癌症分类器的例子,训练逻辑回归模型。y=1,代表得癌症;y=0代表没得癌症。
这时,你将发现在测试集上你将得到1%的误差。

但是我们发现测试集中仅有0.5%的人患癌症。

假设我们的模型是 y=0;也就是说,所有人都没患有癌症。这时你就仅有0.5%的误差了。比机器学习的结果还好?

正类比负类少的多得多情况称之为偏斜类
这时使用分类误差(分类精度)作为评估量度就会出现问题

(2)查准率(Precision)和召回率(Recall)

预测值 真实值 真实值0 1 真阳性(true positive) 假阳性(false positive) 0 假阴性(false negative) 假阳性(true negative)

查准率(Precision)
我们预测为真的数目中,有多少正确的

truepositive1#predictedpositive=truepositivetruepositive+falsepositive

对于癌症的问题代表 1 - 误诊率

召回率(Recall)
所有为真的数目中,有多少被预测为真

truepositive1#activedpositive=truepositivetruepositive+falsenegative

对于癌症的问题代表 1 - 漏诊率

使用查准率和召回率评估偏斜类
对于hθ(x)的划分为1和0的分界值默认为0.5

若分界值提高为0.9,将获得较高的查准率,较低的召回率。(对于例子,误诊率低,漏诊率高)
若分界值提高为0.1,将获得较低的查准率,较高的召回率。(对于例子,误诊率高,漏诊率低)

因此,查准率和召回率一般不会同时最优,两者相互排斥。

若我们折中查准率和召回率来评估算法那么
定义,查准率为P,召回率为R:

F1=2PRP+R

选择F1大的模型

5、使用更大的训练集

在大数据时代,有一个说法,”取得成功的人不是拥有最好算法的人 而是拥有最多数据的人”。
那么这种说法,在什么时候是真,什么时候是假呢?

假设在我们的机器学习问题中,特征值 x 包含了足够的信息,这些信息可以帮助我们用来准确地预测y,则大量的数据集是有效的。

如何判断特征值 x 是否包含了足够的信息:
如果我们使用特征x,去请教这个领域的人类专家,一个人类专家能够,准确或自信地预测出 y 的值吗?特征值 x 是否包含了足够的信息。

如果,你有大量的数据,而且你训练了一种带有很多参数的学习算法。
若你的算法具有好的性能要包含两点:

  • 首先,一个人类专家看到了特征值 x,能很有信心的预测出 y值吗? 因为这可以证明y可以根据特征值x被准确地预测出来
  • 其次,我们实际上能得到一组庞大的训练集并且在这个训练集中训练一个有很多参数的学习算法吗
阅读全文
0 0
原创粉丝点击