一、模型的基本框架
__init__
添加参数:
+统计min_count
+阈值polarity_cutoff
pre_process_data
只分析频次大于min_count & 比例大于polarity_cutoff阈值的单词
- 算法关键点:反向传播过程中分两步 error+errorterm(delta)
梯度下降的计算:对y_hat的偏导的负数(相减更新权重)
y_hat−y
权重更新的符号是负号
- 权重的初始化
- 判断分类是否正确
分类正确时对应特定概率
- 标签为Pos时,概率>0.5
- 标签为Neg时,概率<0.5
二、模型优化
- 反馈调整:区分信号与噪声
数据挖掘:有时候问题不在于挖掘机,在于选择挖掘的位置/方向
作者的思路
避免无关信息的权重影响:权重统一设置为1
me思路
删除无关符号/单词:耗费力气,且治标不治本
“本”:神经网络的结构设置
+节点设置
+网络连接方式
- 单词频次出现的次数@二阶统计
比如最频繁出现的单词频次为336713,但观察后发现这个频次数只出现1次:可能是普遍存在的噪音,比如空格号,冠词the等
而频次(某个数字)出现最高的次数为27656,对应频次为1:即只出现一次的单词,比如电影中的人名
三、经验:代码规范
- 知识点-编程
collections.Counter()
自动统计单词列表中的频率:生成字典
.most_common()
map(lambda , )
行列级操作:map针对读取的每一行文本进行lambda操作
- 知识点-数学
内积表示相似性
统计-TSNE
相似性:距离按照t分布——>形成右侧的相似性矩阵
非线性降维
特征工程:数据转化
三类词:中性词,pos,neg
比例:用来体现倾向性,以1为分界;转化为log后,以0为分界
- 编程技巧
命名:对象清晰+操作直观
lay_n_input
lay_n_output
lay_n_error(y−y_hat)
lay_n_delta(δ)
添加判断:针对明显的前提
1)状态属性
assert(len(training_reviews) == len(training_labels))
2)存在归属
if(word in self.word2index.keys()):
运行时间统计
start = time.time()
全局变量慎用
定义全局变量后,中途数据类型的改变(标量——>列表)会引起错误
注意用类中定义的函数和属性:需要添加self.内存管理
事先知道变量的维度时:给变量分配预存空间,并进行初始化@lay_0
(而不是边创建,边开辟新的空间@list.append())优化数据运算:针对0-1变量(开关数据)
0属于无关运算
1的统计:直接相加
四、经验:反省
任何事情/解决问题等的第一要点
认识、了解对象-
你以为的对象是你以为的那样吗?
mlp.pos_neg_ratios_cutoff.most_common()
返回对象:元组的列表(不是表示第一列的单词:而是第一个元组) enjoy探索的过程@80%工作在于数据整理
作者的思路
- 基于初始的思路:调整某些设置(完成后再迭代优化)
- 用几个实验的样例:验证自己的思路 逻辑是否正确
噪声占权重太大,覆盖有效信号