statax
我用Matlab里的BP网络做外推预测,发现效果并不理想。比如以0至1,步长为0.1的11个X值,和相对应的11个值Y训练好了,再用1至2,步长也为0.1的11个X,仿真得到Y的11个预测值,原Y值有明显的趋势,但仿真得到的值不稳定,有时有趋势,有不显明,有时还是波动的。 请问有朋友做过类似的预测吗? 我想用它来作为一种预测方式,与ARMA,趋势线预测等进行比较。但发现BP网这个预测结果不太理想,请问BP网适合做这个吗?
yihui
训练样本太少了吧。
statax
谢谢版主:)
我的数据只有10个,呵呵。不过,我发现训练值对隐层节点个数比较敏感,不同的隐节点结果又不一致了。但训练的误差曲线还是比较好的,都降到了10^(-3)以下了。 不知道该多少样本才可行呢?那我找一个大点样本来试试。不过我还是不太清楚,训练后做判别是合适的,但做外推合不合适呢?
yihui
只看拟合的误差是没有意义的,即使误差为零也不一定有用,几乎所有的数据挖掘和机器学习方法都要看模型的generalization error,也就是模型是否具有推广性,通常用交叉验证(cross validation)或者bootstrap等方式来看。对于你的10个点,你拿一部分作training data,剩下的作testing data,看看预测误差如何。这才是规范的建模步骤。像神经网络这样的模型,你可以无限增大隐藏层,让训练误差无限降低,但那样做是没有意义的。
是否适合外推,在我看来其实是无法严格验证的,因为外推的都是完全未知的,我们用training/testing data,也只是一种退一步的办法,用样本数据来检测是否适合外推,到了实际应用场合,我们要思考的不仅仅是模型本身,更多的是,现实世界中自变量和因变量是否真的存在某种关系,如果本来就是随机的或毫无关联的,那模型拟合再好,做预测/外推都是没用的,这一点,对于任何统计模型都一样。
statax
谢谢斑竹:)
对于你的第一段,我想起来了,就是神经网络有时“过度识别”的问题,就是插值法也可以得到一条线通过所有的点,所以谢谢你的提醒。不过,你说的验证推广性的交叉验证方法我还没听说过呢,可否介绍一下,或推荐一点读物,谢谢。
不过,关于你的第二段,我想到了一个问题。就是神经网络模型做出来的东西有一个缺陷就是解释得比较困难。相对而言,ARMA,时间趋势等,至少可以先从理论上假设一个模型,或者模型的结构解释度,要比神经网络这种“学习”得来的东西好理解一点吧。你觉得呢? 如果这样,神经网络做预测,就成了黑箱预测了。我才开始学呢,不知这个方法别人用得多不多呢?可否借鉴。
yihui
交叉验证的想法很简单——因为无法获知未知的信息来验证模型的正确性,那么只好退而求其次,用已知的样本来验证,当然不能拿所有的样本做模型然后又拿所有的样本作验证,这样就变成仅仅是在看模型的拟合好坏,Cross Validation就是把样本拆分为training data和test data,用训练样本做模型,然后拿剩下的test data来验证模型的预测能力。通常验证一次当然不够,那么就多做几次,每次用不同的训练样本和测试样本,比如可以首先就把样本拆分为10等份,每次拿9份做模型,1份做测试,然后轮换10次。这都是数据挖掘里面很基础的想法。
神经网络本来不关注解释,你完全可以说它是黑箱,我一向觉得这就是数据挖掘和机器学习的特征:不注重中间过程究竟发生了什么(当然每个模型的算法都是很清楚的),不关自变量扔到箱子里究竟怎么走,只要输出的因变量预测正确就够了。至于用的人多不多,答案肯定是多。经典的统计学方法像你说的ARMA那些因为参数模型很清楚很简单,所以对于一些受人脑控制比较严重的学科(如经济学)来说就很吃香,而有些学科本来就和人的感性没有关系,比如物理学,那么就可以用数据挖掘和机器学习的方法,去做“冷冰冰”的建模,而这些模型的优点的确让人无话可说。
statax
哦。。知道交叉验证了。不过,如果验证次数很大,是不是直接编个程序来做要可行一些。这样一来,和做monte carlo或bootstrap有点象了。
另外,我学的就是你说的“受人脑控制比较严重的学科”——经济学。不过象你说的,只要交叉验证足够说明精确,那就是可行的。可以不用多先验理论了吧。其实我想问的是,用神经网络来做外推预测,比如同ARMA,趋势曲线等方法来进行比较,现实中用得多不多呢? 我好象感觉神经网络用来做识别的更多一些,比如医学、图象处理等等,那些识别的训练都是静态的,就是和时间无关,而外推是动态的,和时间有关。打个比方,就是一般的截面数据分析与一般时间序列分析的区别。 所以,我还是问问神经网络用在时间序列外推方面用得是不是比较多,成不成功呢?
yihui
成功率有多高,这个我不得而知,因为我也很少真正参加数据挖掘的项目。总的来说,虽然数据挖掘和机器学习的理论都是包括对连续变量的预测的,但实际应用中还是分类问题(离散变量)占了大多数。
如果训练误差和交叉验证误差都足够小的话,说明模型在某种程度上还是找到了数据背后的规律(不管这种规律在数学表达上是否那么明晰),用来做预测外推应该也是有把握的。
这实际上涉及到了所有统计建模的一个根本问题:数据是否真的由某种规律操纵?客观上存在规律才是我们建模的前提,否则,拿一些毫不相干的数据来,即使再精妙再高深也没用。
statax
[glow=255,red,2]非常感谢管理员斑竹的回复。 让我思维又开阔了不少。[/glow]
llcabcde
关于cross validation在matlab中如何实现呢?
例如如何打乱次序?
yihui
取一部分作训练,剩下的作预测。MatLab忘光了,不过在R里面一个负号就搞定了。