5 个回答
作为一个曾经研究神经网络并且跑过很过很多UCI数据集研究僧,感觉可以给题主分享一些实验的经验。首先分析一下你的问题,从题主的描述中,我感觉题主问题两个方面;
1,数据预处理:相关性预处理,数据量纲预处理
2,训练方法:
1.1 数据量纲可以理解为数据在相应度量单位下的数值;比如温度和高度等度量单位,单位分别为摄氏度和厘米;如果温度度量的是人的体温,那么正常人类的范围是从34-42度之间了;如果高度度量人的高度,那么范围会从30cm—230cm之间了,如果剔除单位,单纯的从数据上来说,很明显身高数据的幅值范围要大而且其数值也更大,所以在相同的处理下,同事乘除同一个系数,身高对于结果的影响要大一些。当然你可以说温度乘以一个大的系数,身高乘以一个小的系数,这种方式来平衡或者抵消量纲的影响,这个确实正确,最小二乘回归分析也是这么处理的,但是这个增加了模型训练的难度,而且大的系数很容易导致过拟合。
其次从面对问题的角度来分析,如果你预测一个人会不会发烧的问题,那么这个时候温度对于结果和影响肯定大于身高,即温度比身高更重要,甚至可以认为身高对于结果是无用变量可以删除;如果你预测一个人的篮球水平,那么这时身高就比温度更重要,以上两种问题中对于温度和身高的分析都是基于我们的常识经验,其实也可以看做一种机理分析,即我们已经先验地知道了问题的因果关系,可以直观的判定变量的作用;然而现实中我们遇到的问题,往往很难做机理分析;更通常的做法是我们通过观察测定了一些对于结果有影响的变量,至于那个变量对于结果是至关重要的我们往往不能够通过经验或者机理分析直接给出,那么这个时候最好的做法就是认为所有变量同样重要,那么体现变量一样重要的普遍做法就是去除量纲,即归一化处理到相同或相近的数值和幅值范围,通常的方法有最大最小值归一化和方差归一化两种,最大最小值归一化把数据归一化到[0,1]或[-1,1]区间,方差归一化更倾向于通过变量自身的离散程度(方差)来自身归一化,此种归一化后的数据范围通常不是[0 ,1]或[-1,1]区间。
1.2 数据相关性,数据相关通常指不同变量(度量维度)之间联系的程度,例如人的身高和体重具有很大的相关性,一般身高高的体重都大;还有就是颜值和受欢迎程度也是相关的;那么如果相关性比较大的两个变量同时出现在数据中,会造成变量的重复使用和数据冗余,假设我们要预测某个省份的gdp,那么通常会在统计局网站中找一些类似人口,用电量,教育投入,高等教育人口比例,消费水平等类似的数据,那么我们假设假设教育投入决定了高等人口比例,即二者之间有因果关系,那么此时如果把上述变量不加处理都扔进去模型中,就等价于教育投入这个变量使用的两次,不仅影响结果,还会增加了计算量 。解决数据相关性问题主要是先计算数据变量间的相关系数,把相关系数高的两个变量提出一个,或者用万金油PCA,不仅能够消除相关性还能够降低维度。
2 训练方法,其实主要指训练过程中的一些trick,网络结构,神经元类型,学习方法,学习率,迭代次数,收敛精度,学习批量,乱序操作,权值初始值,权值惩罚项,权值约束,稀疏性,当然还有很重要的数据量;每个参数的设置都会影响你最终的训练时间和结果,所有参数都设置对了结果不一定好,但是有一个参数设置不好结果一定不好,神经网络就是这么任性的。一个好的模型和参数组合,在不进行数据处理时也可以得到不错的结果;而且同样的模型偶尔也会出现使用原始数据的结果反而比预处理后的结果要好,当然只是偶尔;所以从数据到结果是一个系统,哪一个环节出了问题都得不到很好的结果;如果某一个环节表现特别优异可以在一定程度上弥补其它环节的不足。
上面扯了这么多,来正面回答一下题主的问题。
相关性问题:相关性问题是一个无确定解的问题,特征之间的相关性是否会影响到网络的性能,导致比起特征间独立的情况下性能要差。对于神经网络而言,数据的相关性会影响到网络性能,但是如果训练方法得当,参数选取正确其结果不一定比特征独立差,其次由于神经网络强大的拟合能力,有的数据集在不去除相关性和不使用pca降维时结果要更好,这个要看数据的特点和质量。问题中题主用一个实例是(5,3,6)另外一个是(5.1,3.3,6.1)来描述数据相关性有些不太恰当,从例子来看感觉题主描述的应该是数据分布的密集读或者散布程度;数据异常点的越少,散布越均匀,数据量越大,越能够提高准确性;相反则会导致不好的结果。由于神经网络通常使用监督引导学习,经典的BP算法就是通过预测残差来引导网络学习的,如果数据分布不均匀,那么数据相对密集的地方会产出更多的引导学习,即网络更偏向数据密集的地方拟合,这时对于非密集处的数据就会产生坏的影响,可以理解成拔河,数据密集且多的地方能够把神经网络“拉”(引导)过来。那么解决这种问题最好的方法可以考虑一下svm,如果题主坚持神经网络模型,那么可以尝试增大数据量,通过复制或者插值增加数据相对稀少位置的数据,也可以删除一部分密集处的数据。
归一化的问题:也是一个无固定解的问题;就个人的经验而言大部分情况下归一化比不归一化要好,但是也存在一些特别的数据集,不归一化的情况下反而结果会更好;至于两种归一化方法感觉旗鼓相当了,从经验来说基于最大最小值的[0,1]归一化要稍微好一些。但是图像数据一定要归一化,不归一化结果很烂。所以最终是否归一化,选择哪种归一化方法需要题主用实验来验证你的数据适合哪种情况。
是否对于数据进行乱序操作,要看题主使用的是哪种学习方法了,目前主要分为全批量学习(整个数据集的),子批量学习(mini-batch学习),增量学习(一个一个的学习),题主要是使用全批量学习,数据是否乱序基本没有影响,其收敛曲线较平滑,可以使用稍大一些的学习率;要是使用增量学习,数据乱序会影响结果,这个影响有不确定性,因为增量学习本身就会波动较大,异常值对于此种结果有很大的影响,而且增量学习更容易受到参数设置的影响,所以结果会有更大的不确定性,为了消除波动的影响,建议使用较小的学习率;子批量学习方法,介于增量和全批量学习之间,其原理类似通过子采样来估计整体,建议使用此种训练方法,大多数数据集此种方法能够在最小的训练时间下达到收敛精度,但是不绝对。
通过以上分析,感觉题主要骂娘了,说了半天和没说一样,那个情况都是不绝对,我只能说臣妾冤枉啊,之前在UCI数据上刷数据的时候,被害惨了,只能各种试验,找到每个数据集最适合的处理方法。神经网络是一个系统的工程,之前深度神经网络的学习很多情况下依靠参数的设置,其实就是依靠trick和经验,之前听过一个说法;一个学习几天的本科生和一个研究神经网络的教授都可以用神经网络来解决一个问题,那么这个不同就在于经验和感觉上,可能本科生要得到好的结果要通过蛮力实验更多的次数。感觉这也是神经网络的魅力所在,使用网络模型很简单,只要有数据,不需要机理分析,就可以训练模型,但是模型结果的好坏则需要很多的trick,这也是神经网络简单,同时也不简单的地方了。
最后要多啰嗦一句,从解决问题的角度,感觉题主应该首先基于机理分析,分析一下输入数据,然后去寻找适合的模型,有时候非线性回归和偏最小二乘就可以解决问题;此外简单的模型在修改的时候更加好控制,也具有更大的灵活性;若是其他模型效果都不太理想,在考虑神经网络,因为神经网络多少有些黑箱模型,只要数据量足够,结果不会太差,多少有些暴力。
以上分析均为个人理解,如有遗漏,错误还望大家多多交流,指正,以便共同学习!!