V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
LittleUqeer
V2EX  ›  Python

重新比较 SVM,决策树以及 Adaboost 模型预测大盘准确率

  •  
  •   LittleUqeer · 2016-12-20 15:30:11 +08:00 · 3736 次点击
    这是一个创建于 2924 天前的主题,其中的信息可能已经有所发展或是发生改变。
    经过和坛子里的朋友友好讨论以后,我决定还是把样本按照时间序列切除一下,把最后 100~228 行数据拿出来不放在训练和测试集里分割,做一个样本外测试集来 score 一下比较比较模型效果,看看这样做了以后,我们 3 个模型的表现。


    先来三发帖子回顾:

    使用 SVM 预测大盘涨跌: https://uqer.io/community/share/584f652f6740ec004f2bd542
    使用决策树预测大盘涨跌: https://uqer.io/community/share/5853f6bd954fa20047b771e3
    使用 Adaboost 预测大盘涨跌: https://uqer.io/community/share/58541c566a5e6d0051dc33f5




    测试模型稳健性的结果发现,只剩下决策树这个最简单的模型表现得还稳健一些了(果然简简单单才是真吗?),然而对样本外测试的准确率也从对样本内测试的 0.9 跌到了 0.8 左右。而 adaboost 和 SVM 的预测准确率就在那里上下波动,上下波动……一点都不听话。

    为啥 adaboost 和 SVM 在那里光波动不听话呢?它光不听话也就算了。它不光不听话,预测准确率还很有规律地要么高,要么低,也不是单纯地上下摆动。而且预测准确率极低的时候吧,和决策树对比,准确率相加恰好为 1 ,为毛相加以后准确率恰好为 1 呢?这到底是为什么呢?我怎么想都想不明白。

    哎呀好气啊。:(


    查看完整源代码请戳: https://uqer.io/community/share/58557c8a954fa20050b77496


    根据论坛里朋友的建议,我按照时间周期重新生成了 3 个数据集,训练集,测试集,周期后测试集,来共同判断准确率。

    我选用前 1900 个数据分割训练集和测试集, 1900 个数据的时间点以后的 328 来个数据预留出来,用来做时间周期后测试。

    接下来先来比较 adaboost 的,然后是决策树的,最后是 SVM 的。


    神奇的事情发生了……在时间点以后的数据的预测上,决策树的准确率是 0.21 ,与其他两个模型形成了鲜明对比……
    啊不对, 0.21+0.79 = 1 ,有可能, SVM 的预测在时间点的最后 300 来个数据上,恰好和另外两个模型相反了。
    看来我又得调用参数重要性图了……



    不对! SVM 哪来的参数重要性图啊?

    adaboost 和决策树的确有参数重要性这一说, SVM 是投射到高维平面上进行切割,何来参数重要性一说呢?生成 SVM 的参数重要性这件事,臣妾做不到啊……

    只能过猜了, SVM 的预测,在最后这 300 来个样本外数据上,加起来得 1 ,有很大的可能,是因为与另外两个模型的预测恰好相反,也有可能,只是凑巧了,这个准确率次为 0.21 只是瞎猫碰到死耗子了。为了验证,咱这次稍微改改数据集,把时间参数点的位置稍微调一下,重新跑一下模型再测测吧……

    这次又是样本外数据相加为 1 了……但是……等一下!现在不站队的是 adaboost 了! SVM 和决策树预测准确率比样本内还高了!这不科学……

    看来这是逼我画图啊,好吧。



    对 AdaBoost 画图了以后,发现以下几个现象:

    1 、准确率随着训练集数量的增加趋于稳定。
    2 、准确率要么很高,要么很低,几乎不在中间停留。
    3 、准确率在对最后一个数据的预测为 0
    为了进一步猜测,接下来我把 3 个模型的预测准确率图都画出来吧……


    横坐标数量表示目前我们样本内数据是前多少个数据。

    发现一个有趣的事,对于时间点以后的数据, SVM (绿线)和决策树表现的曲线差不多,中间有微小波动,其中 SVM 线一直是平滑变动,在样本内数据达到 2100 个(样本外数据只剩最后 28 个)时, SVM 的预测能力开始缓慢下降,渐渐达到了接近 0.2 这个极低的准确率,然后又在最后一个数据的时候准确率变动到了 100%……我认为这时候应该是大盘指数的表现恰好和 30 天前的数值上下波动,由于我们的判断就是简单的 30 个交易日以后的收盘指数是否大于今天的收盘指数,所以当指数小幅波动,一会儿超过 30 天前的,一下又大于 30 天前的时候,模型预测就没啥意义了。更改方式很简单,在预测的时候,定一个阈值,必须超过之前指数加上这个阈值,设定 True ,低于这个指数减去阈值,设定 False ,否则设定 None 就好。

    顺便说一下……鉴于上面说的哪个没有加阈值的,脑残的 True , False 设定,所以单独测试一天的准确率是毫无意义的。必须测定一段周期内的准确率,所以可以认为最后那几个突然变动的线可以抹去了。
    既然这样的话,那我就设定预留至少 100 个数据,这样增加计算准确率的可靠性,以防最后的因为数据太小准确率突变,再生成一次图。


    这次我们发现:

    1 、对于样本外数据,决策树的表现持续不错,最低也有 0.78 ,没有剧烈震动。甚至随着数据集的增加,对样本外数据的预测还略微增加了。
    2 、 SVM 和 AdaBoost_score 就不行了,震动很剧烈。
    3 、 SVM 和 AdaBoost_score 在每次变化两个数据的情况下, score 的变化是要么和决策树的判断相同,要么相反。希望有兴趣的朋友可以讨论一下这到底是为什么。
    4 、目前来看,要预测大盘指数是可行的,在比较的 3 个模型中,决策树还是更靠谱点的。
    5 、使用的样本外数据是分割的样本时间点以后, 100~228 个数据进行的 score 。有兴趣的朋友可以切割得更久远一些,也就是说模型不光预测未来短期内的数据,试试预测未来长时间的涨跌准确率。个人倾向于认为市场上的重要性因子会随着时间变化,需要定期更新模型,当然,也不排除有一些重要性因子是始终辣么重要的……有兴趣的朋友可以在数据提取的时候,选择一个更长周期的数据,中间切割个几百天,让样本外数据距离测试数据的距离更远,然后再试试不同模型的预测准确率。本人这里只试验了 3 个模型,当抛砖引玉吧。


    最后我又按照周期, 100 天为单位,预测准确率,发现随着时间节点的改变,准确率的变化如图所示。
    看来预测大盘这事跟时间周期确实有很大的关系啊。


    查看完整源代码请戳: https://uqer.io/community/share/58557c8a954fa20050b77496
    2 条回复    2016-12-21 17:13:55 +08:00
    enenaaa
        1
    enenaaa  
       2016-12-21 10:25:15 +08:00
    预测大盘指数是可行的? 别逗。
    LittleUqeer
        2
    LittleUqeer  
    OP
       2016-12-21 17:13:55 +08:00
    @enenaaa 比掷骰子强:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:12 · PVG 17:12 · LAX 01:12 · JFK 04:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.