Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

机器学习学习算法的评估的改进

$
0
0
作者:Sam(甄峰)  sam_code@hotmail.com

0. 问题的提出:
在构建一个机器学习系统时,如何评估系统的性能?
怎样发现系统的问题所在? 如果选择最有效的改进方向?

这一系列问题在实际工作中非常重要。

举例如下:
在预测房价的机器学习系统训练后,得到一些列参数和一个假设。 但在预测新数据时有较大误差。该如何改进?通常有以下可能的方向:
A. 增加训练样本。
B. 去掉一些特征,以减少参数个数。
C. 找到更多的特征。
D.增加一些多项式特征(如:x1*x1, x1*x2, x2*x2....)
E. 增大正则化参数 lambda.
F. 减小正则化参数 lambda.

改如何选择改进的方向?

1. 机器学习诊断法(Machine Learning diagnostic):
这个诊断法,用来判断和了解机器学习算法哪里出了问题,以及哪些改进方向才是有意义的。

1.1: 准确评估学习算法的优劣
想要改进算法或者说改进假设(hypothesis), 需要先准确的评估算法学习到的假设。

在机器学习算法训练中,希望学习到的参数在应用到代价函数 J()时,J()越小越好。 
但是否意味着 J()越小,学习算法就越好?

有一种情况:在应用训练数据计算J()和误差时,数值很小。 但应用到新的数据时,却效果很差。这就是泛化性差。就是过拟合的结果。

为了及早发现这种情况,可以把数据集(DataSet)分为两部分。---TrainingSet和TestSet. 
分别用来训练和测试。数据比例通常是70% 和30%。

首先使用TrainingSet训练出参数。 在用这个参数推理出TestSet. 看J_test()或者正确率如何。 

J_Training()是代价函数应用到TrainingSet上的数值。
J_Test()是代价很熟应道到TestSet上的数值。


1.2:偏差和方差(Bias / variance):
当一个学习算法表现不佳时,通常有几种可能性:
A. 偏差较大(欠拟合)。
B. 方差较大(过拟合)。

如果能够很快确认是高偏差(High Bias)还是高方差(High Variance)。即可快速找到有效的改进方法。

先通过实际例子,感受一下产生高偏差高方差原因




underfit(欠拟合):主要是因为假设太简单,或者神经网络中神经元太少。 导致TrainingSet的数量再多,也没法很好的拟合。导致高偏差。

overfit(过拟合):主要是假设太复杂,或神经网络中神经元数量太多(w太多)。而TrainingSet数量又太少。不足以找到正确的规律。导致高方差。


高偏差或者高方差有什么特点呢?

还是以上一个例子分析:



当维度较小时,J_Training()或者说错误率较高,因为假设太简单,无法很好的拟合数据。同样,J_Test()也很高。

当维度合适时,假设可以较好的拟合数据。泛化性也较好。J_Training()和J_Test()都不高。

当维度太大时,J_Train()很低,但泛化性不好,所以J_Test()较高。

所以总结下来:
High Bias(高偏差)时,J_Training()较高。J_Test()也很高。 主要原因是假设太简单。
High Variance(高方差)时,J_Training()比较小,J_Test()却很高。主要原因是相对数据量,假设太复杂。



1.3: 学习曲线(Learning curves)
学习曲线是种判断方法,让我们方便的测试当前学习算法训练出的假设是处于高偏差,高方差还是两者皆有。

学习曲线的思路就是:改变TrainingSet 数据的个数m. 查看m与J_Training() J_Test()之间的关系。以确定当前处于那种状态。

如果曲线呈以下情况:


分析:
A.TrainingSet数量m很小时,比如1和或者2个数据。很容易拟合。所以J_Training()很小。 可此时,肯定没有获取正确的规律,所以J_Test()一定会很大。
B. 随着m增长,J_Training()会增加。J_Test()会减小。
C. 如果随着m增加,J_Training()和J_Test()都很大,且相差不多。如图所示。说明此时欠拟合。高偏差。
这时,增加样本数量,J_Training()和J_Test()不会有多大变化。因为是假设太简单,没法学习如此复杂的信息。




如果呈现以下曲线:

分析:
A.TrainingSet数量m很小时,比如1和或者2个数据。很容易拟合。所以J_Training()很小。 可此时,肯定没有获取正确的规律,所以J_Test()一定会很大。
B. 随着m增长,J_Training()会增加。J_Test()会减小。
C. 如果随着m增加,J_Training()增大,但相对较小,J_Test()很大,远大于J_Training()。如图所示。说明此时过拟合。高方差。
这时,随着增加样本数量,J_Training()和J_Test()会响应改变。因为原始是相对于假设,数据太少,信息量不够,需要跟多数据。


2. 改进方法的选择:
既然知道了高偏差和高方差,也知道了何种原因导致。所以就可以知道:

A. 增加训练样本。 对高方差有效。
B. 去掉一些特征,以减少参数个数。 对高方差有效。
C. 找到更多的特征。 对高偏差有效(尤其是假设太简单时)
D.增加一些多项式特征(如:x1*x1, x1*x2, x2*x2....)  对高偏差有效。
E. 增大正则化参数 lambda. 对解决高方差有效。
F. 减小正则化参数 lambda. 对解决高偏差有效。

3. 神经网络与欠拟合,过拟合的关系
当神经网络的隐藏层和其中的神经元很少时(小神经网络), 参数很少,容易出现欠拟合。

当神经网络的隐藏层和神经元较多时,参数很多。训练数据太少时,容易出现过拟合。

越大型的网络,性能会越好。但计算量会加大。 


4. 图像分类在神经网络应用中的思路:
图像分类在神经网络的应用中,如何构建网络,如何优化网络的思考:
A.特征数量,通常固定。(HOG/LBP)
B. 因为神经元太多时,计算量会比较大。所以隐藏层数量,神经元数量都从小往大尝试。
C. 把DataSet分为三部分: TrainingSet1(占20%)。 TrainingSet2(占50%), TestSet(占30%)
D. OpenCV ANN_MLP没有正则项参数。所以不考虑。

训练过程:
1. 从小神经网络开始,使用TrainingSet1开始训练。(训练轮次不要太高。以节约训练时间). 若出现欠拟合。则增加神经元和隐藏层。
2. 逐渐复杂网络,直到出现过拟合。则使用TrainingSet1+TrainingSet2训练。
后期再调整网络复杂度。直到平衡。










 

Viewing all articles
Browse latest Browse all 158

Trending Articles