目标:针对25000条影评和好评、差评标签,设计神经网络进行训练和预测
目录
1、初始构建
2、降低噪音
3、效率提升
4、进一步降低噪音
分析:权值变化背后的意义
1、构建简单的3层神经网络(输入,1隐藏,输出)进行训练和预测
第一次构建的想法:好评和差评区别就是,词出现的频率不一样。一些词出现的频率高就是好评,另外一些词出现的频率高就是差评。因此,集合所有训练评语中出现的词,然后统计好评、差评、所有评语中这些词的词频,利用构建的3层神经网络挖掘词频和评价的相关性。
一开始:统计每个评论里面各个词出现的次数,作为神经网络的输入进行训练。
直接预测,50%(跟我们想象中一致,猜中是对半概率)
(1)第一次训练:learning_rate = 0.1
现象:效果很不好,推测可能是学习率太大,导致在最小值左右震荡。
对策:减小learing_rate数量级
(2)第二次训练:learning_rate = 0.01
现象:正确率还是50%左右
对策:继续减小learning_rate数量级
(3)第三次训练和测试:learning_rate = 0.001
现象:正确率提高,但收敛很慢,而且正确率也不理想
对策:再找其他办法,看看是不是初始思路错误;或者研究单个案例,看看哪里出了问题
2、增加信号,减少噪声
对问题的设计本身:按出现次数加权,加入了很多噪声
看下所有评论出现的词,发现有类似空格' '这样的词也参与了统计。
再分析其中一个案例发现,统计出现次数多的甚至时一些没有什么感情色彩很中性的词: the that school等。这些无关的词出现次数多,因此权重也很大,对模型产生了误导。
解决方法:去掉词语的加权影响,只要出现就为1,不出现就为0。再次作为输入,训练神经网络。
代码修改:
结果:训练和测试的正确率提升,并且收敛速度也加快
3、去除神经网络中的低效
去除那些神经网络能做的,但对结果没有任何效果的操作。
(1)输入0的部分,不需要进行乘法、相加。
(2)1乘以任何值都是本身,所以乘法也省去,直接改成加法。
代码修改:
结果:运行速度大大提高,训练速度从100/s到600/s,测试速度从500/s到1000/s
如果训练进行两次迭代的话,正确率提升:
4、进一步减少噪声,增强信号
挖掘类似于挖金矿,神经网络时挖掘机,有时候效果不好是挖掘机的问题,但也可能是挖掘的地方有问题。
(1)继续分析,发现提升的办法:剔除大量出现的无预测性的点
我们从源头来看,之前是把评论中每个词都做为输入训练神经网络。现在,我们升级一下。
用好评中最常出现的词,和,差评中最常出现的词,作为输入。
看pos_neg_most.common,大量的字位于中间,没有感情色彩,不具有预测性。而两边很少的词才是最重要的。
因此,我们可以剔除中间这些不具有预测性的词,提高预测的准确性和计算速度。
再看下面一张图:这是所有词出现频率的统计,可以看到本语料库很极端,有一些词出现的次数非常多,另外一些出现非常少。
方法:去掉特别高频和特别低频的,用剩下的进行预测。下图中最左边突起其实主要就是上图中中间部分的累加。
(2)实现
设置2个变量,min_count和polarity_cutoff。min_count用来限制,达到这次次数,才会被放在vocab里面,然后对vocab中的进一步筛选,pos_neg_ratio.most_common()<-polarity_cutoff或者>polarity_cutoff的部分保留,中间不相关的大部分词去掉。
实现:
1)min_count = 20, polarity_cutoff = 0.05
表现:速度大大提高,训练和测试误差有小幅度提升
2)min_count = 20, polarity_cutoff = 0.8
表现:速度大大提高,测试结果基本一致
分析:速度加快的原因是,polarity_cutoff更大,去掉的数据更多,参加计算的数据更少,模型训练的更快。
数据量加倍的话,如果不想花更多的时间,可以通过类似的办法缩短时间。这样的结果会更好,因为覆盖的数据量范围更广。
5、分析:权重变化背后的意义
神经网络直观表示
下面两张图表明,同种类型的词对输出数据有同样的影响,也就是权重类似。