最近没发新文的原因:
- 工作很忙,早出晚归
- 正忙着做这个活
实验结果:
说实话,我真没想到可以实现这种效果,反正比预想的好,( 也只是怀着玩玩的心情 = = ),
大部分的差价都在百位左右,少数差价在千位以上和十位以下
思路和步骤:
1.调用爬虫,爬一点需要的数据
2.抓住重点,例如这里,我只用到了比较中心的区域的数据,例如:浦东、徐汇、闵行、黄埔、静安
3.分析数据:
-
查看数据的描述,分别都有多少种类,每个数据的类型(数字还是类别\多分类标签)。如果是数字,可以直接进行神经网络的运算,只需要简单地归一化;如果是多分类,例如,
房型
:2室1厅、1室1厅 、3室2厅等等,则需要进行映射,使得数据变为onehot编码。 -
可视化探索,例如下图就展示了,地理位置与价格和收藏人数的关系:
可以看到,这个总体关系是呈放射状的,中心区域收藏人数很多(圈圈越大说明收藏人数越多),价格也相对高(越红越高) -
利用一些简单的模型进行分析,例如:LR回归,均方差,随机森林,k均值,支持向量积 等等,大致估计一下效果。如果可以使用神经网络进行训练,那效果肯定是要比上述方法都好,才体现出神经网络的优越性。
-
分析上述方案的loss和结果,分析方法,查看训练效果。
这里肉眼就能归纳出数据的某些分布特征,自然,机器也是能用某种规则去分析影响价格的因素,并且给出一个结果的。
先用统计学中的线性关系去看看 单位价格
和各类信息
的线性关系:
可以看到,自然地,总价格和单位价格的线性相关性很高(这个在预测中肯定是要去掉的),其次是纬度、近地铁、房屋面积,收藏人数等等。
神经网络和相关系数的区别就在于,神经网络可以从更高的纬度去进行映射,但是相关系数是线性的,只能查找数据间二维的关系。
神经网络的优点在于高维映射,但是缺点
也在于高维映射。
例如:某个需要研究的对象倘若有4个特征,那么2维只需要(至少)16个有效数据(有效数据当然越多越好),4维则需要256个有效数据(假如这些特征都和该研究对象紧密关联)可以想象,当特征变多时,维度越高,整个空间都变得稀疏了(例如一张纸上,画了1000个点,看起来相当密密麻麻,但是在一个三维空间里,这张纸不过是一个薄片,上面的点甚至对一个三维空间来说,求极限等于->不存在点)
所以增加特征的同时,需要增加数据量,但是数据量不是人能决定的,需要销售的房子就是只有那么多,数据大小是受到现实的需要和限制。此时,就需要筛选出最有效的特征们。
此时可能会有人拍脑袋,噢,那肯定选相关系数高的,在这里,那就是这三个:
选择这三个特征,然后去掉其他的就好了。
很可惜这样的想法,是低维生物的想法,前面说了,相关系数是线性的,只能查找数据间二维的关系。在低维里不那么相关的信息,可能在高维里又不为人知地高相关了。低维相关的数据,确实对预测过程会有较大的影响
在将数据进行整理:
- 去除空白数据,或者是将空白数据置为平均值,或者中位数
- 去除不需要的列,例如:总价格 ,显然,总价格和房屋大小,就决定了单位价格,不能留
- 将数字列留下,将表示类别的列做onehot映射(例如,
房型
:2室1厅、1室1厅 、3室2厅等)
刚开始的数据:
最后得到一个这样的数据:
训练:
最后丢到MLP网络里尝试着训练:
第一次:
很一般,而且无论如何,val_loss(验证集损失) 都在10位数以上,结果的精度只能达到千的级别,而且有少量预测偏差的数据。
第二次:
以为第一次是因为训练数据不足,又加入了奉贤,长宁等地区的数据,使得总的数据量达到了4万条,但是训练效果不仅很差,而且甚至没有收敛,val_loss(验证集损失) 小小地下降后,又急速地上升了。
一般这种情况:
- 过拟合,loss一直在小小地下降,但是val_loss(验证集损失)下降后上升,有可能是因为模型太复杂了。这个可以通过加入:
Dropout(0.1)
丢弃神经元链接概率,activity_regularizer=regularizers.l1(0.05),
施加在输出上的正则项,
kernel_regularizer=regularizers.l2(0.05),
施加在权重上的正则项 来解决。 - 特征不相关,上面这些特征根本和【单位房价】没关系,所以根本不能得到收敛的结果,这就像你搜集一百年以来的天气,也许连明天的天气都无法预测一样。但是这不可能,因为第一次训练证明,是可以收敛的,即使效果不那么好。
- 训练的迭代epoch太多。这个不至于,看了下,大约20个epoch就过拟合了,不正常。
第三次:
回到了第一次的数据集,这一次仔细检查了特征,发现1.2万条 房型
数据中,有一些例如:6室1厅,3室0厅等等类型,总共数量只有不到40个,但是有10个类型。这说明这种数据算是异常数据,不能加入正常的训练,可能会干扰整个训练过程,造成很大的偏差(一只老鼠坏汤典例)MLP网络很简单,同时也很容易受干扰。另外又排除了一些其他的多分类问题的干扰,重新开始了训练。
这一次收敛了,但是精度只能达到千的级别,不太满意,loss在
1
10
1^{10}
110左右,算不上多好。
第四次:
所以进行了第四次训练,这次,又进行了一波数据清洗和特征工程(一些有经验的专家,可以通过特征工程和特征筛选,实现某些强精度分类器)。
当然我不是有经验的专家,我随便洗了下,意外发现效果还不错?
这里在100个epoch后loss达到平稳,训练集之所以train_loss大于val_loss,主要还是训练集占了80%,总数较大,验证集占了20%,总数较小,均方差总额也比较小。
虽然有小波动,但是总体不会持续下降了,波动都是较为偶然的(可能只是刚好训练集和测试集数据某次迭代接近了,不具备普适性了)
查看loss情况:
查看验证结果:
针不戳,收摊!